Javascript &引用;varName";在窗口中和在窗口中的varName都返回true
在JavaScript中,为什么以下两个都返回trueJavascript &引用;varName";在窗口中和在窗口中的varName都返回true,javascript,Javascript,在JavaScript中,为什么以下两个都返回true > var a; undefined > "a" in window; true > a in window; true 是否存在某种类型的强制类型,或者JavaScript是否将a作为字符串和变量存储在窗口中 请随意重写这个问题的标题-我不确定如何准确描述这个令人困惑的现象 否,您声明了一个名为a的变量,该变量初始化为未定义。此变量是全局变量,因此可以作为全局对象(窗口)的一种属性进行访问,因此: 这就是为什么窗口中
> var a;
undefined
> "a" in window;
true
> a in window;
true
是否存在某种类型的强制类型,或者JavaScript是否将a
作为字符串和变量存储在窗口中
请随意重写这个问题的标题-我不确定如何准确描述这个令人困惑的现象 否,您声明了一个名为
a
的变量,该变量初始化为未定义
。此变量是全局变量,因此可以作为全局对象(窗口)的一种属性进行访问,因此:
这就是为什么窗口中的“a”是正确的。它类似于window.hasOwnProperty('a')代码>。相似,但不是同一件事
您所做的第二次检查(a in window
)被计算为undefined in window
,值undefined
被字符串化,因此表达式最终被计算为'undefined in window'
,该值始终为真。
我承认,这是令人困惑的,因为未定义的既是一个值又是一个属性,这是没有意义的。这只是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如何解析变量名和表达式。当你说
"a" in window
javascript在窗口对象中查找名为a
的属性,因此返回true
为了
正如@Ootegem所指出的,a的计算结果为undefined
,因此返回true。我这样做了-第一个返回false,第二个是ReferenceError
。这是因为b是未定义的,并且您的控制台计算表达式的方式(一个精心设计的eval
系统),它无法扫描范围并创建一个新的隐含全局。。。但这不是重点。我并不生气,但我想知道为什么你接受了在我之后贴出的答案,包含的信息较少,只是完整地引用了我的答案,当然-a在窗口中
评估a
。哼!感谢您的解释。当未定义
用作属性名称时,它会隐式转换为字符串,该字符串恰好是未定义的
。因此,窗口中的未定义
相当于窗口中的“未定义”
。Nit 1:窗口中的未定义
起作用,因为它相当于窗口中的“未定义”
——正是属性名称的字符串化使其起作用。也就是说,undefined
(值)不是属性,但“undefined”
是。Nit 2:null
是属性,而不是对象typeof
在这里有误导性——正如它返回函数对象的“function”
,但返回数组对象的“object”
。。这正是typeof
的工作原理。@user2864740:在两个细节上:我不反驳/不这么说。或者至少,我从来没有想过。我将编辑undefined
位的字符串化以使其更清晰,但我添加了window.undefined
哪种类型的字符串化表示undefined在a in window
案例中是字符串化的。。。关于null是一个对象
:我明确指出这是历史原因,不是因为null
是一个对象。我没有说这个答案是错误的(事实上我投了赞成票),我只是想说一些更好的细节——对于那些真正关心这类问题的人:|@user2864740:我并不想遇到所有的防御性问题,只是想澄清一下,我不想说任何其他的话。把你的评论放在心上,编辑我的答案以避免任何混乱。
"a" in window
a in window