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 相关文章推荐
js创建对象的几种常用方式小结(推荐)
Oct 24 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
Dec 12 Javascript
js带按钮的提示框可供选择示例代码
Sep 17 Javascript
jQuery探测位置的提示弹窗(toolTip box)详细解析
Nov 14 Javascript
JavaScript实现页面跳转的几种常用方式
Nov 28 Javascript
Jquery操作Ajax方法小结
Nov 29 Javascript
AngularJS使用ng-repeat指令实现下拉框
Aug 23 Javascript
jQuery select自动选中功能实现方法分析
Nov 28 Javascript
Vue+Vux项目实践完整代码
Nov 30 Javascript
vue引入ueditor及node后台配置详解
Jan 03 Javascript
对Vue table 动态表格td可编辑的方法详解
Aug 28 Javascript
element-ui table组件如何使用render属性的实现
Nov 04 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
div li的多行多列 无刷新分页示例代码
2013/10/16 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
2013/12/25 PHP
浅谈php和.net的区别
2014/09/28 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
2016/03/11 PHP
php编译安装php-amq扩展简明教程
2016/06/25 PHP
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
基于jquery的表头固定的若干方法
2011/01/27 Javascript
node.js中的fs.write方法使用说明
2014/12/15 Javascript
JS递归遍历对象获得Value值方法技巧
2016/06/14 Javascript
JavaScript编程中实现对象封装特性的实例讲解
2016/06/24 Javascript
深入理解JavaScript定时机制
2016/10/27 Javascript
在bootstrap中实现轮播图实例代码
2017/06/11 Javascript
EasyUI的TreeGrid的过滤功能的解决思路
2017/08/08 Javascript
vue-cli之router基本使用方法详解
2017/10/17 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
使用Turtle画正螺旋线的方法
2017/09/22 Python
详解Python字符串切片
2019/05/20 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
Django自定义用户登录认证示例代码
2019/06/30 Python
Python 正则表达式爬虫使用案例解析
2019/09/23 Python
Python列表去重复项的N种方法(实例代码)
2020/05/12 Python
让你相见恨晚的十个Python骚操作
2020/11/18 Python
HTML5 canvas绘制的玫瑰花效果
2014/05/29 HTML / CSS
VICHY薇姿英国官网:全球专业敏感肌护肤领先品牌
2017/07/04 全球购物
匈牙利超级网上商店和优惠:Alza.hu
2019/12/17 全球购物
澳大利亚在线批发商:Simply Wholesale
2021/02/24 全球购物
文化宣传方案
2014/03/13 职场文书
淘宝好评语大全
2014/05/05 职场文书
北京奥运会口号
2014/06/21 职场文书
课程设计的心得体会
2014/09/03 职场文书
自我查摆剖析材料
2014/10/11 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
python游戏开发之pygame实现接球小游戏
2022/04/22 Python