我总是错误地认为in
运算符正在检查属性的undefined
值。快速查看ES5 specification表明in
运算符最终会调用[[GetProperty]]
,这将返回属性的值。
为什么将foo.bar
设置为undefined
时,in
运算符返回true
,而当foo.bar
从未设置时false
为undefined
1}},即使它们的值都为var foo = {
bar: undefined
};
'baz' in foo
// -> false
'bar' in foo
// -> true
?
foo.bar
相关:typeof foo['bar'] !== 'undefined' vs. 'bar' in foo
相关问题询问何时undefined
永远不会设置为{{1}}。
答案 0 :(得分:3)
注意:在研究问题时我找到了答案,因为我已经花了时间,所以我决定发布我发现的内容。
他们返回不同值的原因是[[GetProperty]]
调用[[GetOwnProperty]]
,这不会返回属性值。 [[GetOwnProperty]]
返回一个Property Descriptor,它描述了属性是否可枚举,可写和它的值。
当您在问题中将undefined
设置为bar
时,会创建属性描述符*,[[Value]]
为undefined
。当为[[GetOwnProperty]]
调用bar
时,将返回属性描述符,而使用baz
时,将返回undefined
。这意味着[[GetProperty]]
会返回bar
的已定义值,然后[[HasProperty]]
返回true
,而不是false
。这反过来又使in
运算符返回true
。
* 这是谎言,但为了简单起见。
注意:以下数字会尽可能链接到规范参考
对于:'bar' in foo
'bar'
会给出字符串'bar'
GetValue
'bar'
将返回值'bar'
foo
会提供参考foo
GetValue
foo
将返回'foo'
的值,我们的对象Type
的值foo
是一个对象,没有异常抛出'bar'
的toString
返回字符串'bar
,调用[[HasProperty]]
[[GetProperty]]
返回Property Descriptor(不是undefined
)[[GetOwnProperty]]
返回属性描述符(不是undefined
)foo
拥有名为bar
的属性,不返回undefined
foo.bar
undefined
并设置[[Writable]]
undefined
,因此不要返回false