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加密解密7种方法总结分析
Oct 07 Javascript
javascript之典型高阶函数应用介绍
Jan 10 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
Oct 11 Javascript
捕获和分析JavaScript Error的方法
Mar 25 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
Dec 14 Javascript
socket.io学习教程之基础介绍(一)
Apr 29 Javascript
js构建二叉树进行数值数组的去重与优化详解
Mar 26 Javascript
详解js跨域请求的两种方式,支持post请求
May 05 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
Jul 21 Javascript
详解vue的双向绑定原理及实现
May 05 Javascript
layui使用表格渲染获取行数据的例子
Sep 13 Javascript
react实现移动端下拉菜单的示例代码
Jan 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
vBulletin Forum 2.3.xx SQL Injection
2006/10/09 PHP
一个简洁的PHP可逆加密函数(分享)
2013/06/06 PHP
php防止站外远程提交表单的方法
2014/10/20 PHP
Mac下php 5升级到php 7的步骤详解
2017/04/26 PHP
基于php流程控制语句和循环控制语句(讲解)
2017/10/23 PHP
PHP 计算两个特别大的整数实例代码
2018/05/07 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
2019/10/12 PHP
javascript的键盘控制事件说明
2008/04/15 Javascript
javascript数组的扩展实现代码集合
2008/06/01 Javascript
Jquery 绑定时间实现代码
2011/05/03 Javascript
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
2014/01/06 Javascript
jquery绑定事件不生效的解决方法
2014/02/11 Javascript
JQuery中的事件及动画用法实例
2015/01/26 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
微信小程序 UI布局常用技巧整理总结
2016/12/05 Javascript
详解angularJs指令的3种绑定策略
2017/04/13 Javascript
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
Node.js使用cookie保持登录的方法
2018/05/11 Javascript
vue中vee validate表单校验的几种基本使用
2018/06/25 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
python通过http下载文件的方法详解
2019/07/26 Python
Python+Pyqt实现简单GUI电子时钟
2021/02/22 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
如何验证python安装成功
2020/07/06 Python
django创建css文件夹的具体方法
2020/07/31 Python
初三物理教学反思
2014/01/21 职场文书
六月份红领巾广播稿
2014/02/03 职场文书
关于环保的建议书400字
2014/03/12 职场文书
2015年师德师风自我评价范文
2015/03/05 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
求职意向书范本
2015/05/11 职场文书
2015小学教师年度工作总结
2015/05/12 职场文书
班级班风口号大全
2015/12/25 职场文书