【问题标题】:Why did javascript NOT throw type error when I try to access a property that does not exist? [duplicate]当我尝试访问不存在的属性时,为什么 javascript 不会引发类型错误? [复制]
【发布时间】:2016-07-02 14:28:49
【问题描述】:

当我尝试访问不存在的属性时,为什么 javascript 没有抛出类型错误?

我的代码在下面

var array = [];
var someBoolean1 = array[0] && array[0].hey;

someBoolean 的值原来是“未定义”;我预计 javaScript 会抛出类型错误;

当我这样做时

var array = [];
var someBoolean2 = array[0].hey;

按预期抛出类型错误。

但我不明白为什么第一个代码块中没有类型错误。 有什么想法吗?

【问题讨论】:

  • 谷歌“短路评估”
  • 是因为AND的第二部分没有执行

标签: javascript


【解决方案1】:

简答

因为在array 的索引0 处没有元素,而且更一般的说法是,属性0 没有在变量array 中定义。因此,在未定义的东西上调用属性会给你一个错误。

长答案

将所有 JavaScript 对象视为字典,如果我们提供其中存在的键,则这些字典会返回值,否则不会返回任何值。

因此,当访问像myObject.propA(与myObject["propA"]一样)这样的对象属性时,如果它存在于该对象中,则返回该属性的值,否则返回undefined,表示此属性未在myObject 中定义。

JavaScript 中的数组 ([]) 也是一种对象,数组中的每个成员实际上都是该对象的属性。所以var arr = ["asd", "fgh"] 中的一个属性可以被arr[0]arr["0"] 访问,这意味着如果arr 的属性0 存在,那么它将返回值(在本例中为“asd”),否则将返回不明确的。

提供所有这些,在未定义的东西上调用属性既不合逻辑又非法,因此引发了异常。

【讨论】:

    【解决方案2】:

    因为您明确地防范类型错误...

    array[0] && array[0].hey
    

    array[0] 未定义,所以:

    undefined && array[0].hey
    

    undefinedfalsey,所以右边不求值,所以这个表达式的结果是左边的值undefined,赋值给someBoolean1


    Tangentially...为了减少重复性,通常使用这个成语:

    var someBoolean1 = (array[0] || {}).hey;
    

    如果array[0]undefined,则将使用{},然后将访问该对象的属性.hey。如果array[0] 是具有.hey 属性的对象,您将获得它的值,否则您将安全地从整个表达式中获得undefined

    【讨论】:

      【解决方案3】:
       if (false && "any another statement is unreachable")  
         then do something;
      

      第二个表达式未计算为 array[0] false array[0].hey 未达到

      var someBoolean1 = array[0] && array[0].hey;
      

      【讨论】:

      • 你的评论太快了,正在改变
      • 您应该很高兴发布完整的答案。答案一经发布,就暴露在用户的判断之下。
      • 在 SO 中认真地说:)
      • ...是的。 Stack Overflow 是关于建立一个通用的编程知识库,而不是由谁先填写文本框。
      • 校对时间。
      【解决方案4】:

      这是因为&& 表达式的执行。 array[0] 恰好被计算为 false,因此表达式的其余部分不会被计算。

      【讨论】:

        【解决方案5】:

        没有抛出类型错误,因为你的 and 运算符是短路的,array[0] 是未定义的,这是不正确的,这意味着 javascript 不需要检查你的 and 条件的第二部分,并且不会意识到存在类型错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-19
          • 1970-01-01
          • 2019-10-17
          • 2021-03-18
          • 2021-05-30
          • 2020-12-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多