2014-01-31 36 views
0

在JavaScript中,为什么均为以下返回true?窗口中的“varName”和窗口中的varName都返回true

> var a; 
undefined 
> "a" in window; 
true 
> a in window; 
true 

是否有某种类型强制的事情,或做的JavaScript店a既是一个字符串,并在窗口中的变量?

请随时重写这个问题的标题 - 我不确定如何描述这种令人困惑的现象。

+0

我做了 - 第一个返回false,第二个是'ReferenceError'。 – flossfan

+0

这是因为b是未定义的,以及您的控制台评估表达式的方式(精心设计的'eval'系统),它无法进行范围扫描并创建新的隐含全局...但这不仅仅是重点。不是说我冒犯了,但是我想知道为什么你接受了我以后发布的答案,包含的信息较少,只是引用了我的答案完整性 –

回答

2

细节当你说

"a" in window 

的JavaScript查找一个名为a窗口对象的属性,因此返回true

对于

a in window 

如@Ootegem注意到,因此一个的计算结果为undefined返回true。

+0

哦,当然 - 'a在窗口中* *评估*'a'。咄!谢谢你的解释。 – flossfan

+0

那么发布相同答案的意义何在? – Triode

+0

当'undefined'被用作属性名时,它被隐式转换为一个字符串 - 恰好是'undefined'。因此'在窗口中未定义“相当于在窗口中'未定义'。 – user2864740

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对此事

+0

Nit 1:'在窗口中未定义的作品,因为它相当于' '在窗口中未定义' - 这是使其工作的属性名称的字符串。也就是说,'undefined'(值)是* not *属性,但是'undefined''是。 – user2864740

+0

Nit 2:'null'是一个[* primitive * value](http://es5.github.io/#x4.3.2),* not *一个对象。 'typeof'在这里有误导 - 正如函数对象返回'“function”一样,但是Array对象返回''object'..这就是'typeof'的工作原理。 – user2864740

+0

@ user2864740:在这两点上:我不反驳/说不。或者至少,我从来没有这样想过。我将编辑“未定义”位的字符串更清晰,但我添加了'window.undefined',这意味着未定义字符串在'a in window'的情况下... On null是'object' :我清楚地表明,这是由于历史原因,不是因为'null'是一个对象 –