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 相关文章推荐
De facto standard 世界上不可思议的事实标准
Aug 29 Javascript
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
May 24 Javascript
JS实现QQ图片一闪一闪的效果小例子
Jul 31 Javascript
jQuery中Dom的基本操作小结
Jan 23 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
Mar 24 Javascript
JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法
May 19 Javascript
JavaScript的String字符串对象常用操作总结
May 26 Javascript
批量下载对路网图片并生成html的实现方法
Jun 07 Javascript
node实现基于token的身份验证
Apr 09 Javascript
bootstrap自定义样式之bootstrap实现侧边导航栏功能
Sep 10 Javascript
JavaScript使用prototype属性实现继承操作示例
May 22 Javascript
在Vue中创建可重用的 Transition的方法
Jun 02 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
php全局变量和类配合使用深刻理解
2013/06/05 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
PHP convert_uudecode()函数讲解
2019/02/14 PHP
laravel自定义分页的实现案例offset()和limit()
2019/10/15 PHP
javascript验证邮件地址和MX记录的方法
2015/06/16 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
JS实现字符串转驼峰格式的方法
2016/12/16 Javascript
详解vue 配合vue-resource调用接口获取数据
2017/06/22 Javascript
详解Vue2.x-directive的学习笔记
2017/07/17 Javascript
Nodejs Express 通过log4js写日志到Logstash(ELK)
2018/08/30 NodeJs
使用vue实现各类弹出框组件
2019/07/03 Javascript
手把手15分钟搭一个企业级脚手架
2019/09/16 Javascript
Node.js 实现抢票小工具 & 短信通知提醒功能
2019/10/22 Javascript
JS简易计算器实例讲解
2020/06/30 Javascript
openlayers实现地图测距测面
2020/09/25 Javascript
Vue基于localStorage存储信息代码实例
2020/11/16 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
[15:46]教你分分钟做大人——沙王
2015/03/11 DOTA
Python机器学习库scikit-learn安装与基本使用教程
2018/06/25 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
python爬虫爬取监控教务系统的思路详解
2020/01/08 Python
Python中常见的数制转换有哪些
2020/05/27 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
如何从csv文件构建Tensorflow的数据集
2020/09/21 Python
Python 列表反转显示的四种方法
2020/11/16 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
a标签下载链接的简单实现
2016/09/13 HTML / CSS
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
加拿大领先的优质厨具产品在线购物网站:Golda’s Kitchen
2017/11/17 全球购物
Timberland法国官网:购买靴子、鞋子、衣服、夹克和配饰
2019/11/30 全球购物
院领导写的就业推荐信
2014/03/09 职场文书
环境工程专业自荐信范文
2014/03/18 职场文书
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python