梗概
- 彻底移除属性(真正删除),但并不会释放内存(还得等垃圾回收)
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()。