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 相关文章推荐
javascript appendChild,innerHTML,join性能比较代码
Aug 29 Javascript
Jquery替换已存在于element上的event的方法
Mar 09 Javascript
javascript 多浏览器 事件大全
Mar 23 Javascript
JQuery动画animate的stop方法使用详解
May 09 Javascript
jquery网页回到顶部效果(图标渐隐,自写)
Jun 16 Javascript
jQuery中:focus选择器用法实例
Dec 30 Javascript
JS的数组迭代方法
Feb 05 Javascript
jQuery滚动加载图片实现原理
Dec 14 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
Jan 03 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
Jul 06 Javascript
js实现移动端导航点击自动滑动效果
Jul 18 Javascript
微信小程序左右滑动的实现代码
Dec 15 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
phpmyadmin的#1251问题
2006/11/25 PHP
php中require和require_once的区别说明
2014/02/27 PHP
zf框架的registry(注册表)使用示例
2014/03/13 PHP
php计算程序运行时间的简单例子分享
2014/05/10 PHP
php的mssql数据库连接类实例
2014/11/28 PHP
PHP判断浏览器、判断语言代码分享
2015/03/05 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
php is_executable判断给定文件名是否可执行实例
2016/09/26 PHP
PHP反射API示例分享
2016/10/08 PHP
详解Laravel服务容器的绑定与解析
2019/11/05 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
利用JQuery为搜索栏增加tag提示
2009/06/22 Javascript
使用Javascript接收get传递的值的代码
2011/11/30 Javascript
Jquery组件easyUi实现选项卡切换示例
2016/08/23 Javascript
Html5 js实现手风琴效果
2020/04/17 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
2017/06/30 Javascript
详解Webpack DLL用法以及功能
2017/07/11 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
详解vue 自定义marquee无缝滚动组件
2019/04/09 Javascript
如何解决日期函数new Date()浏览器兼容性问题
2019/09/11 Javascript
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
Python中多线程的创建及基本调用方法
2016/07/08 Python
python3中set(集合)的语法总结分享
2017/03/24 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
Python学习笔记之Django创建第一个数据库模型的方法
2019/08/07 Python
python滑块验证码的破解实现
2019/11/10 Python
python 输出列表元素实例(以空格/逗号为分隔符)
2019/12/25 Python
Pyinstaller 打包发布经验总结
2020/06/02 Python
python属于跨平台语言码
2020/06/09 Python
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
实习医生自我评价
2013/09/22 职场文书
开水果连锁店创业计划书
2013/12/29 职场文书
2014最新开业庆典策划方案(5篇)
2014/09/15 职场文书
暑假安全保证书
2015/02/28 职场文书
Pytorch 中net.train 和 net.eval的使用说明
2021/05/22 Python