为什么 IF 语句会影响一个对象是否被定义?

Why is an IF statement affecting whether an object is defined?

我正在 mod为游戏 mod 整理一些 JavaScript 的 returns 信息供 HTML 使用。

最初这段代码如下所示:

  model.foreign_intelligence = ko.computed(function () {
    var primary = model.selection.system().star.ai()
    var commanders = []
    if (primary) {
      commanders.push(intelligence(primary))
      if (primary.minions) {
        commanders = commanders.concat(primary.minions.map(intelligence))
      }
      if (primary.foes) {
        commanders = commanders.concat(primary.foes.map(intelligence))
      }
    }
    return commanders
  })

出于 HTML 布局原因,我想将 primary.foes 移动到一个单独的块中。经过一番摆弄后,我得到了以下结果:

  model.ffa_opponents = ko.computed(function () {
    var primary = model.selection.system().star.ai()
    var commanders = []
    if (primary) {
      if (primary.foes) {
        commanders = primary.foes.map(intelligence)
      }
    }
    return commanders
  })

虽然我被某件事难住了,那就是如果我删除 if (primary) 检查 if (primary.foes),那么 primary.foes 会返回为未定义 我得到一个“Cannot read property 'foes' of undefined”异常。我不明白为什么 IF 检查能够影响对象的存在。

不幸的是,我对 JavaScript 的了解非常有限,我主要是通过暴力破解问题。我希望有人可以解释,然后也许建议应该如何更好地构建这段代码。令我印象深刻的是,这种 IF 嵌套是不必要的,但这是迄今为止我让它工作的唯一方法。

这是检查对象是否为 null 和 undefined 的特定语言。 但这不适用于检查空数组。检查数组是否为空使用长度检查:

您可以简单地编写代码:

model.ffa_opponents = ko.computed(function () {
    var primary = model.selection.system().star.ai();
    var commanders = [];
    if (primary && primary.foes) {
       commanders = primary.foes.map(intelligence);
    }

    return commanders;   
})

虽然你写 "...然后 primary.foes 返回未定义",你在评论中确认实际错误消息是:

Cannot read property 'foes' of undefined

...这意味着 primary 本身是未定义的。

在JavaScript中undefined是一个"falsy"值,所以当你做if (primary)primary未定义时,它不会执行if块.所以 if 是有意义的。