窗口中的“varName”和窗口中的varName都返回true

时间:2014-01-31 07:56:48

标签: javascript

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

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

是否存在某种类型强制,或者JavaScript将a存储为字符串和窗口中的变量?

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

2 个答案:

答案 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。