2013-01-08 17 views
10

當您運行在瀏覽器下面的代碼,或在Node.js的,你得到的意見所列的預期成果:爲什麼是null和未定義類型的DOMWindow?

Object.prototype.toString.call(undefined); // "[object Undefined]" 
Object.prototype.toString.call(null); // "[object Null]" 

當您在PhantomJS的代碼,但是,輸出爲[object DOMWindow]在這兩種情況。

這似乎很奇怪,因爲undefinednull都是原生類型。該typeof運營商似乎工作,因爲它在其他環境(包括typeof null === "object"怪癖)做,所以它會出現PhantomJS並至少有不確定型的概念:

typeof undefined; // "undefined" 

它還聲稱,Object.prototype.toString包含本地代碼,這可能表明Phantom本身沒有做任何修改實現的東西(我不知道是否是這種情況 - 但我沒有找到任何有用的源代碼):

Object.prototype.toString.toString(); // "function toString() { [native code] }" 

那麼爲什麼PhantomJS不使用(或至少暴露)正確的[[Class]]屬性值爲nullundefined,有沒有辦法改變這種情況?我知道我可以使用不同的方法來確定類型,但我寧願不必。

+6

這聽起來像一個錯誤。 – SLaks

+0

@SLaks - 是的,這是我的第一個想法,但它不是這是不尋常的或很少發現的代碼...我非常懷疑我是第一個遇到它,但我沒有找到任何參考它在問題跟蹤器的任何地方。 –

+0

出於好奇:你試圖解決什麼樣的問題或哪種情況受到這種行爲的影響? –

回答

7

它是兩件事的組合。一個腳本在網頁中執行,因此全球的對象是window對象,從證明:

console.log(this.toString()); // [object DOMWindow] 

此外,還有與該版本JavaScript實現的,其歪曲下的對象原型鏈問題以上條件。

這可能會在未來版本中修復。

+0

感謝您提供正式答案:)我注意到全局對象是'window',並且假設它與它有關,但是通過挖掘源代碼Phantom和JSC都很乏味,沒有讓我到任何地方。 –

+1

PhantomJS或JSC有問題嗎? –

+0

隨着年齡的增長,每個優秀的bug都會變得更好 - 您可以更新任何進度嗎? – Olga

-1

如果只是這兩種類型,我認爲你可以用這個包圍你的問題。

Object.prototype.toString = function(obj){ 

    if(typeof(obj) == "undefined"){ 
     return "[object Undefined]"; 
    } 

    if(typeof(obj) == "null"){ 
     return "[object Null]"; 
    } 

    return obj.toString(); 

} 
+2

正如我在我的問題中所說的,我知道我可以改變我得到這種類型的方式,但我寧願不必。另外,你的代碼不會工作,因爲你已經失去了需要的本地方法而不是'obj.toString()'調用。還要注意'typeof'是一個運算符,而不是一個函數,它返回'null'的'object'(這是我在問題中提到的怪癖)。 –

+0

請更正您的答案'typeof null ==='object'' – Olga

0

我承認我是那種深遠這裏,但MDN article on Object.toString()提到:

在JavaScript啓動1.8.5的toString()呼籲空返回[對象空],和不確定的回報[對象未定義],如ECMAScript第5版和隨後的勘誤中定義的。見Using toString to detect object type

鏈接的部分然後描述您正在使用的構造Object.prototype.toString(null)。所以它似乎能夠合理地將字符串化爲nullundefined是一種新的(-ish)添加/更正Javascript,PhantomJS引擎(Apple的JavaScriptCore,誰知道哪個版本)尚未實現。也就是說,這在Safari 6中可以正常工作,因此可能需要將此報告爲缺陷,並要求符合ES5。

相關問題