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



我正在为一个游戏mod修改一些JavaScript,该游戏mod返回供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.foes)周围的if (primary)检查,那么primary.foes将返回为未定义,我会得到一个">Cannot read property 'foes' of undefined"异常。我不明白为什么IF检查能够影响对象的存在。

不幸的是,我对JavaScript的了解非常有限,我主要是通过暴力解决问题。我希望有人能解释一下,然后可能会建议如何更好地构建代码。我突然意识到这种IF嵌套是不必要的,但这是迄今为止我让它工作的唯一方法。

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

无法读取未定义的属性"敌人">

。。。这意味着CCD_ 4本身是未定义的。

在JavaScript中,undefined是一个"falsy"值,因此当您执行if (primary)并且primary未定义时,它将不会执行if块。因此,拥有if是有意义的。

这是特定于检查对象是否为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;   
})

最新更新