在以下示例中,我难以理解JS逻辑。我创建了一个具有属性“ bills”的对象“ x”,该属性是一个数组。在同一对象中,我添加了一个方法“ tipCalc”,该方法为x创建了两个其他属性。第一个属性是数组“ tips”。在“提示”中,“账单”的每个元素都乘以0.2、0.15或0.1;第二个属性是数组“ costs”。在“成本”中,将“账单”的每个元素添加到“提示”的每个元素中。 然后,当我将对象打印到控制台时,两个数组“ tips”和“ costs”都有元素。但是,当我尝试在函数averageCalc中计算数组“ tips”中元素的平均值并将“ x.tips”作为参数传递时,该函数将返回NaN。谁能告诉我,为什么应该返回平均值的函数却返回NaN?预先感谢!
var x = {
bills: [124, 48, 268, 180, 42],
tipCalc: function() {
this.tips = [];
this.costs = [];
for (var i = 0; i < this.bills.length; i++) {
if (this.bills[i] < 50) {
this.tips[i] = this.bills[i] * 0.2;
} else if (this.bills[i] > 50 && this.bills[i] < 200) {
this.tips[i] = this.bills[i] * 0.15;
} else {
this.tips[i] = this.bills[i] * 0.1;
}
this.costs[i] = this.bills[i] + this.tips[i]
}
}
}
x.tipCalc();
function averageCalc(arr) {
var sum = "";
var average = "";
for (i = 0; i < arr.length; i++) {
sum = sum + arr[i];
average = sum / arr.length;
}
return average
}
var j = averageCalc(x.tips);
console.log(j);
答案 0 :(得分:0)
在我看来,问题似乎全在averageCalc
函数中。您将sum
和average
都初始化为一个空字符串。这意味着后续的加法运算是在数字和字符串之间-在这种情况下,JS总是将数字强制为字符串。一方面,这意味着总和是错误的(因为将数字串联起来就可以得出)。但是,此外,当您将此字符串除以另一个字符串时,JS不知道如何处理该字符串,但是知道它无法处理将字符串除以数字,因此它返回NaN
。这就是为什么您获得结果的原因。
因此,用sum
初始化average
和0
,就可以了。 (尽管根本不需要初始化average
,在添加阵列之前,无需解决这个问题。)