检查 JavaScript 对象中是否存在键?

IT技术 javascript arrays object
2021-01-12 05:13:14

如何检查 JavaScript 对象或数组中是否存在特定键?

如果密钥不存在,而我尝试访问它,它会返回 false 吗?还是抛出错误?

6个回答

检查 undefined-ness 不是测试密钥是否存在的准确方法。如果键存在但值实际上是undefined怎么办?

var obj = { key: undefined };
console.log(obj["key"] !== undefined); // false, but the key exists!

您应该改为使用in运算符:

var obj = { key: undefined };
console.log("key" in obj); // true, regardless of the actual value

如果要检查键是否不存在,请记住使用括号:

var obj = { not_key: undefined };
console.log(!("key" in obj)); // true if "key" doesn't exist in object
console.log(!"key" in obj);   // Do not do this! It is equivalent to "false in obj"

或者,如果您想特别测试对象实例的属性(而不是继承的属性),请使用hasOwnProperty

var obj = { key: undefined };
console.log(obj.hasOwnProperty("key")); // true

对于那些方法之间的性能比较inhasOwnProperty以及关键的是undefined,看到这个基准测试

基准测试结果

随机事实:设置为 的属性undefined不会被 序列化JSON.stringify(...),而null会。因此,任何设置undefined为往返 JSON 的内容都会消失。您还可以使用delete obj.propName从对象中删除属性。
2021-03-22 05:13:14
我确信存在将属性有意设置为未定义的用例。
2021-03-24 05:13:14
有效用例:Gecko 1.9.1 [Firefox 3.5] 没有 window.onhashchange 属性。Gecko 1.9.2 [Firefox 3.6] 将此属性设置为未定义(直到哈希更改)。要检测哈希历史或浏览器版本,必须使用 window.hasOwnProperty("onhashchange");
2021-04-09 05:13:14

快速回答

如何检查 JavaScript 对象或数组中是否存在特定键?如果密钥不存在而我尝试访问它,它会返回 false 吗?还是抛出错误?

使用(关联)数组样式或对象样式直接访问缺少的属性将返回未定义的常量。

缓慢和可靠运营商和hasOwnProperty方法

正如人们在这里已经提到的那样,您可以拥有一个具有与“未定义”常量关联的属性的对象。

 var bizzareObj = {valid_key:  undefined};

在这种情况下,您将不得不使用hasOwnPropertyin运算符来了解密钥是否真的存在。但是,但价格是多少?

所以,我告诉你...

in运算符和hasOwnProperty是在 Javascript 中使用属性描述符机制的“方法”(类似于 Java 语言中的 Java 反射)。

http://www.ecma-international.org/ecma-262/5.1/#sec-8.10

属性描述符类型用于解释命名属性属性的操作和具体化。Property Descriptor 类型的值是由命名字段组成的记录,其中每个字段的名称是一个属性名称,其值是 8.6.1 中指定的相应属性值。此外,任何字段都可以存在或不存在。

另一方面,调用对象方法或键将使用 Javascript [[Get]] 机制。那快得多!

基准

http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array

比较 JS 中的密钥访问.

运算符中 使用
var result = "Impression" in array;

结果是

12,931,832 ±0.21% ops/sec      92% slower 
使用 hasOwnProperty
var result = array.hasOwnProperty("Impression")

结果是

16,021,758 ±0.45% ops/sec     91% slower
直接访问元素(括号样式)
var result = array["Impression"] === undefined

结果是

168,270,439 ±0.13 ops/sec     0.02% slower 
直接访问元素(对象样式)
var result = array.Impression  === undefined;

结果是

168,303,172 ±0.20%     fastest

编辑:将undefined分配给属性的原因是什么

这个问题让我很困惑。在 Javascript 中,至少有两个对缺失对象的引用,以避免出现这样的问题:nullundefined.

null是原始值,表示有意缺少任何对象值,或简而言之,已确认的缺少值。另一方面,undefined是一个未知值(未定义)。如果有一个属性稍后会以适当的值使用,请考虑使用null引用而不是undefined因为在初始时刻该属性被确认为缺少值。

相比:

var a = {1: null}; 
console.log(a[1] === undefined); // output: false. I know the value at position 1 of a[] is absent and this was by design, i.e.:  the value is defined. 
console.log(a[0] === undefined); // output: true. I cannot say anything about a[0] value. In this case, the key 0 was not in a[].

建议

避免带有undefined值的对象尽可能直接检查并用于null初始化属性值。否则,使用慢in操作符或hasOwnProperty()方法。

编辑:12/04/2018 - 不再相关

正如人们所评论的,现代版本的 Javascript 引擎(firefox 例外)已经改变了访问属性的方法。对于这种特殊情况,当前的实现比前一个要慢,但访问密钥和对象之间的差异可以忽略不计。

它将返回undefined

var aa = {hello: "world"};
alert( aa["hello"] );      // popup box with "world"
alert( aa["goodbye"] );    // popup box with "undefined"

undefined是一个特殊的常数值。所以你可以说,例如

// note the three equal signs so that null won't be equal to undefined
if( aa["goodbye"] === undefined ) {
    // do something
}

这可能是检查丢失密钥的最佳方法。但是,正如在下面的评论中指出的那样,理论上您可能希望将实际值设为undefined. 我从来不需要这样做,也想不出为什么我想要这样做的原因,但为了完整起见,您可以使用in运算符

// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
    // do something
}
如果键存在但值实际上未定义怎么办?
2021-03-19 05:13:14
与 undefined 比较时,您应该使用 === 而不是 ==,否则 null 将与 undefined 比较。
2021-03-27 05:13:14
是的。无论是作为对象还是数组创建,它都返回 undefined 。
2021-03-28 05:13:14
"key" in obj

可能只测试与数组键非常不同的对象属性值

接受的答案是指对象小心使用in运营商阵列,以寻找数据,而不是键:

("true" in ["true", "false"])
// -> false (Because the keys of the above Array are actually 0 and 1)

测试数组中的现有元素:查找项目是否在 JavaScript 数组中的最佳方法?