亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

js屏蔽不可枚舉屬性的實例屬性不會出現在for in循環中?

js屏蔽不可枚舉屬性的實例屬性不會出現在for in循環中?

白板的微信 2019-02-05 15:23:04
var o = {    toString: function () {        console.log("ok")    }};for (var key in o) {    if (key == "toString") {        alert(key);    }}高程3中第153頁上面有這段代碼。他說IE中屏蔽不可枚舉屬性的實例屬性不會出現在for in循環中,就是說上面不會有彈窗,但是我在IE 5 7 8都測試了,都會彈窗,這個bug是被修復了還是怎么樣
查看完整描述

1 回答

?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

1.MSDN上這么說:

Internet Explorer 8 does not include enumerations of properties that have the same name as built-in properties of a prototype object. All document modes in Internet Explorer 9 include these properties in the enumeration.

大意是IE8對于與原型內置屬性同名的屬性(這里的原型指Object)不進行枚舉,IE9則認為這些屬性是可枚舉的。

toStringObject的內置屬性,所以不枚舉,沒有問題;

2.StackOverflow上有個類似的問題,提問者在實際使用過程中發現了同樣的問題

I've run into a very odd issue with IE8's JS engine (possibly previous versions as well, but NOT IE9 in IE8 mode since the JS engine doesn't fallback). Simplified example:

var foo = { toString : 42, x : 22 };for(var n in foo){ 
    console.log(n)
}// result: "x"

答案結論類似,不過更詳細地指出了實現原理是DontEnum屬性:

In IE < 9, JScript will skip over any property in any object where there is a same-named property in the object's prototype chain that has the DontEnum attribute.

MDN上對DontEnum的說明,指出其是在ES3初次實現,后來在ES5中改了名字。

https://img1.sycdn.imooc.com//5c62732600010b8b06810216.jpg

ES3發布是在1999年,處于IE5的更新時間內。

https://img1.sycdn.imooc.com//5c6273280001dd2108000179.jpg

https://img1.sycdn.imooc.com//5c62732a00010d2608000459.jpg


答案還給了個MDN的連接,可惜不能訪問了,google快照也查不到。不過答案中提到了一個詞叫"JScript DontEnum Bug",根據這個去搜索可以查到一些結果,以及幾個SO的問題,結論類似。

綜上我們可以判斷,這個bug是的確存在過的,影響范圍是IE4(不確定)~IE9之間所有IE瀏覽器。

至于沒有測試成功,原因就不清楚了。我也不會下個IE5去測試??赡鼙恍迯土税桑海?/p>


查看完整回答
反對 回復 2019-02-12
  • 1 回答
  • 0 關注
  • 560 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號