如何在JavaScript中检查对象是否具有特定属性?
考虑以下代码:
x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
//Do this
}
那是最好的做法吗?
如何在JavaScript中检查对象是否具有特定属性?
考虑以下代码:
x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
//Do this
}
那是最好的做法吗?
if(x.hasOwnProperty("key")){
// …
}
因为
if(x.key){
// …
}
如果x.key
为假值(例如,x.key === ""
),则失败。
不要这样做 object.hasOwnProperty(key))
。这样做非常糟糕,因为这些方法可能会被对象中的属性屏蔽 - 考虑 { hasOwnProperty: false }
- 或者对象可能是一个空对象 (Object.create(null))
。
最好的方法是使用 Object.prototype.hasOwnProperty.call(object, key)
或者:
const has = Object.prototype.hasOwnProperty; // Cache the lookup once, in module scope.
console.log(has.call(object, key));
/* Or */
import has from 'has'; // https://www.npmjs.com/package/has
console.log(has(object, key));
您还可以使用ES6中的Reflect
对象:
x = {'key': 1};
Reflect.has( x, 'key'); // returns true
这里提供了有关Reflect.has
的MDN文档。
Reflect.has()
是一个静态方法,作用类似于in运算符作为函数使用。
好的,看起来我的答案是正确的,除非你不想要继承的属性:
if (x.hasOwnProperty('key'))
以下是包含继承属性的其他选项:
if (x.key) // Quick and dirty, but it does the same thing as below.
if (x.key !== undefined)
var x = { key: false };
,x.key
方法是不正确的。 - Mark K Cowan另一个相对简单的方法是使用Object.keys
。这将返回一个array
,这意味着您可以获得数组的所有功能。
var noInfo = {};
var info = {something: 'data'};
Object.keys(noInfo).length //returns 0 or false
Object.keys(info).length //returns 1 or true
虽然我们生活在一个有很好的浏览器支持的世界,但因为这个问题非常古老,所以我想加上这一点:自JavaScript v1.8.5起,这是安全使用的。
Object.keys(info).indexOf('someotherthing') !== -1
。 - hippietrailObject.keys(info).includes('something')
更符合人体工程学。 - n_moenJavaScript现在正在发展和成长,因为它现在拥有良好甚至高效的检查方法。
以下是一些检查对象是否具有特定属性的简单方法:
hasOwnProperty()
const hero = {
name: 'Batman'
};
hero.hasOwnProperty('name'); // => true
hero.hasOwnProperty('realName'); // => false
in
const hero = {
name: 'Batman'
};
'name' in hero; // => true
'realName' in hero; // => false
undefined
关键字比较const hero = {
name: 'Batman'
};
hero.name; // => 'Batman'
hero.realName; // => undefined
// So consider this
hero.realName == undefined // => true (which means property does not exists in object)
hero.name == undefined // => false (which means that property exists in object)
了解更多信息,请查看此处。
hasOwnProperty可以用来确定一个对象是否拥有指定的属性,作为该对象的直接属性;与in运算符不同,这种方法不会检查对象的原型链。
所以根据你的问题,很可能你不想使用hasOwnProperty,它只能确定属性是否直接附加在对象本身上。
如果你想确定属性是否存在于原型链中,可以像这样使用:
if (prop in object) { // Do something }
现在通过ECMAScript22,我们可以使用hasOwn代替hasOwnProperty
(因为这个特性存在缺陷)。
Object.hasOwn(obj, propKey)
给定myObject对象和"myKey"作为键名:
Object.keys(myObject).includes('myKey')
myObject.hasOwnProperty('myKey')
typeof myObject.myKey !== 'undefined'
var obj = {a:1}
console.log('a' in obj) // 1
console.log(obj.hasOwnProperty('a')) // 2
console.log(Boolean(obj.a)) // 3
var obj = {
a: 2,
__proto__ : {b: 2}
}
console.log('b' in obj)
console.log(Boolean(obj.b))
var obj = {
a: 2,
__proto__ : {b: 2}
}
console.log(obj.hasOwnProperty('b'))
var obj = {
b : undefined
}
console.log(Boolean(obj.b))
console.log('b' in obj);
Boolean({b:''}.b) -> false
- Kamil Kiełczewski
Object.hasOwn
,它解决了Object.prototype.hasOwnProperty
的一些问题。 - Sebastian Simon