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

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

undersource.js源碼中nonEnumerableProps函數作用

undersource.js源碼中nonEnumerableProps函數作用

慕的地8271018 2018-09-04 18:19:13
看undersource.js源碼中nonEnumerableProps函數貌似是為了把對象中不可遍歷的屬性加入key返回,而源碼注釋中提到ie9以下枚舉bug,測試過hasEnumBug值都是為false,那collectNonEnumProps函數就不會被執行了,其次~返回這些不可遍歷的屬性值應該沒有什么用處吧~再者為什么要單獨處理constructor屬性,相關源碼如下:function collectNonEnumProps(obj, keys) {    var nonEnumIdx = nonEnumerableProps.length;    var constructor = obj.constructor;    var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;    // Constructor is a special case.    var prop = 'constructor';    if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);    while (nonEnumIdx--) {      prop = nonEnumerableProps[nonEnumIdx];      if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {        keys.push(prop);      }    }  }
查看完整描述

1 回答

?
MYYA

TA貢獻1868條經驗 獲得超4個贊

Underscore 源碼中,hasEnumBug 的值來源于下面這句話,順便把 noEnumerableProps 那句也貼出來

var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');var nonEnumerableProps = 
['valueOf', 'isPrototypeOf', 'toString',                      
'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];

在 IE8 中親測結果為 true

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

然后來看看通過 for ... in 循環在兩個瀏覽器(IE8 和最新的 Chrominum 核心瀏覽器)中的效果,也就是 hasEnumBug 為 true 和 false 情況下的效果

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

collectNonEnumProps 干的事情就是在 hasEnumBug 為 true 的情況下,把那些不能枚舉出來的對象屬性(比如上例中的 toString)補充到 keys 中去。


查看完整回答
反對 回復 2018-10-28
  • 1 回答
  • 0 關注
  • 727 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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