1、最簡單的方法,就是使用“!==”進行判斷,這種方法在工作中很常見,可以看出該方法可以判斷繼承來的屬性。
let obj = { x: 1 };
obj.x !== undefined; // true 有x屬性
obj.y !== undefined; // false 無y屬性
obj.toString !== undefined; // true 從Object繼承toString屬性
2、使用 in 運算符,in 的語法是: attr in obj , 同樣,該表達式也返回一個布爾值。
let obj = { x: 1 };
'x' in obj; // true
'y' in obj; // false
'toString' in obj; // true
in運算符語法很簡單,效果跟undefined是相同的,與undefined不同的是,in可以區分存在但值為undefined的屬性。話不多說,看代碼:
let obj = { x: undefined };
obj.x !== undefined; // false
'x' in obj; // true
可以看出如果屬性的值為undefined的時候,使用 !== 的方法就不奏效了,所以在工作中需要注意一下這一塊。
3、對象的 hasOwnProperty() 方法也可以檢測指定屬性名是否在對象內,同樣返回是布爾值, 當檢測屬性為自有屬性(非繼承)的時候返回true。
let obj = { x: 1, abc: 2 };
let a = 'a';
let b = 'bc';
obj.hasOwnProperty('x'); // true 包含
obj.hasOwnProperty('y'); // false 不包含
obj.hasOwnProperty('toString'); // false 繼承屬性
obj.hasOwnProperty(a + b); // true 判斷的是屬性abc
in 運算符和 hasOwnProperty() 的區別就在於 in 運算符可以判斷來自繼承的屬性,而hasOwnProperty() 不能。針對這一點在工作中加以運用還是很有幫助的。
4、propertyIsEnumerable() 是hasOwnProperty() 的增強版,這個方法的用法與hasOwnProperty()相同,但當檢測屬性是自有屬性(非繼承)且這個屬性是可枚舉的,才會返回true。
那么什么是可枚舉屬性?通俗的講就是可以通過for...in遍歷出來的屬性就是可枚舉屬性。通常由JS代碼創建出來的屬性都是可枚舉的。看一下代碼也許更方便理解:
let obj = Object.create({x: 1}); // 通過create()創建一個繼承了X屬性的對象obj
obj.propertyIsEnumerable('x'); // false x是繼承屬性
obj.y = 1; // 給obj添加一個自有可枚舉屬性y
obj.propertyIsEnumerable('y'); // true
Object.prototype.propertyIsEnumerable('toString'); // false 不可枚舉
5、Object.keys(),它會返回一個對象自身的可枚舉屬性的名字,類型為一個數組。
let obj = { x: 1 };
Object.defineProperty(obj, 'test', {
value: 'testVal',
enumerable: false,
writable: true,
configurable: true
});
let arr = Object.keys(obj);
arr.includes('x'); // true
arr.includes('test'); //false
我們使用了ES5提供的Object.defineProperty()方法為person對象增加了一個不可枚舉的名為 test 的屬性,它的值為 ‘testVal’。Object.keys()在獲得了一個對象的可枚舉屬性之后,接下來的操作就變成了在數組中查找符合條件的元素。在上述代碼中我們用了數組內置的includes()方法,對於舊版瀏覽器你可能需要改用 indexOf()等方法。
以上五種方法,都可以判斷出對象是否包含某個屬性,工作中可以根據不同情況采用不同的方法。
參考鏈接:https://blog.csdn.net/z327171559/article/details/82152603
https://baijiahao.baidu.com/s?id=1669987908375979930&wfr=spider&for=pc
