js Object.prototype.hasOwnProperty() 与 for in 区别
hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性
语法
obj.hasOwnProperty(prop)
参数
prop要检测的属性 [字符串] 名称或者 [Symbol]。
返回值
用来判断某个对象是否含有指定的属性的 [Boolean] 。
描述
所有继承了 [Object]的对象都会继承到 hasOwnProperty 方法。这个方法可以用来检测一个对象是否含有特定的自身属性;和 [in]运算符不同,该方法会忽略掉那些从原型链上继承到的属性。
示例
使用 hasOwnProperty 方法判断属性是否存在
下面的例子检测了对象 o 是否含有自身属性 prop:
o =newObject();
o.prop ='exists';functionchangeO(){
o.newprop = o.prop;delete o.prop;}
o.hasOwnProperty('prop');// 返回 truechangeO();
o.hasOwnProperty('prop');// 返回 false
自身属性与继承属性
下面的例子演示了 hasOwnProperty 方法对待自身属性和继承属性的区别:
o =newObject();
o.prop ='exists';
o.hasOwnProperty('prop');// 返回 true
o.hasOwnProperty('toString');// 返回 false
o.hasOwnProperty('hasOwnProperty');// 返回 false
遍历一个对象的所有自身属性
下面的例子演示了如何在遍历一个对象的所有属性时忽略掉继承属性,注意这里 [for...in] 循环只会遍历可枚举属性,所以不应该基于这个循环中没有不可枚举的属性而得出 hasOwnProperty 是严格限制于可枚举项目的(如同 [Object.getOwnPropertyNames()])。
var buz ={
fog:'stack'};for(var name in buz){if(buz.hasOwnProperty(name)){alert("this is fog ("+ name +") for sure. Value: "+ buz[name]);}else{alert(name);// toString or something else}}
使用 hasOwnProperty 作为属性名
JavaScript 并没有保护 hasOwnProperty 属性名,因此某个对象是有可能存在使用这个属性名的属性,使用外部的 hasOwnProperty 获得正确的结果是需要的:
var foo ={
hasOwnProperty:function(){returnfalse;},
bar:'Here be dragons'};
foo.hasOwnProperty('bar');// 始终返回 false// 如果担心这种情况,可以直接使用原型链上真正的 hasOwnProperty 方法({}).hasOwnProperty.call(foo,'bar');// true// 也可以使用 Object 原型上的 hasOwnProperty 属性
Object.prototype.hasOwnProperty.call(foo,'bar');// true