【问题标题】:Checking if an associative array exists in JavaScript检查 JavaScript 中是否存在关联数组
【发布时间】:2012-08-02 21:39:22
【问题描述】:

我有同样的问题在这里提出:Checking if a key exists in a JavaScript object?

但是,我正在寻找一种适用于所有主要浏览器(包括 IE 6+)的方法。我看到的我喜欢的方法是使用in 运算符,这是我以前从未见过的。

我在 google chrome 中尝试了一些不同的方法,似乎可以正常工作,但我想知道为什么不使用它而不是 in 运算符。

供参考:

var data = {foo : "bar"};
console.log("foo" in data); // true
console.log("bar" in data); // false

我的建议:

var data = {foo : "bar"};
console.log(!!data.foo); // true
console.log(!!data.bar); // false

我的(第二种)方法有什么缺点吗?

【问题讨论】:

  • 很明显,如果键值是假的,那么你会得到一个假阴性
  • 试试var data = {foo: 0};var data = {foo: false};var data = {foo: ''};。当然,如果你知道你的对象永远不会包含这样的值,那你很好。但是一般的解决方案应该在没有任何假设的情况下工作。
  • 这是不是更适合codereview.stackexchange.com
  • IE6 确实支持in,见stackoverflow.com/questions/2920765/…

标签: javascript object associative-array


【解决方案1】:

您似乎正在寻找替代方案,因为您之前不知道in 运算符,并假设它不受所有主要浏览器的支持。事实上,它受到所有主流浏览器的支持,包括 IE6。来自MSDN

支持以下文档模式:Quirks、Internet Explorer 6 标准、Internet Explorer 7 标准、Internet Explorer 8 标准、Internet Explorer 9 标准、Internet Explorer 10 标准。

我将避免解释您提出的方法的缺点,因为另一个答案和 cmets 已经这样做了。

【讨论】:

    【解决方案2】:

    我想指出,“in”运算符可能非常可疑。如果左侧是直接成员或右侧,或右侧原型的一部分,它将返回 true。我建议使用:.hasOwnProperty()

    var obj = {foo: 0}
    console.log(obj.hasOwnProperty('foo')) //true
    console.log(obj.hasOwnProperty('bar')) //false
    

    【讨论】:

      【解决方案3】:

      这样做的缺点是,如果您的属性值评估为虚假,则查找将失败,因为它正在测试值,而不是属性存在。毕竟,!! 将一个值强制为其真值/假值。

      var obj = {foo: 0};
      alert(!!obj.foo); //false
      

      解决方案:

      alert(typeof obj.foo != 'undefined')
      

      [编辑 - 回应下面关于 hasOwnProperty() 的评论,这很好,但 OP 并没有只询问自己的属性,而 hasOwnProperty(),顾名思义,不会获取继承的属性,所以可能不适合OP的要求]

      【讨论】:

      • 附注我应该指出,我的答案的唯一警告是它不会选择其值已明确设置为undefined 的属性。也就是说,我无法想象你为什么要设置这样的属性......
      • 解决方案比in 更详细,加上未定义值失败
      • 查看我的第一条评论回复:undefined。是的,in 更好,但 OP 想要一个替代方案。当然,in 就足够了。
      • 如果您想要一个强大的解决方案,那么您可以随时使用.hasOwnProperty
      • 他在哪里要求in 的替代品?问题的要点似乎是这一部分:“我在 google chrome 中尝试了一些不同的方法,似乎可行,但 我想知道为什么不使用它而不是 in 运算符 。”
      猜你喜欢
      • 2017-09-05
      • 2015-10-09
      • 2020-04-11
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      相关资源
      最近更新 更多