JavaScript判斷對象是否存在某個屬性或者方法,常用方法有兩種hasOwnProperty
和in
hasOwnProperty
是Object原型對象上的一個方法,用來判斷對象自身屬性中是否具有指定的屬性。
這個方法可以用來檢測一個對象是否含有特定的自身屬性;和 in
運算符不同,該方法會忽略掉那些從原型鏈上繼承到的屬性。
// eslint-disable-next-line no-new-object
const obj = new Object();
obj.name = 'myObject';console.log(obj.hasOwnProperty('name')); // true
console.log(obj.hasOwnProperty('toString')); // false
console.log(obj.hasOwnProperty('hasOwnProperty')); // falseconsole.log('name' in obj); // true
console.log('toString' in obj); // true
MDN上指出,JavaScript 并沒有保護 hasOwnProperty
這個屬性名,可以將任意對象的一個屬性命名為hasOwnProperty
,這樣一來就無法使用原型對象上的hasOwnProperty
方法了。解決辦法,直接使用原型鏈上的hasOwnProperty
方法:
// 可以直接使用原型鏈上真正的 hasOwnProperty 方法
({}).hasOwnProperty.call(obj, 'name'); // true
// 也可以使用 Object 原型上的 hasOwnProperty 屬性
Object.prototype.hasOwnProperty.call(obj, 'name'); // true
推薦使用第二種方式。