在JavaScript中,为什么以下都返回true?
> var a;
undefined
> "a" in window;
true
> a in window;
true
是否存在某种类型强制,或者JavaScript将a
存储为字符串和窗口中的变量?
请随意重写这个问题的标题 - 我不确定如何描述这种令人困惑的现象。
答案 0 :(得分:6)
不,您声明了一个名为a
的变量,该变量初始化为undefined
。此变量是全局变量,因此可以作为全局对象(窗口)的排序属性进行访问,因此:
var a = {};//an obejct
var b = {};//another
b === a //false, two separate objects, of course but
window.a === a;//true
这就是'a' in window
为真的原因。它与window.hasOwnProperty('a');
类似。类似,不一样。
你做的第二次检查(a in window
)被评估为undefined in window
,反过来值undefined
被字符串化,因此表达式最终被评估为'undefined in window'
,永远都是真的
我承认,这很令人困惑,因为undefined
既是一个值又是一个属性,这实际上没有意义。这只是JS中你必须学会生活的怪癖之一。您可以这样验证:
window.hasOwnProperty('undefined');//true
window.undefined;//undefined of course
window.hasOwnProperty('null');//false
typeof null;//object (really! But it is actually a primitive
typeof undefined;//undefined
null
是出于历史原因的对象,但我不打算给你“ECMAScript的完整历史”,只是想你可能想知道这一点。
你必须记住的是JS如何解析变量名和表达式。 I've explained this many times, see this answer and all of the links at the bottom了解此事的详情
答案 1 :(得分:2)
当你说
时"a" in window
javascript在window对象中查找名为a
的属性,因此返回true
。
对于
a in window
a评估为undefined
,如@Ootegem所述,因此返回true。