2014-01-31 34 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'是一個對象 –