检查 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
对于那些方法之间的性能对比in
, hasOwnProperty
和关键是undefined
,看到这个标杆
如何检查 JavaScript 对象或数组中是否存在特定键?如果某个密钥不存在而我尝试访问它,它会返回 false 吗?或者抛出错误?
使用(关联)数组样式或对象样式直接访问缺少的属性将返回未定义的常量。
正如人们在这里已经提到的那样,你可以拥有一个具有与 “未定义” 常量相关联的属性的对象。
var bizzareObj = {valid_key: undefined};
在这种情况下,您将必须使用hasOwnProperty或在运算符中知道密钥是否确实存在。但是, 但是以什么价格?
所以,我告诉你......
在 operator 和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
。
在运营商中使用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
是未知值(未定义)。如果稍后将使用具有适当值的属性,请考虑使用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()
方法。
正如人们所评论的那样,现代版本的 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
为undefined
。我从来不需要这样做,也无法想出为什么我想要的原因,但为了完整起见,你可以使用in
运算符
// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
// do something
}