对象属性的函数返回NaN

时间:2018-10-02 22:01:50

标签: javascript arrays object methods

在以下示例中,我难以理解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);

1 个答案:

答案 0 :(得分:0)

在我看来,问题似乎全在averageCalc函数中。您将sumaverage都初始化为一个空字符串。这意味着后续的加法运算是在数字和字符串之间-在这种情况下,JS总是将数字强制为字符串。一方面,这意味着总和是错误的(因为将数字串联起来就可以得出)。但是,此外,当您将此字符串除以另一个字符串时,JS不知道如何处理该字符串,但是知道它无法处理将字符串除以数字,因此它返回NaN。这就是为什么您获得结果的原因。

因此,用sum初始化average0,就可以了。 (尽管根本不需要初始化average,在添加阵列之前,无需解决这个问题。)