在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'系統),它無法進行範圍掃描並創建新的隱含全局...但這不僅僅是重點。不是說我冒犯了,但是我想知道爲什麼你接受了我以後發佈的答案,包含的信息較少,只是引用了我的答案完整性 –