hasOwnProperty()
方法會(huì)返回一個(gè)布爾值樊诺,指示對(duì)象自身屬性中是否具有指定的屬性(也就是痴奏,是否有指定的鍵)劲妙。
const object1 = {};
object1.property1 = 42;
console.log(object1.hasOwnProperty('property1'));
// expected output: true
console.log(object1.hasOwnProperty('toString'));
// expected output: false
console.log(object1.hasOwnProperty('hasOwnProperty'));
// expected output: false
語(yǔ)法
obj.hasOwnProperty(prop)
參數(shù) prop
要檢測(cè)的屬性的 String
字符串形式表示的名稱掖桦,或者 Symbol
限府。
返回值
用來(lái)判斷某個(gè)對(duì)象是否含有指定的屬性的布爾值 Boolean
夺颤。
描述
所有繼承了 Object
的對(duì)象都會(huì)繼承到 hasOwnProperty
方法。這個(gè)方法可以用來(lái)檢測(cè)一個(gè)對(duì)象是否含有特定的自身屬性谣殊;和 in
運(yùn)算符不同拂共,該方法會(huì)忽略掉那些從原型鏈上繼承到的屬性。
備注
即使屬性的值是 null 或 undefined姻几,只要屬性存在宜狐,hasOwnProperty 依舊會(huì)返回 true。
o = new Object();
o.propOne = null;
o.hasOwnProperty('propOne'); // 返回 true
o.propTwo = undefined;
o.hasOwnProperty('propTwo'); // 返回 true
示例
使用 hasOwnProperty
方法判斷屬性是否存在
下面的例子檢測(cè)了對(duì)象 o 是否含有自身屬性 prop:
o = new Object();
o.hasOwnProperty('prop'); // 返回 false
o.prop = 'exists';
o.hasOwnProperty('prop'); // 返回 true
delete o.prop;
o.hasOwnProperty('prop'); // 返回 false
自身屬性與繼承屬性
下面的例子演示了 hasOwnProperty 方法對(duì)待自身屬性和繼承屬性的區(qū)別:
o = new Object();
o.prop = 'exists';
o.hasOwnProperty('prop'); // 返回 true
o.hasOwnProperty('toString'); // 返回 false
o.hasOwnProperty('hasOwnProperty'); // 返回 false
遍歷一個(gè)對(duì)象的所有自身屬性
下面的例子演示了如何在遍歷一個(gè)對(duì)象的所有屬性時(shí)忽略掉繼承屬性蛇捌,注意這里 for...in
循環(huán)只會(huì)遍歷可枚舉屬性抚恒,所以不應(yīng)該基于這個(gè)循環(huán)中沒(méi)有不可枚舉的屬性而得出 hasOwnProperty
是嚴(yán)格限制于可枚舉項(xiàng)目的(如同 Object.getOwnPropertyNames()
)。
var buz = {
fog: 'stack'
};
for (var name in buz) {
if (buz.hasOwnProperty(name)) {
console.log('this is fog (' +
name + ') for sure. Value: ' + buz[name]);
}
else {
console.log(name); // toString or something else
}
}
使用 hasOwnProperty
作為屬性名
JavaScript 并沒(méi)有保護(hù) hasOwnProperty 這個(gè)屬性名络拌,因此俭驮,當(dāng)某個(gè)對(duì)象可能自有一個(gè)占用該屬性名的屬性時(shí),就需要使用外部的 hasOwnProperty 獲得正確的結(jié)果:
var foo = {
hasOwnProperty: function() {
return false;
},
bar: 'Here be dragons'
};
foo.hasOwnProperty('bar'); // 始終返回 false
// 如果擔(dān)心這種情況春贸,
// 可以直接使用原型鏈上真正的 hasOwnProperty 方法
({}).hasOwnProperty.call(foo, 'bar'); // true
// 也可以使用 Object 原型上的 hasOwnProperty 屬性
Object.prototype.hasOwnProperty.call(foo, 'bar'); // true
注意混萝,只有在最后一種情況下,才不會(huì)新建任何對(duì)象萍恕。