JS判斷對象屬性是否存在的五種方案分享
背景
在這篇Accessible Object.prototype.hasOwnProperty() 提案中,提出瞭一個更簡單的方法來檢查對象時候具有特定的屬性-
Object.hasOwn(),主要目標是用來替代Object.prototype.hasOwnProperty()。目前本提案已經進去第四階段,預計2022年納入標準。
隨著Object.hasOwn()的加入,目前我們已經有瞭5個判斷對象屬性是否存在的方法!
檢查屬性是否存在
in
JavaScript的in操作符可以用來判斷一個屬性是否屬於一個對象,也可以用來變量一個對象的屬性
本文我們隻討論in的檢查作用
in運算符檢查對象是否具有給定名稱的屬性:
> 'name' in {name: '搞前端的半夏'} true > 'name' in {} false
但是因為in會判斷繼承過來的屬性!
> 'toString' in {} true
那是因為{}繼承瞭方法Object.prototype.toString()
Reflect.has()
Reflect是在ES2015新增的一個內置對象,提供瞭與Javascript對象交互的方法。
判斷一個對象是否存在某個屬性,和 in 運算符] 的功能完全相同。
用法:Reflect.has(obj, propName)
Reflect.has({name:"搞前端的半夏"}, "name"); // true Reflect.has({name:"搞前端的半夏"}, "age"); // false Reflect.has({name:"搞前端的半夏"}, "toString"); //true
hasOwnProperty
hasOwnProperty這個方法可以用來檢測一個對象是否含有特定的自身屬性,即是用來判斷一個屬性是定義在對象本身而不是繼承自原型鏈的,
通過對象字面量或者構造函數法創建的對象都從Object.prototype繼承瞭hasOwnProperty()。
構造函數法
o = new Object(); o.name = '搞前端的半夏'; o.hasOwnProperty('name'); // 返回 true o.hasOwnProperty('toString'); // 返回 false o.hasOwnProperty('hasOwnProperty'); // 返回 false
對象字面量
o={name:"搞前端的半夏"} o.hasOwnProperty('name'); // 返回 true o.hasOwnProperty('toString'); // 返回 false o.hasOwnProperty('hasOwnProperty'); // 返回 false
缺點
不支持create
但是下面這種情況:
o = Object.create(null) o.hasOwnProperty('name'); // 返回 true
會直接報錯:
Uncaught TypeError: o.hasOwnProperty is not a function at <anonymous>:1:3
覆蓋報錯
如果一個對象有一個自己的名為 name 的屬性'hasOwnProperty'
,那麼該屬性將被覆蓋Object.prototype.hasOwnProperty
並且我們無法訪問它:
o={hasOwnProperty:"搞前端的半夏"} o.hasOwnProperty('name');
直接報錯
VM123:3 Uncaught TypeError: o.hasOwnProperty is not a function at <anonymous>:3:3
Object.prototype.hasOwnProperty()
用法:Object.prototype.hasOwnProperty.call(obj, propName);,接受兩個參數。請註意我們這裡用到瞭call。改變this的指向。
Object.prototype.hasOwnProperty除瞭支持hasOwnProperty的相同用法,同時還解決瞭hasOwnProperty的兩個缺點。
o={hasOwnProperty:"搞前端的半夏"} Object.prototype.hasOwnProperty.call.hasOwnProperty(o,'name'); // 返回false
ES13(ES2022)Object.hasOwn()
Object.hasOwn(),目前來看就是替代Object.prototype.hasOwnProperty.call()。
如果用Object.prototype.hasOwnProperty.call() 來封裝的話,代碼如下:
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
總結
到此這篇關於JS判斷對象屬性是否存在的五種方案的文章就介紹到這瞭,更多相關JS判斷對象屬性存在內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Javascript中判斷對象是否具有屬性的5種方法分享
- JS hasOwnProperty()方法檢測一個屬性是否是對象的自有屬性的方法
- 一文徹底理解js原生語法prototype,__proto__和constructor
- 分享JavaScript 類型判斷的幾種方法
- 一篇文章帶你瞭解JavaScript-對象