在JavaScript中,为什么均为以下返回true?窗口中的“varName”和窗口中的varName都返回true
> var a;
undefined
> "a" in window;
true
> a in window;
true
是否有某种类型强制的事情,或做的JavaScript店a
既是一个字符串,并在窗口中的变量?
请随时重写这个问题的标题 - 我不确定如何描述这种令人困惑的现象。
在JavaScript中,为什么均为以下返回true?窗口中的“varName”和窗口中的varName都返回true
> var a;
undefined
> "a" in window;
true
> a in window;
true
是否有某种类型强制的事情,或做的JavaScript店a
既是一个字符串,并在窗口中的变量?
请随时重写这个问题的标题 - 我不确定如何描述这种令人困惑的现象。
细节当你说
"a" in window
的JavaScript查找一个名为a
窗口对象的属性,因此返回true
。
对于
a in window
如@Ootegem注意到,因此一个的计算结果为undefined
返回true。
哦,当然 - 'a在窗口中* *评估*'a'。咄!谢谢你的解释。 – flossfan
那么发布相同答案的意义何在? – Triode
当'undefined'被用作属性名时,它被隐式转换为一个字符串 - 恰好是'undefined'。因此'在窗口中未定义“相当于在窗口中'未定义'。 – user2864740
不,您声明了一个名为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对此事
Nit 1:'在窗口中未定义的作品,因为它相当于' '在窗口中未定义' - 这是使其工作的属性名称的字符串。也就是说,'undefined'(值)是* not *属性,但是'undefined''是。 – user2864740
Nit 2:'null'是一个[* primitive * value](http://es5.github.io/#x4.3.2),* not *一个对象。 'typeof'在这里有误导 - 正如函数对象返回'“function”一样,但是Array对象返回''object'..这就是'typeof'的工作原理。 – user2864740
@ user2864740:在这两点上:我不反驳/说不。或者至少,我从来没有这样想过。我将编辑“未定义”位的字符串更清晰,但我添加了'window.undefined',这意味着未定义字符串在'a in window'的情况下... On null是'object' :我清楚地表明,这是由于历史原因,不是因为'null'是一个对象 –
我做了 - 第一个返回false,第二个是'ReferenceError'。 – flossfan
这是因为b是未定义的,以及您的控制台评估表达式的方式(精心设计的'eval'系统),它无法进行范围扫描并创建新的隐含全局...但这不仅仅是重点。不是说我冒犯了,但是我想知道为什么你接受了我以后发布的答案,包含的信息较少,只是引用了我的答案完整性 –