var anObject = {left: 1, right: 2};
console.log(anObject.left);
// → 1
delete anObject.left;
console.log(anObject.left);
// → undefined
console.log("left" in anObject);
// → false
console.log("right" in anObject);
// → true

所以,我不明白的是,在删除属性left
之后,当console.log("left" in anObject);
向我们显示它没有显示时,它会返回未定义的内容。是否存在?
如果delete
从对象中删除属性left
,则表示该属性不再存在,对吧?但是,如果我们看到undefined
,则意味着该属性仍然存在但没有价值,对吗?
来自Eloquent JavaScript本书:
将属性设置为undefined和实际的区别 删除它是在第一种情况下,对象仍然具有 属性(它只是没有一个非常有趣的值),而在 第二种情况,财产不再存在,将返回 假的。
答案 0 :(得分:2)
从本书的同一章开始,我们发现:
读取不存在的属性 会产生值
undefined
,这是我们第一次尝试阅读wolf
时发生的上一个例子中的属性。
它引用的wolf
示例在这里:
var day1 = {
squirrel: false,
events: ["work", "touched tree", "pizza", "running",
"television"]
};
console.log(day1.squirrel);
// → false
console.log(day1.wolf);
// → undefined
day1.wolf = false;
console.log(day1.wolf);
// → false
答案 1 :(得分:0)
undefined
应表示未为给定对象定义的键的值。例如,如果我的目标是:
var foo = {a: "bar"};
我尝试访问其不存在的属性b
,我将获得undefined
:
console.log(foo.b); // -> undefined
同样,如果删除属性a
,我之后会收到undefined
:
console.log(foo.a); // -> "bar"
console.log("a" in foo); // -> true
delete foo.a;
console.log(foo.a); // -> undefined
console.log("a" in foo); // -> false
进一步阐述:本书说,对象上不存在/已删除的属性与值为undefined
的属性之间存在差异。例如,我可以手动将foo.a
设置为undefined
。请注意,区分这两者的唯一方法是通过in
运算符:
foo.a = undefined;
console.log(foo.a); // -> undefined
console.log("a" in foo); // -> true
delete foo.a;
console.log(foo.a); // -> undefined
console.log("a" in foo); // -> false
答案 2 :(得分:0)
console.log(anObject.left);
未定义是预期的行为,因为没有属性。 False是一个返回值,这意味着实际上有一个属性。
console.log("left" in anObject);
在这里你问'是否留在了对象中?'此函数的返回值只是true或false。如果“left”的值为'false',则返回true!