本文介绍JavaScript中检测对象属性的两种常用方式:in运算符和hasOwnProperty方法。in运算符会遍历原型链,返回true;而hasOwnProperty仅检查对象自身属性,忽略继承属性。理解两者的差异有助于在开发中正确选择属性检测方式,避免原型链带来的误判。
JavaScript对象属性检测概述
在JavaScript中,判断对象是否包含特定属性主要有两种方式,但它们的行为存在细微差异。
使用in运算符检测属性
第一种方式是使用in运算符。
具体代码实现如下:
var obj = {name:'jack'};
alert('name' in obj); // --> true
alert('toString' in obj); // --> true
从上述代码可以看出,无论是对象自身的属性name,还是原型链上的toString方法,in运算符都能检测到并返回true。
使用hasOwnProperty方法检测属性
第二种方式是使用hasOwnProperty方法。
具体代码实现如下:
var obj = {name:'jack'};
obj.hasOwnProperty('name'); // --> true
obj.hasOwnProperty('toString'); // --> false
需要注意的是,hasOwnProperty方法无法检测到通过原型链继承过来的属性,因此对于toString这样的属性会返回false。
in运算符与for...in循环的差异
另外需要留意的是,尽管in运算符能够检测到原型链上的属性,但在某些情况下,for...in循环可能无法遍历到这些属性。
当然,如果重写了原型,在IE9、Firefox、Safari、Chrome和Opera等现代浏览器中,for...in循环是可以看到这些属性的。具体细节可参考关于for...in缺陷的相关文档。