如何检查对象在JavaScript中是否具有特定属性?
考虑:
x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
//Do this
}
这是最好的方法吗?
如何检查对象在JavaScript中是否具有特定属性?
考虑:
x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
//Do this
}
这是最好的方法吗?
当前回答
您可以使用以下方法-
var obj = {a:1}
console.log('a' in obj) // 1
console.log(obj.hasOwnProperty('a')) // 2
console.log(Boolean(obj.a)) // 3
以下方法之间的区别如下-
在第一和第三种方法中,我们不仅搜索对象,还搜索其原型链。如果对象没有该属性,但该属性存在于其原型链中,则该对象将为true。
变量obj={a: 2,__原型__:{b:2}}console.log(obj中的'b')console.log(布尔(obj.b))
第二种方法只检查其自身的财产。示例-
变量obj={a: 2,__原型__:{b:2}}console.log(obj.hasOwnProperty('b'))
第一种方法和第三种方法的区别在于,如果有一个属性的值未定义,则第三种方式将为false,而第一种方法将为true。
变量obj={b:未定义}console.log(布尔(obj.b))console.log(obj中的'b');
其他回答
给定myObject对象和“myKey”作为密钥名称:
Object.keys(myObject).includes('myKey')
or
myObject.hasOwnProperty('myKey')
or
typeof myObject.myKey !== 'undefined'
最后一个被广泛使用,但(正如其他答案和评论中所指出的)它也可以匹配从Object原型派生的键。
当你能做到以下几点时,不要过于复杂:
var isProperty = (objectname.keyname || "") ? true : false;
对于大多数情况来说,这是简单明了的。。。
考虑Javascript中的以下对象
const x = {key: 1};
可以使用in运算符检查对象上是否存在该属性:
console.log("key" in x);
您还可以使用for-in循环遍历对象的所有财产,然后检查特定属性:
for (const prop in x) {
if (prop === "key") {
//Do something
}
}
您必须考虑此对象属性是否可枚举,因为非可枚举财产不会显示在for-in循环中。此外,如果可枚举属性隐藏了原型的不可枚举属性,它将不会在InternetExplorer8和更早版本中显示。
如果您想要所有实例财产的列表,无论是否可枚举,您可以使用
Object.getOwnPropertyNames(x);
这将返回对象上存在的所有财产的名称数组。
反射提供了可用于与Javascript对象交互的方法。静态Reflect.has()方法的工作方式类似于函数中的in运算符。
console.log(Reflect.has(x, 'key'));
// expected output: true
console.log(Reflect.has(x, 'key2'));
// expected output: false
console.log(Reflect.has(object1, 'toString'));
// expected output: true
最后,您可以使用typeof运算符直接检查对象属性的数据类型:
if (typeof x.key === "undefined") {
console.log("undefined");
}
如果对象上不存在该属性,它将返回字符串undefined。否则,它将返回适当的属性类型。但是,请注意,这并不总是检查对象是否具有属性的有效方法,因为您可以将属性设置为undefined,在这种情况下,使用typeof x.key仍将返回true(即使该键仍在对象中)。
类似地,您可以通过直接与未定义的Javascript属性进行比较来检查属性是否存在
if (x.key === undefined) {
console.log("undefined");
}
除非在x对象上特别将key设置为undefined,否则这应该有效
如果您正在搜索属性,请选择“否”。您需要:
if ('prop' in obj) { }
通常,您不应该关心属性是否来自原型或对象。
然而,因为您在示例代码中使用了“key”,所以看起来您将对象视为哈希,在这种情况下,您的答案是有意义的。所有散列键都是对象中的财产,您可以避免原型提供额外的财产。
约翰·雷格的回答很全面,但我认为不清楚。特别是当在obj中使用“rop”时。
JavaScript现在正在发展壮大,因为它现在有好的甚至有效的方法来检查它。
以下是检查对象是否具有特定属性的一些简单方法:
使用hasOwnProperty()
const hero = {
name: 'Batman'
};
hero.hasOwnProperty('name'); // => true
hero.hasOwnProperty('realName'); // => false
在中使用关键字/运算符
const hero = {
name: 'Batman'
};
'name' in hero; // => true
'realName' in hero; // => false
与未定义的关键字比较
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)
有关详细信息,请查看此处。