快速解答
如何检查 JavaScript 对象或数组中是否存在特定键?
如果密钥不存在而我尝试访问它,它会返回 false 吗?还是抛出错误?
使用(关联)数组样式或对象样式直接访问缺少的属性将返回一个 undefined 常量。
缓慢而可靠的in算子和hasOwnProperty方法
正如人们在这里已经提到的,您可以拥有一个具有与“未定义”常量相关联的属性的对象。
var bizzareObj = {valid_key: undefined};
在这种情况下,您将不得不使用 hasOwnProperty 或 in 运算符来了解密钥是否真的存在。但是,但价格是多少?
所以,我告诉你...
in 运算符和 hasOwnProperty 是在 Javascript 中使用 Property Descriptor 机制的“方法”(类似于 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
.
使用
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 中,至少有两个对缺失对象的引用以避免此类问题:null 和 undefined。
null 是原始值,表示有意缺少任何对象值,或者简而言之,确认 缺少值。另一方面,undefined 是一个未知值(未定义)。如果有一个属性将在以后使用 proper 值,请考虑使用 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 例外)已经改变了访问属性的方法。对于这种特殊情况,当前的实现比以前的实现要慢,但访问键和对象之间的差异可以忽略不计。