- Published on
如何检查JavaScript对象中是否存在特定键?
- Authors
- Name
本文主要介绍如何在JavaScript对象或数组中检查特定键是否存在。通过阅读本文,你将了解几种常用的方法及其性能差异。
快速回答
如何检查JavaScript对象或数组中是否存在特定键?如果键不存在而我试图访问它,会返回false
还是会抛出错误?
直接访问一个不存在的属性(无论是采用数组方式还是对象方式)将返回undefined
。
in
操作符和hasOwnProperty
方法
慢而可靠的正如大家已经提到的,你可能会遇到一种情况:对象中存在一个与undefined
关联的属性。
var bizzareObj = { valid_key: undefined }
在这种情况下,你需要使用hasOwnProperty
或in
操作符来确定键是否真的存在。但这么做的代价是什么?
in
操作符和hasOwnProperty
方法使用JavaScript中的属性描述符机制(与Java语言中的反射机制类似)。
属性描述符类型用于解释命名属性的操作和具现化。属性描述符类型的值是由字段名和对应的属性值组成的记录,如8.6.1中所指定。另外,任何字段都可能存在或不存在。
另一方面,调用对象方法或键将使用JavaScript的[[Get]]
机制。这快得多。
性能基准
你可以在这里查看基准测试。
。
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
表示一个未知值(未定义)。如果有一个属性稍后会使用一个合适的值,建议使用null
引用而不是undefined
,因为在初始时刻属性值被确认缺乏。
比较如下:
var a = { 1: null }
console.log(a[1] === undefined) // 输出: false. 我知道a[]中位置1的值是缺少的,这是设计所致,即值已经定义。
console.log(a[0] === undefined) // 输出: true. 我无法对a[0]的值作出判断。在这种情况下,键0不存在于a[]中。
建议
避免对象中存在undefined
值。尽可能直接检查并使用null
来初始化属性值。否则,使用慢速的in
操作符或hasOwnProperty()
方法。