JS判斷對(duì)象屬性是否存在的五種方案分享
背景
在這篇Accessible Object.prototype.hasOwnProperty() 提案中,提出了一個(gè)更簡(jiǎn)單的方法來(lái)檢查對(duì)象時(shí)候具有特定的屬性-
Object.hasOwn(),主要目標(biāo)是用來(lái)替代Object.prototype.hasOwnProperty()。目前本提案已經(jīng)進(jìn)去第四階段,預(yù)計(jì)2022年納入標(biāo)準(zhǔn)。
隨著Object.hasOwn()的加入,目前我們已經(jīng)有了5個(gè)判斷對(duì)象屬性是否存在的方法!
檢查屬性是否存在
in
JavaScript的in操作符可以用來(lái)判斷一個(gè)屬性是否屬于一個(gè)對(duì)象,也可以用來(lái)變量一個(gè)對(duì)象的屬性
本文我們只討論in的檢查作用
in運(yùn)算符檢查對(duì)象是否具有給定名稱的屬性:
> 'name' in {name: '搞前端的半夏'}
true
> 'name' in {}
false但是因?yàn)閕n會(huì)判斷繼承過(guò)來(lái)的屬性!
> 'toString' in {}
true那是因?yàn)閧}繼承了方法Object.prototype.toString()
Reflect.has()
Reflect是在ES2015新增的一個(gè)內(nèi)置對(duì)象,提供了與Javascript對(duì)象交互的方法。
判斷一個(gè)對(duì)象是否存在某個(gè)屬性,和 in 運(yùn)算符] 的功能完全相同。
用法:Reflect.has(obj, propName)
Reflect.has({name:"搞前端的半夏"}, "name"); // true
Reflect.has({name:"搞前端的半夏"}, "age"); // false
Reflect.has({name:"搞前端的半夏"}, "toString"); //truehasOwnProperty
hasOwnProperty這個(gè)方法可以用來(lái)檢測(cè)一個(gè)對(duì)象是否含有特定的自身屬性,即是用來(lái)判斷一個(gè)屬性是定義在對(duì)象本身而不是繼承自原型鏈的,
通過(guò)對(duì)象字面量或者構(gòu)造函數(shù)法創(chuàng)建的對(duì)象都從Object.prototype繼承了hasOwnProperty()。
構(gòu)造函數(shù)法
o = new Object();
o.name = '搞前端的半夏';
o.hasOwnProperty('name'); // 返回 true
o.hasOwnProperty('toString'); // 返回 false
o.hasOwnProperty('hasOwnProperty'); // 返回 false對(duì)象字面量
o={name:"搞前端的半夏"}
o.hasOwnProperty('name'); // 返回 true
o.hasOwnProperty('toString'); // 返回 false
o.hasOwnProperty('hasOwnProperty'); // 返回 false缺點(diǎn)
不支持create
但是下面這種情況:
o = Object.create(null)
o.hasOwnProperty('name'); // 返回 true會(huì)直接報(bào)錯(cuò):
Uncaught TypeError: o.hasOwnProperty is not a function
at <anonymous>:1:3覆蓋報(bào)錯(cuò)
如果一個(gè)對(duì)象有一個(gè)自己的名為 name 的屬性'hasOwnProperty',那么該屬性將被覆蓋Object.prototype.hasOwnProperty并且我們無(wú)法訪問(wèn)它:
o={hasOwnProperty:"搞前端的半夏"}
o.hasOwnProperty('name'); 直接報(bào)錯(cuò)
VM123:3 Uncaught TypeError: o.hasOwnProperty is not a function
at <anonymous>:3:3Object.prototype.hasOwnProperty()
用法:Object.prototype.hasOwnProperty.call(obj, propName);,接受兩個(gè)參數(shù)。請(qǐng)注意我們這里用到了call。改變this的指向。
Object.prototype.hasOwnProperty除了支持hasOwnProperty的相同用法,同時(shí)還解決了hasOwnProperty的兩個(gè)缺點(diǎn)。
o={hasOwnProperty:"搞前端的半夏"}
Object.prototype.hasOwnProperty.call.hasOwnProperty(o,'name'); // 返回falseES13(ES2022)Object.hasOwn()
Object.hasOwn(),目前來(lái)看就是替代Object.prototype.hasOwnProperty.call()。
如果用Object.prototype.hasOwnProperty.call() 來(lái)封裝的話,代碼如下:
function hasOwn(obj, propName) {
return Object.prototype.hasOwnProperty.call(obj, propName);
}Object.hasOwn({name: '搞前端的半夏'}, 'name') // true
Object.hasOwn({}, 'name') //false
Object.hasOwn({}, 'toString') //false
Object.hasOwn(Object.create(null), 'name') //false
Object.hasOwn({hasOwnProperty: 'yes'}, 'name') //false
Object.hasOwn({hasOwn: 'yes'}, 'name') //false總結(jié)
到此這篇關(guān)于JS判斷對(duì)象屬性是否存在的五種方案的文章就介紹到這了,更多相關(guān)JS判斷對(duì)象屬性存在內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Bootstrap簡(jiǎn)單表單顯示學(xué)習(xí)筆記
這篇文章主要為大家分享了Bootstrap簡(jiǎn)單表單顯示學(xué)習(xí)筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
javascript模擬枚舉的簡(jiǎn)單實(shí)例
本篇文章主要是對(duì)javascript模擬枚舉的簡(jiǎn)單實(shí)例進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-03-03
HTML+CSS+JavaScript做女朋友版的刮刮樂(lè)(一看就會(huì))
這篇文章主要介紹了HTML+CSS+JavaScript做女朋友版的刮刮樂(lè)(一看就會(huì))本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
使用JavaScript進(jìn)行表單校驗(yàn)功能
最近在學(xué)習(xí)JavaScript,因此想到使用js實(shí)現(xiàn)表單校驗(yàn)。下面通過(guò)本文給大家分享使用javascript實(shí)現(xiàn)表單校驗(yàn)功能的步驟,需要的的朋友參考下吧2017-08-08

