为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 704 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号