在js中for_in主要是用来遍历对象的可枚举属性,包括原型链上的属性。然而for_in在IE < 9下可能会出现问题。
for_in要出现问题必须满足两个条件:1:IE < 9;2:某些不可枚举的属性被重写。
在js中当一些不可枚举的属性比如toString被重写后,它会变成可枚举。然而当你碰上了IE<9,这些被重写的属性依旧
是不可枚举无法使用for_in去遍历。那么如何在IE<9的情况下去搜集这些被重写的不可枚举属性。
思路:一、先重写一个不可枚举属性并用propertyIsEnumerable去检测是否可枚举来判断是否是IE < 9;二、将不可枚举的属性组成数组以待后续遍历;三、先拿到对象的原型,constructor属性要单独检测,至于为什么,个人感觉是因为并不是所有对象都有constructor,只有通过构造函数得到的对象才有该属性,检测constructor属性,在排除原型链的情况下判断对象上是否具有constructor属性并且得到的属性数组中
不包含constructor。其他属性,主要是从不可枚举的属性数组中遍历,判断属性数组中是否包含此属性并且该属性属
于该对象并且原型上的该属性不等于该对象上此属性。
underscore.js中给出以下方法。一、首先定义hasEnumBug来判断是否是IE<9var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');//返回false二、然后列出IE<9下不能用for in来枚举的key值集合var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];三、最后搜集方法var collectNonEnumProps = function(obj, keys) {var nonEnumIdx = nonEnumerableProps.length;var constructor = obj.constructor;//获得原型,两种情况,构造函数和字面量形式 obj.constructor.prototype 和 obj.__proto__var proto = _.isFunction(constructor) && constructor.prototype || ObjProto;// `constructor` 属性需要特殊处理var prop = 'constructor';//对象重写了constructor 并且keys数组不包含constructorif (_.has(obj, prop) && !_.contains(keys, prop)) {keys.push(prop);}//遍历nonEnumerableProps数组while (nonEnumIdx--) {prop = nonEnumerableProps[nonEnumIdx];//判断是否重写了不可枚举属性//in用来判断一个属性是不是属于一个对象,这个属性可以是原型链上的,也可以是不可枚举属性if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {keys.push(prop);}}};

for .... in 存在的兼容问题你造吗?相关推荐

  1. w10系统自带linux系统,win10下,内置linux系统的安装和体验,你造吗?

    原标题:win10下,内置linux系统的安装和体验,你造吗? 众所周知,windows系统和linux系统一直是水火不容,而在最新的win10系统却完美兼容了linux系统,但是在默认情况下是关闭的 ...

  2. tensorflow兼容处理 tensorflow.compat.v1 tf.contrib

    20201130 问题提出: v1版本中tensorflow中contrib模块十分丰富,但是发展不可控,因此在v2版本中将这个模块集成到其他模块中去了.在学习tensorflow经常碰到tf.con ...

  3. FastAdmin扩展PHPEXCEL,PHP7.3高版本兼容问题

    THINKPHP扩展PHPEXCEL与PHP7.3高版本兼容问题 框架:THINKPHP5,PHPEXCEL版本:1.81 无法导出EXCEL原因为Shared/OLE.php第290行使用conti ...

  4. ie7和ie8 select使用jquery clone不兼容处理

    本文解决方案基于http://blog.csdn.net/zzx3q/article/details/8017794 在ie7和ie8下,用jquery clone复制一个select,复制的sele ...

  5. HTML+CSS布局技巧及兼容问题【阅读季】

    在IE6和IE7中,行高值必须大于字体的2px以上才能保证字体的完整显示或当作为链接时能显示下划线. IE6 下去掉 input等元素 的边框 border: 0 none; 所有浏览器都可以了 边框 ...

  6. CSS截取字符串,兼容浏览器

    今天在经典论坛看到有同学问到CSS截取字符多余省略号代替的求助且要兼容FF... 这个的确是个比较头痛的问题,现在我在的公司都是程序截取显示省略符的.兼容是没问题,但在中文和数学或字母混排时,就会有点 ...

  7. 360浏览器5兼容模式吗_Vue-cli项目,打包生产模式,部分用户360浏览器极速模式下奔溃...

    一直使用macOS系统下chrome浏览器下开发,仅仅使用到ant design pro vue 组件库,默认的脚手架配置. 客户使用win7下360安全浏览器访问,自动变成"兼容" ...

  8. 兼容超大图片的处理_动态图适用性调研与兼容性方案

    背景 业务中大量使用gif动态图,动画不细腻,体积大,占用不必要的带宽,根据这几点,寻找能替代gif图的方案(动画流程,体积小) 动态图类型 GIF GIF 是一个非常古老的格式,1987 年诞生,最 ...

  9. sgSpeedMode.js判断360浏览器是“兼容模式”,提示使用“极速模式”

    为了达到目的,当用户使用的是浏览器"兼容模式"就会出现以下提示 //极速模式提示信息-最简练的判断方式 if (navigator.userAgent.indexOf(" ...

最新文章

  1. CSE 3100 Systems Programming
  2. 容器源码分析之HashSet (三)
  3. asp.net asp:TextBox控件绑定值后,获取不到新值问题解决方法
  4. LeetCode-27 移除元素
  5. Ubuntu中开启MySQL远程访问功能,并将另一个数据库服务器中的数据迁移到新的服务器中...
  6. 编程语言python怎么读-Python之编程基础(编程语言分类)
  7. JQuery获取和设置Select选项常用方法总结 (转)
  8. 对模型方差和偏差的解释之二:泛化误差
  9. 第三次PR培训(添加常用效果和转场)
  10. ImageMagick图片转PDF
  11. mysql 数据库快速入门 数据库的发展
  12. 【scrapy】scrapy按分类爬取豆瓣电影基础信息
  13. NetSuite Saved Search不是啥都能查
  14. hadoop如何解除safemode-安全模式
  15. java 扫描仪_Java调用扫描仪2
  16. ASAN Pass源码分析(六)——全局变量插桩
  17. add new color number to the color drop down in enovia PLM
  18. iOS开发-类似微信录音上滑取消功能
  19. IC卡历史及分类命名
  20. 程伟健:新城易居携手中旅联盟深度发力打造城市中心文旅目的地

热门文章

  1. 群晖nas介绍文档_群晖 NAS 选购 入门指南:动手打造自己的家庭数据中心
  2. 正则表达式[^\\.]
  3. 京东平台智能手表电商数据分析报告
  4. 图像工程的读书笔记 图像成像过程
  5. 陌陌突然改名Hello,能撕掉固有标签吗?
  6. HTML+CSS 小米官网案例
  7. 实验项目3———8枚硬币问题
  8. XGBoost原理手推
  9. 条形碎片图纸的自动拼接规则算法matlab仿真
  10. c语言read怎么一行一行读,使用read从标准输入中读取一行