Javascript中判斷對(duì)象是否具有屬性的5種方法分享
前言
最近閑下來打算把8月的更文活動(dòng)搞一搞了,之前很長一段時(shí)間沒有連續(xù)更文主要是工作時(shí)間有點(diǎn)吃緊的緣故。所以這一有時(shí)間就來繼續(xù)寫文章了。這次要分享的主題是關(guān)于提升js編碼效率的方法。
在實(shí)際工作中,在寫業(yè)務(wù)代碼時(shí)經(jīng)常需要判斷一個(gè)對(duì)象是否具有某種屬性,這是業(yè)務(wù)代碼中出現(xiàn)頻率很高的判斷邏輯。在此之前不管你掌握了多少種判斷方法,如果你耐心地看完這篇文章你至少能學(xué)會(huì)5種方法,這會(huì)讓你在以后的工作中游刃有余。
話不多說,直接給你展示判斷對(duì)象是否具有屬性的5種方法,請(qǐng)往下看→
5種方法
1. Reflect.has()方法
Reflect.has()方法用于檢查一個(gè)對(duì)象是否擁有某個(gè)屬性中。
如下:
Reflect.has({x: 0}, "x"); // true
Reflect.has({x: 0}, "y"); // false執(zhí)行結(jié)果如下:

如果該屬性存在于原型鏈中,也會(huì)返回true。
如下:
Reflect.has({x: 0}, "toString");執(zhí)行結(jié)果如下:

2. in操作符
in運(yùn)算符用于檢查對(duì)象是否包含某個(gè)屬性,如果包含就返回true,否則返回 false。它的作用和Reflect.has()方法相同。
const obj = {p: 1};
'p' in obj; // true
'toString' in obj; // true執(zhí)行結(jié)果如下:

所以,從上可以看出in操作符和Reflect.has()方法有一個(gè)共同的問題,那就是如果屬性來自對(duì)象的原型,它會(huì)返回true。那如何解決這個(gè)問題呢?請(qǐng)接著往下看→
3. Object.prototype.hasOwnPerporty()方法
針對(duì)in操作符和Reflect.has()方法上面的出現(xiàn)的問題,就可以使用對(duì)象的hasOwnProperty()方法來判斷,判斷'toString'是否為對(duì)象自身的屬性。
如下:
const obj = {p: 1};
console.log(obj.hasOwnProperty('toString')); // false 執(zhí)行結(jié)果如下:

hasOwnProperty()方法返回一個(gè)布爾值,指示對(duì)象是否具有指定具有指定的屬性(而不是繼承它)。它可以正確地區(qū)分對(duì)象本身的屬性和其原型的屬性。
但是這種判斷方法也有問題,那就是如果對(duì)象是使用Object.create(null)方式創(chuàng)建的,那么就不能使用hasOwnProperty()方法進(jìn)行判斷了。
如下:
var obj = Object.create(null);
obj.p = 1;
obj.hasOwnProperty('p'); // 報(bào)錯(cuò)執(zhí)行結(jié)果如下:

還有就是如果將hasOwnProperty()作為對(duì)象的一個(gè)屬性,這樣也無法使用hasOwnProperty()方法判斷屬性是否來自原型鏈了。如下:
var obj = {
p: 1,
hasOwnProperty: function () {
return false;
}
}
obj.hasOwnProperty('p'); // 始終返回false執(zhí)行結(jié)果如下:

造成這種問題的原因是由于javascript沒有將hasOwnProperty作為一個(gè)敏感詞,所以這樣就可以為對(duì)象聲明一個(gè)hasOwnProperty的屬性,從而導(dǎo)致上述問題。
那如果要解決這個(gè)問題,該如何操作呢?那還得接著往下看→
4. Object.prototype.hasOwnPerporty.call()方法
如果要解決上面的問題,就需要使用原型鏈上真正的hasOwnProperty方法了。
如下:

