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

检查JavaScript对象中是否存在密钥?,javascript,arrays,object,Javascript,Arrays,Object,如何检查JavaScript对象或数组中是否存在特定键 如果密钥不存在,我尝试访问它,它会返回false吗?或者抛出错误?它将返回未定义的 var aa={hello:“world”}; 警报(aa[“你好]);//带有“世界”的弹出框 警报(aa[“再见]);//带有“undefined”(未定义)的弹出框检查未定义不是测试密钥是否存在的准确方法。如果键存在,但值实际上是未定义的,该怎么办 var obj = { key: undefined }; obj["key"]

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


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

它将返回
未定义的

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

警报(aa[“再见]);//带有“undefined”(未定义)的弹出框
检查未定义不是测试密钥是否存在的准确方法。如果键存在,但值实际上是未定义的,该怎么办

var obj = { key: undefined };
obj["key"] !== undefined // false, but the key exists!
您应该改用
中的
操作符:

"key" in obj // true, regardless of the actual value
如果要检查键是否不存在,请记住使用括号:

!("key" in obj) // true if "key" doesn't exist in object
!"key" in obj   // Do not do this! It is equivalent to "false in obj"
或者,如果要特别测试对象实例的属性(而不是继承的属性),请使用
hasOwnProperty

obj.hasOwnProperty("key") // true
var result = array.hasOwnProperty("Impression")
有关
hasOwnProperty
和键为
未定义
的方法之间的性能比较,请参见此

var result = array.hasOwnProperty("Impression")

可能只测试与数组键非常不同的对象属性值,有三种方法可以检查javascript对象中是否存在属性:

  • !!对象属性

    将值转换为布尔值。对于除
    false
    值以外的所有值,返回
    true
  • obj中的属性
    如果属性存在,则返回true,无论其值如何(即使为空)
  • 对象有自己的属性(“属性”)

    var result = array.hasOwnProperty("Impression")
    
    不检查原型链。(由于所有对象都有
    toString
    方法,因此1和2将返回true,而3可以返回false。)
  • 参考:

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

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

     var bizzareObj = {valid_key:  undefined};
    
    慢可靠的in算子和hasOwnProperty方法
    var result = array.hasOwnProperty("Impression")
    
    正如人们在这里已经提到的,您可以拥有一个具有与“未定义”常量关联的属性的对象

     var bizzareObj = {valid_key:  undefined};
    
    在这种情况下,您必须使用hasOwnProperty或In操作符来知道密钥是否确实存在。但是,但是代价是什么

    var result = array.hasOwnProperty("Impression")
    
    所以,我告诉你

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

    var result = array.hasOwnProperty("Impression")
    

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

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

    基准

    在运算符中使用 结果是

    12,931,832 ±0.21% ops/sec      92% slower 
    
    16,021,758 ±0.45% ops/sec     91% slower
    
    168,270,439 ±0.13 ops/sec     0.02% slower 
    
    168,303,172 ±0.20%     fastest
    
    使用hasOwnProperty
    var result = array.hasOwnProperty("Impression")
    
    结果是

    12,931,832 ±0.21% ops/sec      92% slower 
    
    16,021,758 ±0.45% ops/sec     91% slower
    
    168,270,439 ±0.13 ops/sec     0.02% slower 
    
    168,303,172 ±0.20%     fastest
    
    直接访问图元(括号样式)
    var result = array["Impression"] === undefined
    
    结果是

    12,931,832 ±0.21% ops/sec      92% slower 
    
    16,021,758 ±0.45% ops/sec     91% slower
    
    168,270,439 ±0.13 ops/sec     0.02% slower 
    
    168,303,172 ±0.20%     fastest
    
    直接访问图元(对象样式) 结果是

    12,931,832 ±0.21% ops/sec      92% slower 
    
    16,021,758 ±0.45% ops/sec     91% slower
    
    168,270,439 ±0.13 ops/sec     0.02% slower 
    
    168,303,172 ±0.20%     fastest
    
    编辑:将
    未定义的值指定给属性的原因是什么?
    那个问题使我困惑。在Javascript中,至少有两个缺少对象的引用可以避免这样的问题:
    null
    undefined

    null
    是表示故意缺少任何对象值的原语值,或者简而言之,表示确认的缺少值。另一方面,
    未定义
    是一个未知值(未定义)。如果有一个属性稍后将使用适当的值,请考虑使用<代码> null <代码>引用,而不是<代码>未定义。因为在初始时刻,该属性是“强>确认缺少值。

    比较:

    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[].
    
    忠告 避免对象具有未定义的
    值。尽可能直接检查并使用
    null
    初始化属性值。否则,请使用
    中的慢速
    运算符或
    hasOwnProperty()
    方法

    var result = array.hasOwnProperty("Impression")
    
    编辑:2018年4月12日-不再相关 正如人们所评论的,Javascript引擎的现代版本(firefox除外)改变了访问属性的方法。对于这种特殊情况,当前的实现比前一个慢,但是访问键和对象之间的差异可以忽略。

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

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

    yourArray = {age: "10"}
    
    _.has(yourArray, "age")
    
    返回true

    但是,

    返回引用的false

    。注意使用on查找数据而不是密钥:

    ("true" in ["true", "false"])
    // -> false (Because the keys of the above Array are actually 0 and 1)
    
    要测试数组中的现有元素:

    我发现有一个助手函数非常有用 此
    keyExists(键,搜索)
    可用于轻松查找对象或数组中的键

    只需将要查找的键传递给它,然后搜索要在其中查找的obj(对象或数组)

    功能键存在(键,搜索){
    如果(!search | |(search.constructor!==Array&&search.constructor!==Object)){
    返回false;
    }
    for(var i=0;i
    回答: