Javascript学习笔记之 对象篇(四) : for in 循环


Posted in Javascript onJune 24, 2014

先上范例:

// Poisoning Object.prototype
Object.prototype.bar = 1;

var foo = {moo: 2};
for(var i in foo) {
 console.log(i); // prints both bar and moo
}

这里我们要注意两点,一是 for in 循环会忽略 enumerable 设置为 false 的属性。例如一个数组的 length 属性。第二是,由于 for in 会遍历整个原型链,所以当原型链过长时,会对性能造成影响。

 enumerable 是个很陌生的词汇,实际上,你很难在 javascript 中发现它的影子,而它实际上也是作者从 ruby 中借鉴而来的。创建 enumerable 的目的不是为了独立使用,而是采用“混用”的方式,而 Prototype 中很多方法都混用了 enumerable,所以它可以说是 prototype 的奠基石。这里不做详细介绍,详细内容可以参考 - Enumerable。
由于我们没法改变 for in 循环本身的行为,所以我们只能采取其他方法来过滤掉那些不希望出现在循环内的属性,通过 《Javascript学习笔记之对象篇(三) : hasOwnProperty》 我们知道 hasOwnProperty 方法是可以做到这一点的。

使用 hasOwnProperty 过滤

仍然使用上个例子:

// Poisoning Object.prototype
Object.prototype.bar = 1;

var foo = {moo: 2};
 for(var i in foo) {
 if (foo.hasOwnProperty(i)) {
  console.log(i);
 }
 }

这是唯一正确的写法,由于我们实用了 hasOwnProperty 方法,所以这次只输出 moo。如果不适用 hasOwnProperty 方法,那么当 Object.prototype 扩展时,就会出现错误。
现在很多框架都会选择从 Object.prototype 扩展方法,所以我们使用这些框架时,如果使用没有用 hasOwnProperty 过滤的 for in 循环时就会遇到问题。

总结

建议养成 hasOwnProperty 过滤属性的好习惯,不要对运行环境做任何假设,也无论原生的原型对象是否被扩展。

Javascript 相关文章推荐
又一个小巧的图片预加载类
May 05 Javascript
JS获取父节点方法
Aug 20 Javascript
jquery 按键盘上的enter事件
May 11 Javascript
JavaScript利用正则表达式去除日期中的-
Jun 09 Javascript
JS实现的Select三级下拉菜单代码
Aug 20 Javascript
javascript性能优化之分时函数的介绍
Mar 28 Javascript
vue 实现全选全不选的示例代码
Mar 29 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
Aug 31 Javascript
jQuery实现的自定义轮播图功能详解
Dec 28 jQuery
JS函数进阶之prototy用法实例分析
Jan 15 Javascript
jQuery实现飞机大战小游戏
Jul 05 jQuery
在vue项目中引用Antv G2,以饼图为例讲解
Oct 28 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
Jun 24 #Javascript
js实现div闪烁原理及实现代码
Jun 24 #Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
Jun 24 #Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
Jun 24 #Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
Jun 23 #Javascript
jquery 为a标签绑定click事件示例代码
Jun 23 #Javascript
a标签click和href执行顺序探讨
Jun 23 #Javascript
You might like
php写的带缓存数据功能的mysqli类
2012/09/06 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
简介WordPress中用于获取首页和站点链接的PHP函数
2015/12/17 PHP
php如何修改SESSION的生存存储时间的实例代码
2017/07/05 PHP
PHP多进程之pcntl_fork的实例详解
2017/10/15 PHP
浅谈Javascript面向对象编程
2011/11/15 Javascript
window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法
2013/08/21 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
2013/08/26 Javascript
jQuery实现table隔行换色和鼠标经过变色的两种方法
2014/06/15 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
2016/01/17 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
domReady的实现案例
2016/11/23 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
AngularJS1.X学习笔记2-数据绑定详解
2017/04/01 Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
2017/08/06 Javascript
微信小程序switch开关选择器使用详解
2018/01/31 Javascript
React.js组件实现拖拽排序组件功能过程解析
2020/04/27 Javascript
vue 遮罩层阻止默认滚动事件操作
2020/07/28 Javascript
[05:00]第二届DOTA2亚洲邀请赛主赛事第三天比赛集锦.mp4
2017/04/04 DOTA
基于hashlib模块--加密(详解)
2017/06/21 Python
详解tensorflow实现迁移学习实例
2018/02/10 Python
python保存文件方法小结
2018/07/27 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
Python自动化导出zabbix数据并发邮件脚本
2019/08/16 Python
使用python 对验证码图片进行降噪处理
2019/12/18 Python
解决Django no such table: django_session的问题
2020/04/07 Python
二年级学生评语大全
2014/04/23 职场文书
环境科学专业求职信
2014/08/04 职场文书
中国梦演讲稿5分钟
2014/08/19 职场文书
高中学生自我评价范文
2014/09/23 职场文书
2014幼儿园教师个人工作总结
2014/11/08 职场文书
2014年医院工作总结
2014/11/20 职场文书
安全教育主题班会教案
2015/08/12 职场文书
2016形势与政策学习心得体会
2016/01/12 职场文书
强烈推荐:小学生:暑假作息时间表(值得收藏)
2019/07/09 职场文书