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 相关文章推荐
Node.js和PHP根据ip获取地理位置的方法
Mar 14 Javascript
js使用正则实现ReplaceAll全部替换的方法
Jul 18 Javascript
escape函数解决js中ajax传递中文出现乱码问题
Oct 30 Javascript
JavaScript动态修改网页元素内容的方法
Mar 21 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
Feb 19 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
May 26 Javascript
Angular中实现树形结构视图实例代码
May 05 Javascript
JS实现点击链接切换显示隐藏内容的方法
Oct 19 Javascript
微信小程序input框中加入小图标的实现方法
Jun 19 Javascript
为jquery的ajax请求添加超时timeout时间的操作方法
Sep 04 jQuery
Angular使用cli生成自定义文件、组件的方法
Sep 04 Javascript
JavaScript实现动态留言板
Mar 16 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
apache rewrite_module模块使用教程
2008/01/10 PHP
PHP实现的比较完善的购物车类
2014/12/02 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
2015/07/01 PHP
PHP微信分享开发详解
2017/01/14 PHP
基于JQuery的6个Tab选项卡插件
2010/09/03 Javascript
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
js简单实现用户注册信息的校验代码
2013/11/15 Javascript
通过url查找a元素应用案例
2014/04/29 Javascript
jquery获取对象的方法足以应付常见的各种类型的对象
2014/05/14 Javascript
jQuery Ajax中的事件详细介绍
2015/04/16 Javascript
javascript中判断json的方法总结
2015/08/27 Javascript
javascript每日必学之循环
2016/02/19 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
vue2.0获取自定义属性的值
2017/03/28 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
微信小程序 按钮滑动的实现方法
2017/09/27 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
JavaScript动态检测密码强度原理及实现方法详解
2019/06/11 Javascript
python每次处理固定个数的字符的方法总结
2013/01/29 Python
python实现批量注册网站用户的示例
2019/02/22 Python
python如何删除文件中重复的字段
2019/07/16 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
关于h5中的fetch方法解读(小结)
2017/11/15 HTML / CSS
Spartoo葡萄牙鞋类网站:线上销售鞋履与时尚配饰
2017/01/11 全球购物
Lancome兰蔻官方旗舰店:来自法国的世界知名美妆品牌
2018/06/14 全球购物
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
博朗(Braun)俄罗斯官方商店:德国小家电品牌
2019/09/24 全球购物
专科应届生求职信
2013/11/24 职场文书
培训班主持词
2014/03/28 职场文书
理财学专业自荐书
2014/06/28 职场文书
股东授权委托书范文
2014/09/13 职场文书
2015年售票员工作总结
2015/04/29 职场文书
盗窃案辩护词
2015/05/21 职场文书
安全教育主题班会总结
2015/08/14 职场文书
学校中层领导培训心得体会
2016/01/11 职场文书