9

我想我在IE的(IE8)處理for-in JavaScript語句時發現了一個錯誤。經過幾小時將其燒成一個小例子後,它看起來像IE特意跳過任何在for-in循環中稱爲「toString」的屬性 - 無論它是在原型中還是屬於該對象的「Own屬性」。for-in JavaScript語句中的IE8錯誤?

我已經把我的test code here

function countProps(obj) { 
    var c = 0; 
    for (var prop in obj) { 
     c++; 
    } 
    return c; 
} 

var obj = { 
    toString: function() { 
     return "hello"; 
    } 
}; 

function test() { 
    var o = ""; 
    var d = document.getElementById('output'); 

    o += "<br/>obj.hasOwnProperty('toString') == " + obj.hasOwnProperty('toString'); 
    o += "<br/>countProps(obj) = " + countProps(obj); 
    o += "<br/>obj.toString() = " + obj.toString(); 

    d.innerHTML = o; 
} 

這將產生:

obj.hasOwnProperty('toString') == true 
countProps(obj) = 1 
obj.toString() = hello 

但在IE中,我得到:

obj.hasOwnProperty('toString') == true 
countProps(obj) = 0 
obj.toString() = hello 

的任何這種特殊的外殼名爲'toString'的屬性破壞了我的代碼,試圖將方法複製到Function.prototype中 - 我的cu stom toString函數總是被跳過。

有沒有人知道解決方法?這是某種怪癖模式行爲 - 還是隻是一個BUG?

回答

10

是的,這是一個錯誤。見this answer

引用CMS

另一個公知的JScript錯誤是「DontEnum錯誤」,如果在其範圍鏈的一個對象包含屬性不是枚舉(具有{DontEnum}屬性)時,如果屬性被遮擋在其他對象時,它會留作爲不可枚舉,例如:

var dontEnumBug = {toString:'foo'}.propertyIsEnumerable('toString'); 

它將評估對IE false,則此使用時會引起問題的用於-i的n聲明,因爲屬性不會被訪問。

+1

感謝引用我的回答,我將發佈一些解決方法的問題在其他線程 - 和可能更多的實現bugs-;) – CMS 2010-09-14 02:31:32

+0

感謝。因此,與JavaScript規範相反,這是用戶定義的屬性不可枚舉的情況。是否有所有這些屬性的列表,所以當dontEnumBug爲真時,我可以爲我的代碼添加一個特殊的測試? – mckoss 2010-09-14 06:12:11

+0

我更新了我的測試代碼: http://startpad.googlecode.com/hg/labs/js/misc/tostring.html 解決方法應專門測試名爲toString,toLocaleString,valueOf ,構造函數和isPrototypeOf,來自我對IE8的測試。 – mckoss 2010-09-14 20:11:23

2

這是IE中的一個錯誤,也適用於名爲valueOf的屬性。

你可以解決它是這樣的:

if(obj.toString !== Object.prototype.toString || obj.hasOwnProperty("toString")) 
    //Handle it 
if(obj.valueOf !== Object.prototype.valueOf || obj.hasOwnProperty("valueOf")) 
    //Handle it 
+1

它也適用於其他人。這裏有一個列表:https://developer.mozilla.org/en/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug – 2010-09-14 01:03:43

+0

有同樣的問題與包括。 如果(obj.includes!== Object.prototype.includes || obj.hasOwnProperty( 「包括」)){// handleit } – 2017-05-05 09:18:08