delete 只能删除对象可配置属性,不能删除变量、函数、参数或全局 var 声明的属性(非严格模式静默失败,严格模式报错);对 let/const 声明抛出 ReferenceError;删除数组元素会形成稀疏数组而非置 undefined。

delete 操作符在 JavaScript 中只能删除对象的可配置(configurable)属性,** 不能删除变量、函数声明、参数,也不能删除全局对象上通过 var 声明的属性(在非严格模式下会静默失败,严格模式下报错)。
delete 不能删除变量(包括 var/let/const 声明)
变量绑定(如 var a = 1、let b = 2、const c = 3)不属于对象属性,而是词法环境中的绑定。delete 对它们无效:
-
var x = 10;→delete x返回false(非严格模式),严格模式下直接抛出TypeError -
let y = 20;或const z = 30;→ 无论是否严格模式,delete y都抛出ReferenceError(因为未声明引用)或SyntaxError(部分引擎提前报错)
delete 只能删除对象自身的可配置属性
只有对象自有、且其属性描述符中 configurable: true 的属性才能被成功删除:
-
const obj = {a: 1};→delete obj.a返回true(默认可配置) -
Object.defineProperty(obj, 'b', { value: 2, configurable: false});→delete obj.b返回false,且不报错 -
delete obj.toString返回false(继承自原型链,非自有属性)
全局作用域下的特殊行为(仅限浏览器环境)
在浏览器中,全局作用域的 var 声明会成为 window 对象的可配置属性(但 let/const 不会):
立即学习 “Java 免费学习笔记(深入)”;
-
var globalVar = 'ok';→delete window.globalVar返回true,且变量访问变为undefined -
let globalLet = 'no';→window.globalLet是undefined,delete window.globalLet无意义且返回false - 注意:
delete globalVar(不带window.)仍等价于删变量绑定,不是删属性,因此无效
数组元素不能用 delete“清空”为 undefined?
delete arr[0] 确实会把对应索引设为 empty(即稀疏数组),但长度不变,且该位置 in 检查为 false:
-
const arr = [1, 2, 3]; delete arr[1];→arr变成[1, empty, 3],arr.length === 3,1 in arr === false - 这不是“置为
undefined”,而是彻底移除该索引的属性;若想留undefined,应写arr[1] = undefined






























