JavaScript delete运算符从对象中删除属性,它将释放对被删除属性持有的对象的所有引用。
在本文中,我们将研究如何使用 delete 运算符以及它在不同情况下的行为。
基本使用
要使用 delete 操作符,只需在要删除的任何属性表达式之前写入 delete 即可。
例如,我们有对象:
const obj = {
a: 1,
b: 2
};
然后我们需要删除属性 a:
delete obj.a;
或者
delete obj[\'a\'];
返回值
delete 操作符对于所有情况都返回 true,除非删除的属性是自己的不可配置属性。
如果我们试图删除一个属于自身不可配置属性的属性,则将以非严格模式返回 false。
特点
如果我们要删除的属性不存在,则 delete 将不执行任何操作并返回 true。
如果对象的原型链中存在相同名称的属性,则删除后该对象将使用原型链中的属性。
不能从全局作用域或函数作用域中删除用 var 声明的任何属性。
不能删除全局范围内的任何函数。
function foo() {
var a = 1;
return a;
}
delete foo // false
foo() // 1
同样,任何带有 let 和 const 的属性都不能从定义它们的范围中删除。
无法删除不可配置的属性。因此,来自内置对象(如 Math、Array 或 Object)或任何创建为不可配置的属性的属性不能被删除。
var obj = {
a: 1
}
Object.freeze(obj) // 冻结obj
delete obj.a // 删除属性a无效
console.log(obj) // { a: 1 }
不可配置的属性意味着我们不能更改它们的属性描述符。
严格模式
如果我们尝试在严格模式下删除变量,则会收到语法错误。
非严格模式
如果我们尝试删除变量,则非严格模式将返回 false。
删除数组元素
我们可以对数组元素使用 delete,该元素将从数组中删除,但长度不会改变。
例如,如果我们有:
const arr = [1, 2, 3];
delete arr[1];
然后我们得到:
[1, empty, 3]
当我们记录长度时,将得到3。
如果我们使用 in 运算符检查索引是否存在,如下所示:
const arr = [1, 2, 3];
delete arr[1];
console.log(1 in arr);
我们得到了 false。
如果数组元素存在,但是有一个未定义的值,我们应该将其设置为 undefined,而不是使用 delete 操作符。
如我们所见,在数组上使用 delete 是古怪的。因此,如果我们要通过索引删除数组条目,则应该使用 splice:
const arr = [1, 2, 3];
arr.splice(1, 1);
splice 的第一个参数指定我们要删除的数组元素的索引。第二个参数是我们要从第一个参数指示的索引开始删除的元素个数。
然后,当我们再次登录 arr 时,我们得到:
[1, 3]
总结
delete操作符用于从对象中删除属性,如果属性是自己的且可配置的,那么它将起作用。
否则,它将在非严格模式下返回 false,并在严格模式下引发SyntaxError。
它不应与数组一起使用,因为它的行为不一致。
日常工作中你有使用过 delete 操作符吗?
本头条号聚焦大前端技术和程序员成长,如果对你有所启发和帮助,可以点个关注、收藏,也可以留言讨论,这是对作者的最大鼓励。
作者简介:Web前端工程师,全栈开发工程师、持续学习者。