JavaScript中delete操作符对变量与属性的删除限制

1次阅读

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

JavaScript 中 delete 操作符对变量与属性的删除限制

delete 操作符在 JavaScript 中只能删除对象的可配置(configurable)属性,** 不能删除变量、函数声明、参数,也不能删除全局对象上通过 var 声明的属性(在非严格模式下会静默失败,严格模式下报错)。

delete 不能删除变量(包括 var/let/const 声明)

变量绑定(如 var a = 1let b = 2const 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.globalLetundefineddelete 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 === 31 in arr === false
  • 这不是“置为 undefined”,而是彻底移除该索引的属性;若想留 undefined,应写 arr[1] = undefined
text=ZqhQzanResources