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不同类型数据之间的运算的转换方法
Feb 13 Javascript
js replace替换所有匹配的字符串
Feb 13 Javascript
Javascript实现计算个人所得税
May 10 Javascript
AngularJS Module方法详解
Dec 08 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
Dec 15 Javascript
Javascript HTML5 Canvas实现的一个画板
Apr 12 Javascript
浅谈Node.js 子进程与应用场景
Jan 24 Javascript
JS实现字符串中去除指定子字符串方法分析
May 17 Javascript
jQuery实现的简单对话框拖动功能示例
Jun 05 jQuery
微信小程序自定义导航栏(模板化)
Nov 15 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
Dec 01 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
yii框架builder、update、delete使用方法
2014/04/30 PHP
详细解读PHP的Yii框架中登陆功能的实现
2015/08/21 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
Yii2实现自定义独立验证器的方法
2017/05/05 PHP
YII2自动登录Cookie总是失效的解决方法
2017/06/28 PHP
PHP number_format函数原理及实例解析
2020/07/14 PHP
jQuery LigerUI 使用教程入门篇
2012/01/18 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
Vue如何引入远程JS文件
2017/04/20 Javascript
关于Promise 异步编程的实例讲解
2017/09/01 Javascript
打字效果动画的4种实现方法(超简单)
2017/10/18 Javascript
使用Typescript和ES模块发布Node模块的方法
2020/05/25 Javascript
JS forEach跳出循环2种实现方法
2020/06/24 Javascript
JavaScript实现动态生成表格
2020/08/02 Javascript
Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)
2020/08/28 Javascript
Vue实现todo应用的示例
2021/02/20 Vue.js
python使用装饰器和线程限制函数执行时间的方法
2015/04/18 Python
Python实现统计单词出现的个数
2015/05/28 Python
Python中的异常处理相关语句基础学习笔记
2016/07/11 Python
Python+matplotlib+numpy绘制精美的条形统计图
2018/01/02 Python
Python中@property的理解和使用示例
2019/06/11 Python
python @classmethod 的使用场合详解
2019/08/23 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
2019/09/06 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
2020/03/02 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
利用CSS3的特性改变文本选中时的颜色
2013/09/11 HTML / CSS
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
全球知名的婚恋交友网站:Match.com
2017/01/05 全球购物
Parfumdreams英国:香水和化妆品
2019/05/10 全球购物
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
工程造价专业求职信
2014/07/17 职场文书
质量在我心中演讲稿
2014/09/02 职场文书
中学生运动会新闻稿
2014/09/24 职场文书
感谢信的格式
2015/01/21 职场文书