如何检查JavaScript对象或数组中是否存在特定键?
如果某个密钥不存在,并且我尝试访问它,它会返回false吗?或者抛出错误?
如何检查JavaScript对象或数组中是否存在特定键?
如果某个密钥不存在,并且我尝试访问它,它会返回false吗?或者抛出错误?
检查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 要么 在 操作员知道钥匙是否真的存在。但, 但是以什么价格?
所以,我告诉你......
在 操作员和 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
初始化属性值。否则,请使用慢速 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
。我从来不需要这样做,也不能想出我为什么要这样做的原因,但为了完整起见,你可以使用 in
操作者
// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
// do something
}
该 接受了答案 是指 目的。小心使用 in
操作者 上 排列 查找数据而不是键:
("true" in ["true", "false"])
// -> false (Because the keys of the above Array are actually 0 and 1)
要测试数组中的现有元素: 查找项目是否在JavaScript数组中的最佳方法?
"key" in obj
可能只测试与数组键非常不同的对象属性值
检查javascript对象中是否存在属性的三种方法:
参考:
如果你正在使用 underscore.js 库然后对象/数组操作变得简单。
在你的情况下,可以使用_.has方法。例:
yourArray = {age: "10"}
_.has(yourArray, "age")
回报 真正
但,
_.has(yourArray, "invalidKey")
回报 假
回答:
if ("key" in myObj)
{
console.log("key exists!");
}
else
{
console.log("key doesn't exist!");
}
说明:
该 in
operator将检查对象中是否存在密钥。如果您检查了值是否未定义: if (myObj["key"] === 'undefined')
,你可能会遇到问题,因为你的对象中可能存在一个键 undefined
值。
出于这个原因,首先使用它是更好的做法 in
运算符然后在您知道密钥存在之后比较密钥内的值。
这个 keyExists(key, search)
可用于轻松查找对象或数组中的键!
只需将要查找的密钥传递给它,然后搜索要在其中找到它的obj(对象或数组)。
function keyExists(key, search) {
if (!search || (search.constructor !== Array && search.constructor !== Object)) {
return false;
}
for (var i = 0; i < search.length; i++) {
if (search[i] === key) {
return true;
}
}
return key in search;
}
keyExists('apple', ['apple', 'banana', 'orange']); // true
keyExists('fruit', ['apple', 'banana', 'orange']); // false
在对象中搜索键
keyExists('age', {'name': 'Bill', 'age': 29 }); // true
keyExists('title', {'name': 'Jason', 'age': 29 }); // false
它非常可靠,并且跨浏览器运行良好。