ZetCode

JavaScript delete 关键字

最后修改于 2025 年 4 月 16 日

在本文中,我们将展示如何使用 JavaScript 中的 delete 关键字删除对象属性。

delete 关键字

delete 运算符从对象中删除一个属性。如果删除成功,它返回 true,否则返回 false。该运算符只影响对象自身的属性,而不是继承的属性。

delete 适用于对象属性,而不是变量或函数。它不能删除使用 varletconst 声明的变量。对于数组,它删除元素但保持长度不变。

删除后,访问该属性将返回 undefined。该属性已从对象中完全删除,而不仅仅是设置为 undefined。

基本属性删除

以下示例演示了 delete 运算符的基本用法。

main.js
const person = {
    name: 'John',
    age: 30,
    occupation: 'Developer'
};

console.log(person.name); // John
delete person.name;
console.log(person.name); // undefined

此代码从 person 对象中删除 name 属性。删除后,访问该属性将返回 undefined。该属性已从对象中完全删除。

$ node main.js
John
undefined

删除不可配置的属性

某些属性无法删除,因为它们是不可配置的。

main.js
const obj = {};
Object.defineProperty(obj, 'prop', {
    value: 42,
    configurable: false
});

console.log(delete obj.prop); // false
console.log(obj.prop); // 42

此示例显示了无法删除不可配置的属性。delete 操作返回 false,并且该属性保留。内置对象通常具有不可配置的属性。

$ node main.js
false
42

删除数组元素

delete 运算符可以删除数组元素,但会留下一个空洞。

main.js
const fruits = ['apple', 'banana', 'cherry'];
delete fruits[1];

console.log(fruits); // ['apple', empty, 'cherry']
console.log(fruits.length); // 3

删除数组元素时,长度保持不变。该元素被删除,但留下了空槽。要完全删除,请使用 splice 而不是 delete

$ node main.js
[ 'apple', <1 empty item>, 'cherry' ]
3

删除全局变量

创建时未声明的全局变量可以被删除,但已声明的变量则不能。

main.js
// Implicit global (no var/let/const)
x = 10;
console.log(delete x); // true

// Declared variable
let y = 20;
console.log(delete y); // false

这显示了隐式全局变量和已声明变量之间的区别。只有全局对象的属性(隐式全局变量)可以被删除。已声明的变量是不可配置的。

$ node main.js
true
false

删除函数参数

在严格模式下,不能删除函数参数,但在非严格模式下可以。

main.js
function test(param) {
    console.log(delete param); // false in strict mode
    console.log(param); // remains
}

test('value');

函数参数被视为局部变量。在严格模式下,尝试删除它们会抛出错误。在非严格模式下,它会默默地失败。

$ node main.js
false
value

删除继承的属性

delete 运算符仅影响自身属性,而不是继承的属性。

main.js
const parent = { prop: 'value' };
const child = Object.create(parent);

console.log(child.prop); // 'value'
console.log(delete child.prop); // true (but doesn't affect parent)
console.log(child.prop); // 'value' (still inherited)

这表明 delete 仅删除自身属性。即使它返回 true,继承的属性仍然可访问。父对象的属性未被触及。

$ node main.js
value
true
value

删除后检查属性是否存在

删除后,in 运算符和 hasOwnProperty 会反映更改。

main.js
const obj = { prop: 'exists' };
console.log('prop' in obj); // true

delete obj.prop;
console.log('prop' in obj); // false
console.log(obj.hasOwnProperty('prop')); // false

这些方法可以正确识别何时删除了属性。它们与检查 undefined 不同,因为属性可能存在该值。

$ node main.js
true
false
false

来源

delete - 语言参考

在本文中,我们演示了如何使用 delete 关键字从 JavaScript 中的对象中删除属性。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

查看 所有 JavaScript 教程。