Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript &引用;varName";在窗口中和在窗口中的varName都返回true_Javascript - Fatal编程技术网

Javascript &引用;varName";在窗口中和在窗口中的varName都返回true

Javascript &引用;varName";在窗口中和在窗口中的varName都返回true,javascript,Javascript,在JavaScript中,为什么以下两个都返回true > var a; undefined > "a" in window; true > a in window; true 是否存在某种类型的强制类型,或者JavaScript是否将a作为字符串和变量存储在窗口中 请随意重写这个问题的标题-我不确定如何准确描述这个令人困惑的现象 否,您声明了一个名为a的变量,该变量初始化为未定义。此变量是全局变量,因此可以作为全局对象(窗口)的一种属性进行访问,因此: 这就是为什么窗口中

在JavaScript中,为什么以下两个都返回true

> 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