应用场景:
在使用JavaScript编程时,我们常常会遇到一个问题:如何判断某个对象中是否存在某个属性?
对于这个问题,本文给出了四种解决方法。需要注意的是,四种方法是有区别的,应用哪一种方法需要看具体的需求决定!
以对象obj中是否存在属性attribute为例,如下阐述了四种方法的具体区别。
方法一、判断obj.attribute
出于直觉,我们很容易就想到:将obj.attribute与undefined比较不就可以了吗?如果返回True则不存在,返回False则不存在。
obj.attribute !== undefined
这么做在大部分情况下是没有问题的。但是需要知道一点,它是在访问obj中attribute这个属性的值。如果obj中有attribute这个属性,而它的值恰好就是undefined,那么就会判断失误。如下:
const obj = {attribute: undefined
}
方法二、利用Object.keys
利用Object.keys(obj)获得该对象所有属性名组成的数组,判断数组中是否有attribute。如果返回True则存在,返回False则不存在。
Object.keys(obj).includes('attribute')
需要注意的是,Object.keys拿到的是该对象的自有可枚举属性组成的数组。
什么叫自有?该对象自己本身所有的属性,原型链上能访问到的属性不算!
const obj = {}
obj.__proto__.attribute = 1
//这个时候attribute就不是obj的自有属性了
什么叫可枚举?就是遍历这个对象时遍历不到的属性,即单独为对象的某一个属性设置了enumberable:false的属性。对于一般的属性,默认都是可枚举的。但是我若如下给attribute设置为不可枚举,Object.keys(obj)就拿不到attribute了!
const obj = {attribute: undefined
}
Object.defineProperty(obj, 'attribute', {enumberable: false})
//这个时候attribute就不可枚举了
方法三、利用hasOwnProperty
利用对象的自带hasOwnProperty方法。如果返回True则存在,返回False则不存在。
obj.hasOwnProperty('attribute')
这种方法和Object.keys有点类似,不过它只能判断在obj的自有属性有是否有attribute,不管这个attribute是否可以遍历。
方法四、利用in运算符
利用in运算符。如果返回True则存在,返回False则不存在。
'attribute' in obj
这种方法中,只要obj中能访问到这个attribute属性,那么就返回true,反之false。它不管这个属性是在对象自身,还是原型链上,也不管这个属性是否可以枚举!