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

如果密钥不存在,并且我试图访问它,它会返回false吗?或者抛出错误?


当前回答

快速回答

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

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

缓慢而可靠的运算符和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

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

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

基准

https://jsben.ch/HaHQt

.

在运算符中使用

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

编辑:给属性分配未定义值的原因是什么?

这个问题困扰着我。在Javascript中,至少有两个对缺失对象的引用,以避免类似这样的问题:null和undefined。

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[].

劝告

避免使用未定义值的对象。只要可能,直接检查并使用null初始化属性值。否则,请使用slow-in运算符或hasOwnProperty()方法。

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

正如人们所评论的那样,现代版本的Javascript引擎(除了firefox)改变了访问财产的方法。对于这种特定情况,当前的实现比之前的慢,但访问密钥和对象之间的差异可以忽略不计。

其他回答

香草js

yourObjName.hasOwnProperty(key) : true ? false;

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

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

如果在项目中配置了ESLint,则遵循ESLint规则,没有内置原型。以下链接描述了原因:

// bad
console.log(object.hasOwnProperty(key));

// good
console.log(Object.prototype.hasOwnProperty.call(object, key));

// best
const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
console.log(has.call(object, key));
/* or */
import has from 'has'; // https://www.npmjs.com/package/has
console.log(has(object, key));

最简单的检查方法是

"key" in object

例如:

var obj = {
  a: 1,
  b: 2,
}
"a" in obj // true
"c" in obj // false

返回值true表示对象中存在键。

JS双感叹号!!在这种情况下,符号可能会有所帮助。

const cars = {
        petrol:{
            price: 5000
        },
        gas:{
            price:8000
        }
    }

假设我们有上面的对象,如果你试图用汽油价格记录汽车。

=> console.log(cars.petrol.price);
=> 5000

你肯定会从中得到5000英镑。但如果你想得到不存在的电动汽车,那么你将不受约束

=> console.log(cars.electric);
=> undefine

但使用!!这是将变量转换为布尔值(真或假)。

=> console.log(!!cars.electric);
=> false

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

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

参考:

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