检查 JavaScript 对象中是否存在键?

淩亂°似流年 2024-03-30 09:27 203阅读 0赞

问:

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

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

答1:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

检查未定义性并不是测试密钥是否存在的准确方法。如果键存在但值实际上是 undefined 怎么办?

var obj = {键:未定义}; console.log(obj[“key”] !== undefined); // false,但是密钥存在!

您应该改用 in 运算符:

var obj = {键:未定义}; console.log(“key” in obj); // true,与实际值无关

如果要检查键是否不存在,请记住使用括号:

var obj = { not_key: undefined }; console.log(!(“key” in obj)); // 如果对象中不存在“key”,则为 true console.log(!“key” in obj); // 不要这样做!相当于“obj中的假”

或者,如果您想特别测试对象实例的属性(而不是继承的属性),请使用 hasOwnProperty:

var obj = {键:未定义}; console.log(obj.hasOwnProperty(“key”)); // 真的

对于 in、hasOwnProperty 和 key 是 undefined 的方法之间的性能比较,请参阅 this benchmark:

https://i.stack.imgur.com/PEuZT.png

我确信存在有意将属性设置为未定义的用例。

有效用例:Gecko 1.9.1 [Firefox 3.5] 没有 window.onhashchange 属性。 Gecko 1.9.2 [Firefox 3.6] 将此属性设置为未定义(直到哈希更改)。要检测哈希历史或浏览器版本,必须使用 window.hasOwnProperty("onhashchange");

随机事实:设置为 undefined 的属性不会被 JSON.stringify(...) 序列化,而 null 会。因此,任何设置为 undefined 且往返于 JSON 的内容都将消失。您还可以使用 delete obj.propName 从对象中删除属性。

基准对我来说有完全不同的结果。不应该更新吗? (也请比“基准结果”更好地描述您的图像,这对于需要替代文本的人来说是无用的,因为他们看不到图像。)

答2:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

快速回答

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

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

operator 和 hasOwnProperty 方法中缓慢可靠

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

  1. var bizzareObj = {
  2. valid_key: undefined};

在这种情况下,您将不得不使用 hasOwnProperty 或 in 运算符来了解密钥是否真的存在。但是,但是以什么价格?

所以,我告诉你…

in 运算符和 hasOwnProperty 是在 Javascript 中使用 Property Descriptor 机制的“方法”(类似于 Java 语言中的 Java 反射)。

http://www.ecma-international.org/ecma-262/5.1/\#sec-8.10

属性描述符类型用于解释命名属性属性的操作和具体化。属性描述符类型的值是由命名字段组成的记录,其中每个字段的名称是属性名称,其值是 8.6.1 中指定的相应属性值。此外,任何字段都可以存在或不存在。

另一方面,调用对象方法或键将使用 Javascript [[Get]] 机制。那速度要快得多!

基准

https://jsben.ch/HaHQt

https://i.stack.imgur.com/GjzNU.png

使用 in 运算符

  1. var result = "Impression" in array;

结果是

  1. 12,931,832 ±0.21% ops/sec 92% slower

使用 hasOwnProperty

  1. var result = array.hasOwnProperty("Impression")

结果是

  1. 16,021,758 ±0.45% ops/sec 91% slower

直接访问元素(括号样式)

  1. var result = array["Impression"] === undefined

结果是

  1. 168,270,439 ±0.13 ops/sec 0.02% slower

直接访问元素(对象样式)

  1. var result = array.Impression === undefined;

结果是

  1. 168,303,172 ±0.20% fastest

编辑:将未定义值分配给属性的原因是什么?

这个问题让我很困惑。在 Javascript 中,至少有两个不存在对象的引用以避免此类问题:null 和 undefined。

null 是原始值,表示有意缺少任何对象值,或者简而言之,确认 缺少值。另一方面,undefined 是未知值(未定义)。如果有一个属性稍后将与 proper 值一起使用,请考虑使用 null 引用而不是 undefined,因为在初始时刻该属性已确认缺少价值。

相比:

  1. var a = {
  2. 1: null};
  3. 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.
  4. 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() 方法。

编辑:2018 年 12 月 4 日 - 不再相关

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

答3:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

它将返回 undefined。

var aa = {你好:“世界”};警报(aa [“你好”]); // 带有 “world” 的弹出框 alert(aa[“goodbye”] ); // 带有“未定义”的弹出框

undefined 是一个特殊的常量值。所以你可以说,例如

  1. // note the three equal signs so that null won't be equal to undefined
  2. if( aa["goodbye"] === undefined ) {
  3. // do something
  4. }

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

  1. // this works even if you have {"goodbye": undefined}
  2. if( "goodbye" in aa ) {
  3. // do something
  4. }

是的。它返回 undefined 它是创建为对象还是数组。

如果键存在但值实际上未定义怎么办?

与 undefined 进行比较时,应使用 === 而不是 ==,否则 null 将与 undefined 进行比较。

答4:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

  1. "key" in obj

可能只测试与数组键非常不同的对象属性值

答5:

huntsbot.com – 高效赚钱,自由工作

accepted answer 指的是 Object。请注意使用 Array 上的 in operator 来查找数据而不是键:

  1. ("true" in ["true", "false"])
  2. // -> false (Because the keys of the above Array are actually 0 and 1)

