在使用for-in循環時,返回的是所有能夠通過對象訪問的、可枚舉的(enumerated)屬性,其中既包括存在於實例中的屬性,也包括存在於原型中的屬性。屏蔽了原型中不可枚舉屬性(即設置了[[DontEnum]]標記的屬性)的實例屬性也會在for-in循環中返回,因為規定,所有開發人員定義的屬性都是可枚舉的——只有IE除外。
IE的JScript實現中存在一個bug,即屏蔽了不可枚舉屬性的實例屬性不會出現在for-in循環中。例如:
1 var o = { 2 toString: function () { 3 return "My Object"; 4 } 5 } 6 7 for (var prop in o) { 8 if (prop == "toString") { 9 alert("Found toString"); //在IE中不會顯示 10 } 11 }
當以上代碼運行時,應該會顯示一個警告框,表明找到了toString()方法。這里的對象o定義了一個名為toString()的方法,該方法屏蔽了原型中(不可枚舉)的toString()方法。在IE中,由於其實現認為原型的toString()方法被打上了[[DontEnum]]標記就應該跳過該屬性,結果我們就不會看到警告框。該bug會影響默認不可枚舉的所有屬性和方法,包括:hasOwnProperty()、propertyIsEnumerable()、toLocaleString()、toString()和valueOf()。有的瀏覽器也為constructor和prototype屬性打上了[[DontEnum]]標記,但這並不是所有瀏覽器共同的做法。