开发者问题收集

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

2009-07-08
3653503

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

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

3个回答

检查未定义性并不是测试键是否存在的准确方法。如果键存在但值实际上是 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 的方法之间的性能比较,请参阅 基准测试

基准测试结果

Ates Goral
2009-07-08

快速回答

How do I check if a particular key exists in a JavaScript object or array? If a key doesn't exist and I try to access it, will it return false? Or throw an error?

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

缓慢而可靠的 in 运算符和 hasOwnProperty 方法

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

 var bizzareObj = {valid_key:  undefined};

在这种情况下,您必须使用 hasOwnProperty in 运算符来知道键是否真的存在。但是, 但是代价是什么呢?

所以,我告诉你......

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

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

The Property Descriptor type is used to explain the manipulation and reification of named property attributes. Values of the Property Descriptor type are records composed of named fields where each field’s name is an attribute name and its value is a corresponding attribute value as specified in 8.6.1. In addition, any field may be present or absent.

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

基准测试

https://jsben.ch/HaHQt

Comparing key access in JS .

使用 in 运算符

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() 方法。

编辑:2018 年 12 月 4 日 - 不再相关

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

rdllopes
2014-02-27

它将返回 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
}
Eli Courtwright
2009-07-08