我们这里有一些讨论删除的抽象问题,但我正在寻找实际的例子来说明何时使用delete
,而不是像将属性设置为null或undefined。
在某个挑战中,什么情况下使用delete
是最好的解决方案,而不是其他方法?
我们这里有一些讨论删除的抽象问题,但我正在寻找实际的例子来说明何时使用delete
,而不是像将属性设置为null或undefined。
在某个挑战中,什么情况下使用delete
是最好的解决方案,而不是其他方法?
for (var key in obj) {
// ...
}
null
,它们的键将包含在其中。通过使用delete
,您可以完全删除它们的键。Object.defineProperty(Object.prototype, "Incognito", {
get: function() { return 42; },
set: function() { },
configurable: true
});
console.log(({}).Incognito); // 42
({}).Incognito = null;
console.log(({}).Incognito); // 42
// I DO NOT WANT INCOGNITO
delete Object.prototype.Incognito
console.log(({}).Incognito); // undefined
如果某个属性有一个空的setter(因为有人认为这是个好主意),如果你想要摆脱它,就需要将其删除。
var hash = {
"FALSE": undefined,
"TRUE": null
}
console.log("TRUE" in hash); // true
console.log("FALSE" in hash); // true
delete hash.FALSE;
console.log("FALSE" in hash); // false
< p > in
运算符返回任何存在的属性的 true
值,无论它的值是什么。如果你想要它返回 false
,你需要 delete
属性。
在这两种情况下,将其设置为 null
或 undefined
都不起作用(因为它要么有一个什么都不做的 setter,要么就是 in
运算符的工作方式)
delete
而不是将变量/属性设置为null
的好处是什么。 - jAndy.defineProperty
)没有太多意义。 - jAndynull
或 undefined
仍会使该属性可枚举 - 如果你在任何阶段对对象进行 for...in
遍历,并且存在属性是重要的,那么这就是你想使用 delete
的时候。for...in
一起生成 HTML 属性),你将需要使用 delete
删除不相关的属性:function ChildWidget(kwargs) {
kwargs = extend({
childSpecific1: null, childSpecific2: 42
}, kwargs || {})
this.childSpecific1 = kwargs.childSpecific1
this.childSpecific2 = kwargs.childSpecific2
delete kwargs.childSpecific1
delete kwargs.childSpecific2
ParentWidget.call(this, kwargs)
}
inherits(ChildWidget, ParentWidget)
delete
操作符在重置或清除方法中非常有用,可以删除与表单相关的对象字面数据:
delete formmap["forms"]
它还可以用于删除与状态相关联的对象:
/* lights... */
if (node["alpha"+i].active)
{
// camera, action
node["beta"+i] = chi;
}
else
{
/* cut! */
delete node["beta"+i];
node["omega"].state = false;
}
var foo = {"bar": [], "drink": [], "tab": [] }
// happy hour
this.bar && (foo["bar"]).push(this.bar) || delete foo.bar;
// open a tab
this.drink && (foo["drink"]).push(this.drink) || delete foo.drink;
// cheers
this.tab && (foo["tab"]).push(this.tab) || delete foo.tab;
最后,通过使用类型特定实例属性的可写权限作为试金石,它是一种区分类型的有用方式:
// Function
!!foo.prototype === true && delete foo.length === false && delete foo[-1] === true
// Object, Number, Infinity, or Boolean (probably Object)
!!foo.prototype === false && delete foo.length === true && delete foo[-1] === true
// Array
!!foo.prototype === false && delete foo.length === false && delete foo[-1] === true
// String
!!foo.prototype === false && delete foo.length === false && delete foo[-1] === false
// RegExp
delete foo.source === false
参考资料