要测试数组中的现有元素:Best way to find if an item is in a JavaScript array?

答6:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

检查 javascript 对象中是否存在属性的三种方法:

!!obj.theProperty 将值转换为布尔值。 obj.hasOwnProperty(‘theProperty’) 不检查原型链。 (因为所有对象都有 toString 方法,所以 1 和 2 会返回 true,而 3 会返回 false。)

参考:

http://book.mixu.net/node/ch5.html

!! obj.theProperty 在值未定义时失败。例如:var a = {a : undefined, b : null}; !!a.a **will return false**

回顾:!!obj.theProperty 不是检查对象是否具有名为 theProperty 的属性的解决方案。对于任何虚假属性值、undefined、null、数字 0 或 NaN 以及空字符串 "",它都会失败

答7:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

检查对象的属性,包括继承的属性

可以使用 in 运算符确定,如果指定的属性在指定的对象或其原型链中,则返回 true,否则返回 false

const person = { name: ‘dan’ }; console.log(‘name’ 本人); // true console.log(‘age’ in person); // 错误的

检查对象实例的属性(不包括继承的属性)

*2021 - 使用新方法 ***Object.hasOwn() 作为 Object.hasOwnProperty() 的替代品

Object.hasOwn() 旨在替代 Object.hasOwnProperty(),是一种可供使用的新方法(但尚未得到 safari 等所有浏览器的完全支持,但很快就会支持)

Object.hasOwn() 是一个静态方法,如果指定对象具有指定属性作为其自己的属性,则返回 true。如果属性被继承或不存在,则该方法返回 false。

const person = { name: ‘dan’ }; console.log(Object.hasOwn(person, ‘name’));// true console.log(Object.hasOwn(person, ‘age’));// false const person2 = Object.create({gender: ‘male ‘}); console.log(Object.hasOwn(person2, ‘gender’));// false

在 Object.prototype.hasOwnProperty 上使用它的动机是什么? - 建议在 Object.hasOwnProperty() 上使用此方法,因为它也适用于使用 Object.create(null) 创建的对象以及已覆盖继承的 hasOwnProperty() 方法。虽然可以通过在外部对象上调用 Object.prototype.hasOwnProperty() 来解决这类问题,但 Object.hasOwn() 克服了这些问题,因此是首选(参见下面的示例)

让 person = { hasOwnProperty: function() { return false; }, 年龄: 35 }; if (Object.hasOwn(person, ‘age’)) { console.log(person.age); // true - hasOwnProperty() 的实现不影响 Object }

让人 = Object.create(null);人.年龄 = 35; if (Object.hasOwn(person, ‘age’)) { console.log(person.age); // true - 无论对象是如何创建的都有效 }

可以在此处找到有关 Object.hasOwn 的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global\_Objects/Object/hasOwn

Object.hasOwn - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global\_Objects/Object/hasOwn\#browser\_compatibility 的浏览器兼容性

答8:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

如果您使用的是 underscore.js 库,那么对象/数组操作就会变得简单。

在您的情况下,可以使用 _.has 方法。例子:

  1. yourArray = {
  2. age: "10"}
  3. _.has(yourArray, "age")

返回真

但,

  1. _.has(yourArray, "invalidKey")

返回假

答9:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

回答:

  1. if ("key" in myObj)
  2. {
  3. console.log("key exists!");
  4. }
  5. else
  6. {
  7. console.log("key doesn't exist!");
  8. }

解释:

in 运算符将检查对象中是否存在键。如果您检查该值是否未定义:if (myObj[“key”] === ‘undefined’),您可能会遇到问题,因为您的对象中可能存在具有 undefined 值的键。

出于这个原因,最好先使用 in 运算符,然后在您知道它存在后比较键内的值。

答10:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

这是一个我觉得非常有用的辅助函数

此 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; } } 返回搜索键; } // 如何使用它: // 在数组中搜索键 console.log(keyExists(‘apple’, [‘apple’, ‘banana’, ‘orange’])); // true console.log(keyExists(‘fruit’, [‘apple’, ‘banana’, ‘orange’])); // false // 在对象中搜索键 console.log(keyExists(‘age’, {‘name’: ‘Bill’, ‘age’: 29 })); // true console.log(keyExists(‘title’, {‘name’: ‘Jason’, ‘age’: 29 })); // 错误的

它非常可靠并且跨浏览器运行良好。

这似乎有点混乱:首先,当搜索一个数组时,这个方法是检查一个值,而不是一个键。其次,既然可以使用内置的 Array.indexOf 方法,为什么还要遍历这样的数组呢? (如果你正在寻找一个价值,那就是)

答11:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

香草js

  1. yourObjName.hasOwnProperty(key) : true ? false;

如果要检查对象在 es2015 中是否至少有一个属性

  1. Object.keys(yourObjName).length : true ? false

原文链接:https://www.huntsbot.com/qa/oDXe/checking-if-a-key-exists-in-a-javascript-object?lang=zh_CN&from=csdn

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

发表评论

表情:
评论列表 (有 0 条评论,203人围观)

还没有评论,来说两句吧...

相关阅读