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 相关文章推荐
js动态改变select选择变更option的index值示例
Jul 10 Javascript
JavaScript中判断函数、变量是否存在
Jun 10 Javascript
使用Raygun对Node.js应用进行错误处理的方法
Jun 23 Javascript
jQuery实现的登录浮动框效果代码
Sep 26 Javascript
JavaScript实现获取远程的html到当前页面中
Mar 26 Javascript
Vue中计算属性computed的示例解读
Jul 26 Javascript
小程序图片长按识别功能的实现方法
Aug 30 Javascript
解决vuecli3.0热更新失效的问题
Sep 19 Javascript
Seajs源码详解分析
Apr 02 Javascript
JavaScript提升机制Hoisting详解
Oct 23 Javascript
jQuery加PHP实现图片上传并提交的示例代码
Jul 16 jQuery
详解vue中在父组件点击按钮触发子组件的事件
Nov 13 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简单复制文件的方法
2016/05/09 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
php源码 fsockopen获取网页内容实例详解
2016/09/24 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
表格 隔行换色升级版
2009/11/07 Javascript
javascript json 新手入门文档
2009/12/03 Javascript
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
js 实现 input type="file" 文件上传示例代码
2013/08/07 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
Javascript通过overflow控制列表闭合与展开的方法
2015/05/15 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
详解堆的javascript实现方法
2016/11/29 Javascript
Vue精简版风格概述
2018/01/30 Javascript
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
javascript使用正则实现去掉字符串前面的所有0
2018/07/23 Javascript
javascript刷新父页面方法汇总详解
2019/10/10 Javascript
js实现图片无缝循环轮播
2019/10/28 Javascript
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
Python3 适合初学者学习的银行账户登录系统实例
2017/08/08 Python
Django 路由系统URLconf的使用
2018/10/11 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
Python 模拟动态产生字母验证码图片功能
2019/12/24 Python
python 实现提取log文件中的关键句子,并进行统计分析
2019/12/24 Python
pyCharm 实现关闭代码检查
2020/06/09 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
2021年值得向Python开发者推荐的VS Code扩展插件
2021/01/25 Python
全球酒店预订网站:Hotels.com
2016/08/10 全球购物
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
英国领先的互联网葡萄酒礼品商:Vintage Wine & Port
2019/05/24 全球购物
便利店投资的创业计划书
2014/01/12 职场文书
前处理班长职位说明书
2014/03/01 职场文书
劳动竞赛口号
2014/06/16 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python