当前位置:  开发笔记 > 编程语言 > 正文

检查JavaScript对象中是否存在密钥?

如何解决《检查JavaScript对象中是否存在密钥?》经验,为你挑选了11个好方法。

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

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



1> Ates Goral..:

检查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,看到这个标杆


我确信有一些用例可以将属性设置为未定义.
有效用例:Gecko 1.9.1 [Firefox 3.5]没有window.onhashchange属性.Gecko 1.9.2 [Firefox 3.6]将此属性设置为undefined(直到哈希更改).要检测哈希历史记录或浏览器版本,必须使用window.hasOwnProperty("onhashchange");
拥有一个手动定义的undefined值的属性绝对没有意义.这真的是矛盾的.
@joebert只是因为某些东西是胡说八道并不意味着你不会在生产代码中遇到它.有许多图书馆做无意义的事情.
PHP中存在类似的问题,其中null ==不存在:http://stackoverflow.com/q/418066/372654,不幸的是,null也有用处.
很好,你提到使用括号.`!obj`中的"钥匙"已经咬了我很多次......
@joebert,可能没有用于在对象中手动实例化"undefined"的用例,但是如果你从某些第三方代码中获取对象,那么你永远不会知道并且应该为任何事情做好准备.特别是如果你自己开发一个库.
示例用例:考虑工程或科学计算.我想定义一个我知道我将需要的变量,但我不知道 - 但是 - 它的价值是什么.所以var x = undefined; 会做得很好......
检查对象中的prop大约是在Chrome和Firefox中检查typeof = ='undefined'的两倍慢.IE和Safari混合了jsperf结果http://jsperf.com/object-properties-check/2
我在某处看到了一个视频,建议您不要向变量明确分配“ undefined”,而当您要表示“ no value”时,建议不使用null,这是合理的,如果您遇到意外的“ undefined”,则表示您的代码未能在某个地方为变量分配初始值,如果相反,您会得到意外的“空”值,那么您知道有人明确分配了变量,但是您的代码逻辑并未遵循该规则进行处理。

2> rdllopes..:
快速回答

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

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

缓慢和可靠运营商和hasOwnProperty方法

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

 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

比较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是原始价值,表示故意没有任何对象价值,或简称,确认缺乏价值.另一方面,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()方法.

编辑:12/04/2018 - 不相关任何人

正如人们所评论的那样,现代版本的Javascript引擎(使用firefox异常)改变了访问属性的方法.对于这种特定情况,当前实现比前一个实现慢,但是访问密钥和对象之间的差异是可忽略的.


+1用于基准测试.谢谢,这正是我希望找到的信息.绝对是编写代码的强有力的论据,它永远不会指定或期望一个键包含值**undefined**.
我将undefined设置为哈希值的一个原因是我实际上想从哈希中删除该属性键,但是`delete hash [key]`比[慢得多](http://jsperf.com/delete-vs -undefined-vs-null/16)`hash [key] = undefined`.当然在这种情况下,对我来说没有必要使用`in`操作符,但它作为一个反例,"我们应该总是避免将值设置为undefined".

3> Eli Courtwri..:

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


在与undefined进行比较时,您应该使用===而不是==,否则null将比较等于undefined.
Eli你的答案并不完全准确.因为无论如何(当然不应该这样做)undefined不是一个特殊的常量值.事实上,它不是一个保留的关键字,你可以覆盖它,比如说,`var undefined = 42;`.在测试未定义的道具时,你应该总是使用`((typeof variable)==="undefined")`.
如果密钥存在但值实际上未定义怎么办?

4> handle..:

该接受的答案是指对象.小心使用in运营商的阵列,以寻找数据,而不是键:

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

测试数组中的现有元素:查找项目是否在JavaScript数组中的最佳方法?



5> 小智..:
"key" in obj

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



6> Lavi Avigdor..:

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

    !! obj.theProperty
    将值转换为bool.除"false"值之外的所有值都返回TRUE

    obj中的'theProperty'
    如果属性存在则返回true,无论其值是多少(甚至为空)

    obj.hasOwnProperty('theProperty')
    不检查原型链.(因为所有对象都有'toString'方法,1和2将在其上返回true,而3可以在其上返回false.)

参考:

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



7> vatsal..:

如果您使用underscore.js库,则对象/数组操作变得简单.

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

yourArray = {age: "10"}

_.has(yourArray, "age")

返回true

但,

_.has(yourArray, "invalidKey")

返回false



8> Webeng..:

回答:

if ("key" in myObj)
{
    console.log("key exists!");
}
else
{
    console.log("key doesn't exist!");
}

说明:

in运营商将检查关键的对象存在.如果您检查了值是否未定义:if (myObj["key"] === 'undefined'),则可能会遇到问题,因为对象可能存在于具有undefined值的对象中.

因此,首先使用in运算符然后在知道密钥存在之后比较密钥内的值是更好的做法.



9> jaredwilli..:
这是一个我发现非常有用的辅助函数

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;
    }

// How to use it:
// Searching for keys in Arrays
console.log(keyExists('apple', ['apple', 'banana', 'orange'])); // true
console.log(keyExists('fruit', ['apple', 'banana', 'orange'])); // false

// Searching for keys in Objects
console.log(keyExists('age', {'name': 'Bill', 'age': 29 })); // true
console.log(keyExists('title', {'name': 'Jason', 'age': 29 })); // false
如何使用它:

在数组中搜索键

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;
    }

// How to use it:
// Searching for keys in Arrays
console.log(keyExists('apple', ['apple', 'banana', 'orange'])); // true
console.log(keyExists('fruit', ['apple', 'banana', 'orange'])); // false

// Searching for keys in Objects
console.log(keyExists('age', {'name': 'Bill', 'age': 29 })); // true
console.log(keyExists('title', {'name': 'Jason', 'age': 29 })); // false

在对象中搜索键

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;
    }

// How to use it:
// Searching for keys in Arrays
console.log(keyExists('apple', ['apple', 'banana', 'orange'])); // true
console.log(keyExists('fruit', ['apple', 'banana', 'orange'])); // false

// Searching for keys in Objects
console.log(keyExists('age', {'name': 'Bill', 'age': 29 })); // true
console.log(keyExists('title', {'name': 'Jason', 'age': 29 })); // false

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


这看起来有点困惑:首先,在搜索数组时,此方法检查的是_value_,而不是密钥.其次,当你可以使用内置的[`Array.indexOf`]时,为什么要迭代这样的数组(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)方法?(如果你正在寻找一个值,那就是)

10> Hajji Tarik..:

vanila js

yourObjName.hasOwnProperty(key) : true ? false;

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

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



11> kind user..:
ES6解决方案

使用Array#someObject.keys.如果对象中存在给定键,则返回true,否则返回false.

var obj = {foo: 'one', bar: 'two'};
    
function isKeyInObject(obj, key) {
    var res = Object.keys(obj).some(v => v == key);
    console.log(res);
}

isKeyInObject(obj, 'foo');
isKeyInObject(obj, 'something');
推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有