检查 JavaScript 对象中是否存在键?快速解答
如何检查 JavaScript 对象或数组中是否存在特定键?
如果某个密钥不存在,而我尝试访问它,它会返回 false 吗?还是抛出错误?
如何检查 JavaScript 对象或数组中是否存在特定键?
如果某个密钥不存在,而我尝试访问它,它会返回 false 吗?还是抛出错误?
检查未定义性不是测试密钥是否存在的准确方法。如果键存在,但值实际上是?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
有关 和 key is 的方法之间的性能比较,请参阅以下基准测试:in
hasOwnProperty
undefined
如何检查 JavaScript 对象或数组中是否存在特定键?如果某个密钥不存在,而我尝试访问它,它会返回 false 吗?还是抛出错误?
使用(关联)数组样式或对象样式直接访问缺少的属性将返回未定义的常量。
正如人们已经在这里提到的,你可以有一个对象,其属性与“未定义”常量相关联。
var bizzareObj = {valid_key: undefined};
在这种情况下,您将不得不使用hasOwnProperty或在运算符中知道密钥是否真的存在。但是,但是要付出什么代价呢?
所以,我告诉你...
in operator 和 hasOwnProperty 是使用 Javascript 中的 Property Descript 机制的“方法”(类似于 Java 语言中的 Java 反射)。
http://www.ecma-international.org/ecma-262/5.1/#sec-8.10
属性描述符类型用于解释命名属性特性的操作和重新化。属性描述符类型的值是由命名字段组成的记录,其中每个字段的名称是属性名称,其值是 8.6.1 中指定的相应属性值。此外,任何字段都可能存在或不存在。
另一方面,调用对象方法或键将使用Javascript [[Get]]机制。这要快得多!
.
var result = "Impression" in array;
结果是
12,931,832 ±0.21% ops/sec 92% slower
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
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()
正如人们所评论的那样,Javascript引擎的现代版本(firefox例外)已经改变了访问属性的方法。对于此特定情况,当前实现比前一个实现慢,但访问键和对象之间的差异是可以忽略的。