首页 > JavaScript > 如何检查 JavaScript 对象或数组中是否存在特定键?

如何检查 JavaScript 对象或数组中是否存在特定键?

上一篇 下一篇

如何检查 JavaScript 对象或数组中是否存在特定键?

如果密钥不存在,并且我尝试访问它,它会返回 false 吗?还是抛出错误?

分割线

网友回答:

快速回答

如何检查 JavaScript 对象或数组中是否存在特定键?
如果密钥不存在并且我尝试访问它,它会返回 false 吗?还是抛出错误?

使用(关联)数组样式或对象样式直接访问缺少的属性将返回未定义的常量。

在操作缓慢而可靠且具有OwnProperty的方法

正如人们在这里已经提到的,你可以有一个对象,其属性与“未定义”常量相关联。

 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]]机制。这要快得多!

基准

https://jsben.ch/HaHQt

Comparing key access in JS.

在运算符中使用

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 中,至少有两个针对缺失对象的引用以避免出现这样的问题:和 。nullundefined

null是表示有意缺少任何对象值的基元值,或者短期内表示确认缺少值。另一方面,是一个未知值(未定义)。如果有一个属性稍后将使用适当的值,请考虑使用引用,而不是因为在初始时刻确认该属性缺少值。undefinednullundefined

比较:

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[].

建议

避免使用带值的对象。尽可能直接检查并用于初始化属性值。否则,请使用慢速运算符或方法。undefinednullinhasOwnProperty()

编辑:12 / 04 / 2018 – 不再相关

正如人们所评论的那样,Javascript引擎的现代版本(Firefox例外)改变了访问属性的方法。对于这种特殊情况,当前的实现比前一个实现慢,但访问键和对象之间的差异可以忽略不计。

分割线

网友回答:

检查未定义性不是测试键是否存在的准确方法。如果键存在但值实际上是?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 的方法之间的性能比较,请参阅此基准:inhasOwnPropertyundefined

分割线

网友回答:

它会返回.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
}

这可能是检查丢失密钥的最佳方法。但是,正如下面的评论中指出的那样,从理论上讲,您可能希望实际值为 。我从来不需要这样做,也想不出我想要这样做的原因,但为了完整起见,您可以使用运算符undefinedin

// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
    // do something
}

模板简介:该模板名称为【如何检查 JavaScript 对象或数组中是否存在特定键?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【JavaScript】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 188次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 02-17
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信模板 响应式 微信素材 单页式简历模板 微信图片 自适应 企业网站 微信公众平台 微信文章 html5
您可能会喜欢的其他模板