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 相关文章推荐
javascript 火狐(firefox)不显示本地图片问题解决
Jul 05 Javascript
jquery $(document).ready() 与window.onload的区别
Dec 28 Javascript
Js切换功能的简单方法
Nov 23 Javascript
多个datatable共存造成多个表格的checkbox都被选中
Jul 11 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
Dec 20 Javascript
深入分析原生JavaScript事件
Dec 29 Javascript
jQuery实现仿QQ头像闪烁效果的文字闪动提示代码
Nov 03 Javascript
jQuery实现非常实用漂亮的select下拉菜单选择效果
Nov 06 Javascript
bootstrap table支持高度百分比的实例代码
Feb 28 Javascript
js jquery 获取某一元素到浏览器顶端的距离实现方法
Sep 05 jQuery
JavaScript实现放大镜效果代码示例
Apr 29 Javascript
详解vue-router的导航钩子(导航守卫)
Nov 02 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
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
2008/10/13 PHP
Smarty变量调节器失效的解决办法
2014/08/20 PHP
php上传图片客户端和服务器端实现方法
2015/03/30 PHP
PHP中一个有趣的preg_replace函数详解
2018/08/15 PHP
js 替换
2008/02/19 Javascript
Javascript string 扩展库代码
2010/04/09 Javascript
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
jquery中this的使用说明
2010/09/06 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
Javascript基础教程之switch语句
2015/01/18 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
深入学习AngularJS中数据的双向绑定机制
2016/03/04 Javascript
Three.js快速入门教程
2016/09/09 Javascript
浅谈Express异步进化史
2017/09/09 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
JavaScript设计模式之享元模式实例详解
2019/01/17 Javascript
jQuery动态生成的元素绑定事件操作实例分析
2019/05/04 jQuery
js实现计算器功能
2020/08/10 Javascript
[54:41]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VGJ.T VS paiN
2018/03/31 DOTA
python新手经常遇到的17个错误分析
2014/07/30 Python
浅析Python中将单词首字母大写的capitalize()方法
2015/05/18 Python
python reduce 函数使用详解
2017/12/05 Python
详谈python在windows中的文件路径问题
2018/04/28 Python
Python子类继承父类构造函数详解
2019/02/19 Python
python内存管理机制原理详解
2019/08/12 Python
python list转置和前后反转的例子
2019/08/26 Python
python线程优先级队列知识点总结
2021/02/28 Python
Notino匈牙利:购买香水和化妆品
2019/04/12 全球购物
编程实现去掉XML的重复结点
2014/05/28 面试题
数学专业推荐信范文
2013/11/21 职场文书
教师党员思想汇报
2014/01/06 职场文书
房屋改造计划书
2014/01/10 职场文书
临床护士自荐信
2014/01/31 职场文书
2015年科学教研组工作总结
2015/07/22 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书