即使用Object.prototype.hasOwnPerporty.call()方法可以解決上面的問題,也可以這樣來寫。如下:
Object.prototype.hasOwnPerporty.call(obj, 'p'); // true
或
({}).hasOwnProperty.call(obj, 'p'); // true5. Object.hasOwn()方法
Object.hasOwn()方法是ES2022新提出的,用于替代Object.prototype.hasOwnProperty()的方法。根據(jù)MDN文檔中的介紹:如果指定的對(duì)象具有作為其自身屬性的指定屬性,則hasOwn()方法返回true;如果該屬性是繼承的或不存在,則該方法返回false。
使用方法如下:
const object1 = {prop: 'exists'};
console.log(Object.hasOwn(object1, 'prop')); // true
console.log(Object.hasOwn(object1, 'toString'));// false其他示例如下:
const example = {};
Object.hasOwn(example, 'prop'); // false - 'prop' has not been defined
example.prop = 'exists';
Object.hasOwn(example, 'prop'); // true - 'prop' has been defined
example.prop = null;
Object.hasOwn(example, 'prop'); // true - own property exists with value of null
example.prop = undefined;
Object.hasOwn(example, 'prop'); // true - own property exists with value of undefinedObject.hasOwn()與Object.hasOwnPeoperty()的區(qū)別:因?yàn)閷?shí)例的hasOwnProperty方法是從Object的原型上拿到的,如果使用Object.create(null)的方式創(chuàng)建一個(gè)對(duì)象那么就拿不到hasOwnProperty這個(gè)方法,而hasOwn作為Object的靜態(tài)方法是可以直接通過Object來進(jìn)行調(diào)用。
如下:
const obj1 = Object.create(null);
obj1.name = '111';
console.log(obj1.hasOwnProperty('name')); // 報(bào)錯(cuò)
const obj2 = Object.create(null);
obj2.name = '222';
console.log(Object.hasOwn(obj2, 'name')); // true
const obj3 = {
p: 1,
hasOwnProperty: function () {
return false
}
}
console.log(Object.hasOwn(obj3, 'p')); // true從上面的代碼結(jié)果可以看到,Object.hasOwn()方法是可以解決上面所有出現(xiàn)的問題的。但是它是ES2022提出的,所以還得看看它的兼容性。
如下:

可以看到,瀏覽器對(duì)它的支持還是挺友好的,所以大家是可以放心用的。
到此這篇關(guān)于Javascript中判斷對(duì)象是否具有屬性的5種方法分享的文章就介紹到這了,更多相關(guān)Javascript判斷對(duì)象方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 獲得Javascript對(duì)象屬性個(gè)數(shù)的示例代碼
- 詳解js對(duì)象中屬性的兩種類型之?dāng)?shù)據(jù)屬性和訪問器屬性
- js數(shù)組對(duì)象里面如何獲取某個(gè)屬性值相等的對(duì)象
- JS如何刪除對(duì)象中的某一屬性(delete)
- 你必須了解的JavaScript中的屬性描述對(duì)象詳解(下)
- 你必須了解的JavaScript中的屬性描述對(duì)象詳解(上)
- js刪除對(duì)象屬性的多種方法舉例
- js 如何刪除對(duì)象里的某個(gè)屬性
- JS 實(shí)現(xiàn)獲取對(duì)象屬性個(gè)數(shù)的方法小結(jié)
相關(guān)文章
JavaScript Typescript基礎(chǔ)使用教程
TypeScript是Microsoft(微軟)開發(fā)的一種開源編程語言,它充分利用了JavaScript原有的對(duì)象模型,并在此基礎(chǔ)上進(jìn)行了擴(kuò)充,TypeScript設(shè)計(jì)目標(biāo)是開發(fā)大型應(yīng)用,它可以編譯成純JavaScript,編譯出來的JavaScript可以運(yùn)行在任何一種JS運(yùn)行環(huán)境中2022-12-12
JavaScript 彈出窗體點(diǎn)擊按鈕返回選擇數(shù)據(jù)的實(shí)現(xiàn)
這兩天一直想實(shí)現(xiàn)這個(gè),以前做做個(gè)Demo,但是不知道跑哪去了。于是今天在網(wǎng)上找了些資料再自己動(dòng)手搞定。廢話不多說。直接進(jìn)入主題啦。2010-04-04
JavaScript中數(shù)組sort()方法的基本使用與踩坑記錄
: js中用方法sort()為數(shù)組排序,這篇文章主要給大家介紹了關(guān)于JavaScript中數(shù)組sort()方法的基本使用,sort()方法已經(jīng)可以滿足我們對(duì)數(shù)組的很多處理需求,需要的朋友可以參考下2021-06-06
JavaScript常用基礎(chǔ)知識(shí)強(qiáng)化學(xué)習(xí)
這篇文章主要介紹了JavaScript常用基礎(chǔ)知識(shí)強(qiáng)化學(xué)習(xí),需要的朋友可以參考下2015-12-12
JavaScript省市聯(lián)動(dòng)實(shí)現(xiàn)代碼
這篇文章主要介紹了JavaScript省市聯(lián)動(dòng)實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-02-02
js利用iframe實(shí)現(xiàn)選項(xiàng)卡效果
這篇文章主要為大家詳細(xì)介紹了js利用iframe實(shí)現(xiàn)選項(xiàng)卡效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08

