【问题标题】:Does if (obj.nonExistentProperty) trigger any browser errors?if (obj.nonExistentProperty) 会触发任何浏览器错误吗?
【发布时间】:2014-01-22 18:55:51
【问题描述】:

我正在遍历一组简单(JSON 样式)对象,其中一些具有给定属性,而另一些则没有。如果他们具有该属性,可以肯定地假设它永远不会评估为虚假值。

var objs = [
    {'a': 1, 'b': 2, 'c': 3},
    {'a': 4, 'b': 5},
    {'a': 7, 'b': 8, 'c': 9}
];

我相当大的应用程序在 Internet Explorer 8 中触发了一些(非常无用的)错误,因此我只想将其从潜在问题列表中删除。使用是否安全:

for (var i = 0; i < objs.length; ++i) {
    if (objs[i].c) {
        // objs[i].c is defined
    }
}

我在应用程序代码中多次使用这种检查,但我需要使用obj.hasOwnProperty('c')typeof obj.c != 'undefined'吗?

谢谢。

【问题讨论】:

    标签: javascript definition typeof hasownproperty


    【解决方案1】:

    ...可以安全地假设它永远不会评估为虚假值。

    不,这不安全。如果你有一个像{'a': 1, 'b': 2, 'c': 0} 这样的对象,objs[i].c 将被评估为 falsy。 (或c 等于falseNaNnullundefined''。)

    如果您只想知道,如果对象中定义了属性,您可以使用'c' in objs[i],但请注意,这也会包括原型链中的属性。

    如果要避免从原型链中获取属性,则需要进行hasOwnProperty 检查。

    在现代浏览器中还可以使用Object.keys,尽管它在快速检查时并不方便。

    【讨论】:

    • 我只想知道它是否触发了浏览器错误。 可以安全地假设我将给 c 的值永远不会是虚假值,即我正在测试的属性永远不会是 falseNaNnull、@ 987654337@,或''——或者,如果是其中任何一个,我将把它当作没有定义的一样对待。
    • 看来我误解了你的问题。无论如何,在 IE 中检查对象的不存在属性时应该没有问题。无论道具具有什么价值,或者它甚至不存在,都不应发生错误。可能其他原因会导致您的代码出现错误。 “very unhelpful”错误消息到底是什么?
    • 似乎无关。这是一个非常大的、由 AJAX 驱动的应用程序,其中大部分不是我开发的。
    【解决方案2】:

    我认为下面的一个可以很好地检查特定对象是否具有属性。我也经常在 Web 应用程序上使用这种方法。

     obj.hasOwnProperty('c') 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 2020-04-18
      • 1970-01-01
      相关资源
      最近更新 更多