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 相关文章推荐
FireFox中textNode分片的问题
Apr 10 Javascript
jQuery 剧场版 你必须知道的javascript
May 27 Javascript
jQuery select操作控制方法小结
May 26 Javascript
基于jQuery的仿flash的广告轮播
Nov 05 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
Mar 28 Javascript
Javscript调用iframe框架页面中函数的方法
Nov 01 Javascript
Jquery常用的方法汇总
Sep 01 Javascript
jQuery实现的多滑动门,多选项卡效果代码
Mar 28 Javascript
ie下js不执行的几种可能
Feb 28 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
Jul 28 Javascript
vue实现多个元素或多个组件之间动画效果
Sep 25 Javascript
html中两种获取标签内的值的方法
Jun 16 jQuery
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实现格式化文件数据大小显示的方法
2015/01/03 PHP
PHP中返回引用类型的方法
2015/04/03 PHP
PHP魔术方法的使用示例
2015/06/23 PHP
Zend Framework入门知识点小结
2016/03/19 PHP
PHP微信开发用Cache 解决数据缓存
2016/07/11 PHP
CakePHP框架Model关联对象用法分析
2017/08/04 PHP
thinkPHP5实现的查询数据库并返回json数据实例
2017/10/23 PHP
JS正则表达式验证数字代码
2014/01/28 Javascript
php中给js数组赋值方法
2014/03/10 Javascript
JavaScript闭包函数访问外部变量的方法
2014/08/27 Javascript
jquery表单验证插件(jquery.validate.js)的3种使用方式
2015/03/28 Javascript
js实现的牛顿摆效果
2015/03/31 Javascript
javascript实现平滑无缝滚动
2020/08/09 Javascript
用原生JS对AJAX做简单封装的实例代码
2016/07/13 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
2016/09/23 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
vue.js 打包时出现空白页和路径错误问题及解决方法
2019/06/26 Javascript
JS中FormData类实现文件上传
2020/03/27 Javascript
python中的列表推导浅析
2014/04/26 Python
利用一个简单的例子窥探CPython内核的运行机制
2015/03/30 Python
Python引用传值概念与用法实例小结
2017/10/07 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
pyspark 读取csv文件创建DataFrame的两种方法
2018/06/07 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
在python中使用nohup命令说明
2020/04/16 Python
基于pandas向csv添加新的行和列
2020/05/25 Python
CSS3解决移动页面上点击链接触发色块的问题
2016/06/03 HTML / CSS
德国在线订购鲜花:Fleurop
2018/08/25 全球购物
2013年大学生的自我鉴定
2013/10/24 职场文书
学校教师安全责任书
2014/07/23 职场文书
在职证明格式样本
2015/06/15 职场文书
新闻稿怎么写
2015/07/18 职场文书
保护环境建议书作文400字
2015/09/14 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书
申论不会写怎么办?教您掌握这6点思维和原则
2019/07/17 职场文书
pt-archiver 主键自增
2022/04/26 MySQL