为什么 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
是有意义的。
我正在 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
是有意义的。