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中confirm,alert,prompt函数使用区别分析
Apr 01 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
Jun 24 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
Oct 17 Javascript
JQuery异步加载无限下拉框级联功能实现示例
Feb 19 Javascript
js给selected添加options的方法
May 06 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
May 24 Javascript
深入理解js generator数据类型
Aug 16 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
Feb 06 Javascript
vue vuex vue-rouert后台项目——权限路由(适合初学)
Dec 29 Javascript
vue中v-text / v-html使用实例代码详解
Apr 02 Javascript
JS开发常用工具函数(小结)
Jul 04 Javascript
vant中的toast层级改变操作
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
Zerg基本策略
2020/03/14 星际争霸
MySQL数据源表结构图示
2008/06/05 PHP
php后退一页表单内容保存实现方法
2012/06/17 PHP
php数字运算验证码的实现代码
2015/07/30 PHP
Symfony2开发之控制器用法实例分析
2016/02/05 PHP
PHP读取文件的常见几种方法
2016/11/03 PHP
php依赖注入知识点详解
2019/09/23 PHP
JavaScript实现随机替换图片的方法
2015/04/16 Javascript
跟我学习javascript的undefined与null
2015/11/17 Javascript
快速学习jQuery插件 Cookie插件使用方法
2015/12/01 Javascript
js实现String.Fomat的实例代码
2016/09/02 Javascript
jQuery实现底部浮动窗口效果
2016/09/07 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
2017/03/15 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
基于Require.js使用方法(总结)
2017/10/26 Javascript
Vue+Express实现登录注销功能的实例代码
2019/05/05 Javascript
[01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python实现360皮肤按钮控件示例
2014/02/21 Python
Python实现PS图像调整颜色梯度效果示例
2018/01/25 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
2018/04/23 Python
树莓派安装OpenCV3完整过程的实现
2019/10/10 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
2019/12/11 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
2021/02/06 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
美国最大的珠宝首饰网上商城:Jewelry.com
2016/07/22 全球购物
特步官方商城:Xtep
2017/03/21 全球购物
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
党员一句话承诺大全
2014/03/28 职场文书
大型会议策划方案
2014/05/17 职场文书
经济管理自荐书
2014/06/09 职场文书
企业爱岗敬业演讲稿
2014/09/04 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
四风剖析查摆对照检查材料思想汇报
2014/09/24 职场文书
2015年秋季小班开学寄语
2015/05/27 职场文书
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript