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

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

如果一个关键字不存在,并且我尝试访问它,它会返回false吗? 或者抛出一个错误?


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

var obj = { key: undefined };
obj["key"] != undefined // false, but the key exists!

你应该改用in运算符:

"key" in obj // true, regardless of the actual value

如果你想检查一个键是否不存在,请记住使用括号:

!("key" in obj) // true if "key" doesn't exist in object
!"key" in obj   // ERROR!  Equivalent to "false in obj"

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

obj.hasOwnProperty("key") // true

对于那些方法之间的性能对比inhasOwnProperty和关键是undefined ,看到这个标杆


快速回答

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

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

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

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

 var bizzareObj = {valid_key:  undefined};

在这种情况下,您将不得不使用hasOwnProperty或运算符来知道密钥是否真的存在。 但是,以什么价格?

所以,我告诉你...

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

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

属性描述符类型用于解释命名属性属性的操作和通用化。 属性描述符类型的值是由命名字段组成的记录,其中每个字段的名称是属性名称,其值是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初始化属性值。 否则,请使用slow 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
}
链接地址: http://www.djcxy.com/p/689.html

上一篇: Checking if a key exists in a JavaScript object?

下一篇: Why shouldn't I use mysql