Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么IF语句会影响对象是否已定义?_Javascript_Properties_Undefined_Ecmascript 5 - Fatal编程技术网

Javascript 为什么IF语句会影响对象是否已定义?

Javascript 为什么IF语句会影响对象是否已定义?,javascript,properties,undefined,ecmascript-5,Javascript,Properties,Undefined,Ecmascript 5,我正在为一个游戏模块修改一些JavaScript,该模块返回信息供HTML使用 最初,该代码如下所示: model.foreign_intelligence = ko.computed(function () { var primary = model.selection.system().star.ai() var commanders = [] if (primary) { commanders.push(intelligence(primary))

我正在为一个游戏模块修改一些JavaScript,该模块返回信息供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将返回为未定义,我将获得未定义异常的无法读取属性'foes'。我不明白为什么IF检查能够影响对象的存在


不幸的是,我对JavaScript的了解非常有限,我主要是通过暴力解决问题。我希望有人能解释一下,然后建议如何更好地构造这段代码。如果嵌套是不必要的,我会想到这一点,但到目前为止,这是我使其工作的唯一方法。

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

您只需编写以下代码:

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;   
})

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

您只需编写以下代码:

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返回为未定义,但您在评论中确认实际错误消息为:

无法读取未定义的属性“foes”

…这意味着主节点本身未定义

在JavaScript中,undefined是一个falsy值,因此当您执行if primary和primary时,它不会执行if块。因此,如果。

虽然您写了…但primary.foes返回时未定义,您在评论中确认实际错误消息为:

无法读取未定义的属性“foes”

…这意味着主节点本身未定义


在JavaScript中,undefined是一个falsy值,因此当您执行if primary和primary时,它不会执行if块。因此,有这样的假设是有意义的。

您能更详细地说明primary在您的场景中有什么价值吗?…然后primary.foes返回为未定义:我猜您误解了错误消息。它可能说primary是未定义的。在JS中,undefined是一个错误值,因此当您执行if primary和primary未定义时,它将不会执行if块。发布准确的错误消息。@epascarello它是一个局部变量,其他任何东西都无法填充它。如果@trincot是正确的,错误消息将是无法读取undefined的属性'foes'。这就是你所看到的吗?你能说更多关于primary在你的场景中有什么价值吗?…然后primary.foes又回来了,它是未定义的:我猜你误解了错误消息。它可能说primary是未定义的。在JS中,undefined是一个错误值,因此当您执行if primary和primary未定义时,它将不会执行if块。发布准确的错误消息。@epascarello它是一个局部变量,其他任何东西都无法填充它。如果@trincot是正确的,错误消息将是无法读取undefined的属性'foes'。这就是你看到的吗?主要敌人兰斯?该检查是多余的,因为如果长度为零,则无论如何都将跳过映射,如果primary.foes未定义,则将在您的条件中引发类型错误。键入错误。如果primary.foes未定义,则无法获取length属性。您是指对&&进行短路评估吗?如果primary&&primary.foes&&primary.foes.length!==0以防止错误。长度检查仍然是冗余的。primary.foes.langth?该检查是多余的,因为如果长度为零,则无论如何都将跳过映射,如果primary.foes未定义,则将在您的条件中引发类型错误。键入错误。如果primary.foes未定义,则无法获取length属性。您是指对&&进行短路评估吗?如果primary&&primary.foes&&primary.foes.length!==0以防止错误。长度检查仍然是冗余的。