我怎么能理解这个JS问题?

时间:2017-11-18 15:36:07

标签: javascript object ecmascript-6 undefined-behavior



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和实际的区别   删除它是在第一种情况下,对象仍然具有   属性(它只是没有一个非常有趣的值),而在   第二种情况,财产不再存在,将返回   假的。

3 个答案:

答案 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)

JS中的

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!