梗概

  • 彻底移除属性(真正删除),但并不会释放内存(还得等垃圾回收)
  • delete 的核心作用:完全从对象中移除属性,使 in 操作符返回 false,并从 Object.keys() 中消失。
  • 对比赋值 undefined:将属性设为 undefined 只是清空值,但属性仍然存在。
const obj = { name: 'Alice', age: 30 };
obj.age = undefined;
delete obj.name;
 
console.log(obj.age); // undefined(值被清空)
console.log('age' in obj); // true(属性仍存在)
 
console.log(obj.name); // undefined
console.log('name' in obj); // false(属性被彻底删除)

delete不能删除的东西

  • 变量(使用 var和const 声明的变量,let可以):全局作用域下使用 var 声明的变量是不可删除的,因为它们成为了全局对象的不可配置属性。
var a = 10;
delete a; // false
console.log(a); // 10
  • 函数声明:函数声明创建的函数名同样是不可删除的。
function foo() {}
delete foo; // false
console.log(typeof foo); // "function"
  • 对象原型链上的属性delete 只能删除对象自身(own property)的属性,继承自原型链上的属性不能被删除。
const obj = {};
delete obj.toString; // true,但其实没有删掉原型上的toString方法
console.log(obj.toString()); // 仍然正常调用
  • 非配置属性:对于对象中不可配置(configurable: false)的属性,delete 无法成功删除。
const obj = {};
Object.defineProperty(obj, 'x', {
  value: 42,
  configurable: false
});
delete obj.x; // false
console.log(obj.x); // 42

delete关键字使用注意事项

  • 在严格模式 ('use strict') 下,尝试删除不可删除的属性或变量会抛出错误,而非静默失败。
  • delete 不影响变量或函数绑定,只能作用于对象属性。
  • 使用 delete 删除数组元素时,仅会将对应索引位置变成稀疏(empty slot),不会改变数组长度。
const arr = [1, 2, 3];
delete arr[1];
console.log(arr.length); // 3
console.log(arr[1]); // undefined (empty slot)
  • 如果想从数组中移除元素并且改变长度,应使用数组方法如 splice()