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

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

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

答案

检查不确定性不是测试密钥是否存在的准确方法。如果键存在但值实际上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

有关in中的hasOwnProperty和 key undefined的方法之间的性能比较,请参阅此基准

快速回答

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

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

慢而可靠运营商和hasOwnProperty方法

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

var bizzareObj = {valid_key:  undefined};

在这种情况下,您将必须使用hasOwnPropertyin运算符来知道密钥是否确实存在。但是, 但是价格是多少?

所以,我告诉你...

operator 和hasOwnProperty中的in是在 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初始化属性值。否则,请使用慢速in运算符或hasOwnProperty()方法。

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

正如人们所评论的那样,现代版本的 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
}

接受的答案Object 。当心在数组上使用in运算符查找数据而不是键:

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

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

"key" in obj

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

检查 javascript 对象中是否存在属性的三种方法:

  1. !! obj.theProperty
    将值转换为布尔值。对于除 “false” 值以外的所有值,返回 TRUE
  2. obj 中的 “theProperty”
    如果该属性存在,则无论其值如何(即使为空)也将返回 true
  3. obj.hasOwnProperty('theProperty')
    不检查原型链。 (由于所有对象都具有'toString' 方法,因此 1 和 2 将对其返回 true,而 3 可对其返回 false。)

参考:

http://book.mixu.net/node/ch5.html

如果您使用的是underscore.js库,则对象 / 数组操作将变得简单。

在您的情况下,可以使用_.has 方法。例:

yourArray = {age: "10"}

_.has(yourArray, "age")

返回true

但,

_.has(yourArray, "invalidKey")

返回

回答:

if ("key" in myObj)
{
    console.log("key exists!");
}
else
{
    console.log("key doesn't exist!");
}

说明:

in操作符将检查对象中是否存在键。如果检查值是否未定义: if (myObj["key"] === 'undefined') ,则可能会遇到问题,因为带有undefined值的键可能存在于对象中。

出于这个原因,更好的做法是先使用in运算符,然后在知道密钥存在后再比较该密钥内部的值。

这是一个我发现非常有用的辅助函数

这个keyExists(key, search)可以用来轻松地在对象或数组中查找键!

只需将要查找的键传递给它,然后搜索要在其中查找的 obj(对象或数组)。

function keyExists(key, search) {
        if (!search || (search.constructor !== Array && search.constructor !== Object)) {
            return false;
        }
        for (var i = 0; i < search.length; i++) {
            if (search[i] === key) {
                return true;
            }
        }
        return key in search;
    }

// How to use it:
// Searching for keys in Arrays
console.log(keyExists('apple', ['apple', 'banana', 'orange'])); // true
console.log(keyExists('fruit', ['apple', 'banana', 'orange'])); // false

// Searching for keys in Objects
console.log(keyExists('age', {'name': 'Bill', 'age': 29 })); // true
console.log(keyExists('title', {'name': 'Jason', 'age': 29 })); // false

它已经相当可靠,并且可以跨浏览器很好地工作。

香草 js

yourObjName.hasOwnProperty(key) : true ? false;

如果要检查对象在 es2015 中是否至少具有一个属性

Object.keys(yourObjName).length : true ? false