Javascript中的for in循环和hasOwnProperty结合使用


Posted in Javascript onJune 05, 2013

与in操作符相比,for in 在循环对象的属性时也会遍历原型链,for in 不会读取不可枚举属性,如数组的length属性。 小结 当检测某个对象是否拥有某个属性时,hasOwnProperty 是唯一可以完成这一任务的方法,在 for in 循环时,建议增加 hasOwnProperty 进行判断,可以有效避免扩展本地原型而引起的错误。

与in操作符相比,for in 在循环对象的属性时也会遍历原型链,for in 不会读取不可枚举属性,如数组的length属性。

// 扩展 Object.prototype 
Object.prototype.bar = 1; 
var foo = {moo: 2}; 
for(var i in foo) { 
console.log(i); // 输出 bar 和 moo 
}

我们不可能改变 for in 循环的行为,当需要对循环体内某些属性进行过滤时,可以利用Object.prototype的hasOwnProperty方法来完成。

提示:因为 for in 循环总是遍历整个原型链,所以当遍历多继承的对象时效率较低。

使用 hasOwnProperty 进行过滤

// 仍旧针对上例的foo对象 
for (var i in foo) { 
if (foo.hasOwnProperty(i)) { 
console.log(i); 
} 
}

例子中因为使用了hasOwnProperty,最终输出moo;如果忽略 hasOwnProperty ,代码将会输出非预期结果,因为本地原型(如Object.prototype)已经被扩展了。

Prototype框架就是扩展Javascript原始对象的一个类库,并被广泛使用,其缺点也很明显,当框架引入后,如果不使用 hasOwnProperty 进行过滤判断,输出结果保证不是你想要的。

最佳实践

推荐在 for in 时,总是使用 hasOwnProperty 进行判断,没人可以保证运行的代码环境是否被污染过。

hasOwnProperty
为了检查某个对象是否拥有不在原型链上的自定义属性,就有必要用到 hasOwnProperty 方法,任何一个对象都具有该方法,它继承自 Object.prototype。

提示:我们无法完全检测某个属性是否是undefined,因为属性有可能存在,但其值为undefined。hasOwnProperty 是Javascript中唯一一个可以处理对象属性而不遍历原型链的方法。

// 扩展 Object.prototype 
Object.prototype.bar = 1; 
var foo = {goo: undefined}; foo.bar; // 1 
'bar' in foo; // true 
foo.hasOwnProperty('bar'); // false 
foo.hasOwnProperty('goo'); // true

只有 hasOwnProperty 给出了正确的预期结果,当遍历对象的属性时这是很有必要的,没有其它办法来排除定义在对象原型链上的属性。

hasOwnProperty 作为属性

Javascript 并没有保护 hasOwnProperty 为关键字或保留字,因此,如果某个对象拥有同名的属性,就有必要利用扩展的 hasOwnProperty 来获取正确结果。

var foo = { 
hasOwnProperty: function() { 
return false; 
}, 
bar: 'Here be dragons' 
}; 
foo.hasOwnProperty('bar'); // 总是返回 false 
// 使用另一个 hasOwnProperty 并将 this 设置为 foo 来调用它 
{}.hasOwnProperty.call(foo, 'bar'); // true

小结
当检测某个对象是否拥有某个属性时,hasOwnProperty 是唯一可以完成这一任务的方法,在 for in 循环时,建议增加 hasOwnProperty 进行判断,可以有效避免扩展本地原型而引起的错误。

Javascript 相关文章推荐
QQ登录简单实现代码
Mar 09 Javascript
JavaScript中Math对象使用说明
Jan 16 Javascript
jquery 表单取值常用代码
Dec 22 Javascript
javascript原生和jquery库实现iframe自适应高度和宽度
Jul 18 Javascript
JS Array.slice 截取数组的实现方法
Jan 02 Javascript
第一次接触神奇的Bootstrap基础排版
Jul 26 Javascript
JS仿JQuery选择器功能
Mar 08 Javascript
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
Aug 17 Javascript
JS去掉字符串中所有的逗号
Oct 18 Javascript
深入浅析ES6 Class 中的 super 关键字
Oct 20 Javascript
解决vuecli3.0热更新失效的问题
Sep 19 Javascript
详解新手使用vue-router传参时注意事项
Jun 06 Javascript
理解JAVASCRIPT中hasOwnProperty()的作用
Jun 05 #Javascript
jquery 面包屑导航 具体实现
Jun 05 #Javascript
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
Jun 05 #Javascript
js 获取后台的字段 改变 checkbox的被选中的状态 代码
Jun 05 #Javascript
JQuery AJAX 中文乱码问题解决
Jun 05 #Javascript
Javascript自定义排序 node运行 实例
Jun 05 #Javascript
jquery 文本上下无缝滚动,鼠标放上去就停止 小例子
Jun 05 #Javascript
You might like
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
PHP解密Unicode及Escape加密字符串
2015/05/17 PHP
纯PHP代码实现支付宝批量付款
2015/12/24 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
解决Laravel自定义类引入和命名空间的问题
2019/10/15 PHP
safari,opera嵌入iframe页面cookie读取问题解决方法
2010/06/23 Javascript
javascript Array.prototype.slice使用说明
2010/10/11 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
jQuery实现的网页竖向菜单效果代码
2015/08/26 Javascript
javascript中select下拉框的用法总结
2016/01/07 Javascript
JavaScript必知必会(六) delete in instanceof
2016/06/08 Javascript
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
[52:09]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第二场
2014/05/26 DOTA
Python实现二叉堆
2016/02/03 Python
深入探究Django中的Session与Cookie
2017/07/30 Python
Python import与from import使用及区别介绍
2018/09/06 Python
selenium处理元素定位点击无效问题
2019/06/12 Python
详解python深浅拷贝区别
2019/06/24 Python
Python Print实现在输出中插入变量的例子
2019/12/25 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
python中numpy.empty()函数实例讲解
2021/02/05 Python
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
2018/05/28 HTML / CSS
Interrail法国:乘火车探索欧洲,最受欢迎的欧洲铁路通票
2019/08/27 全球购物
匡威俄罗斯官网:Converse俄罗斯
2020/05/09 全球购物
PHP中如何创建和修改数组
2012/05/02 面试题
成人大专自我鉴定范文
2013/10/19 职场文书
丑小鸭教学反思
2014/02/03 职场文书
授权委托书范本(单位)
2014/09/28 职场文书
2014年医院后勤工作总结
2014/12/06 职场文书
优秀教师申报材料
2014/12/16 职场文书
员工给公司的建议书
2019/06/24 职场文书
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python