Неявная установка переменной как числа приводит к NaN с последующими математическими функциями

Это не проблема как таковая - более общий вопрос.

Следующий (рабочий код) просматривает таблицу элементов корзины, выбирает цену и количество, введенные для каждого элемента, и добавляет результаты в переменную "cartTotal".

function updateCart(){
    var cartTotal = 0;
    jQ('#cartItems').find('tr').each(function(){
        $this = jQ(this);
        var price = $this.find('.itemPrice').text();
            price = Number(price.replace(/[^0-9\.]+/g,""));
        var qty = $this.find('input').val();
        var itemTotal = ( price * qty );
        cartTotal += itemTotal;
    });
    console.log(cartTotal);
};

Первоначально я объявил cartTotal, не задавая ему значение 0 - я предполагал, что при свободном наборе javascript он будет "знать", что cartTotal - это число, как только в него будут добавлены числа, так как к этому я привел понять из различных постов / статей, которые я прочитал. Но консоль вошла NaN.

Возможно, я слишком буквально воспринял "слабо типизированную" функцию. Может ли кто-то пролить свет на то, почему не дать ему начальное значение, дающее NaN?

2 ответа

Решение

Причина в том, что вы пытаетесь добавить номер к undefined переменная, для JavaScript undefined + 10 для бывших возвращается NaNВы можете попробовать это со следующим:

var cartTotal;
cartTotal += 10;
console.log(cartTotal);

Для отличного объяснения разницы между null а также undefined посмотрите на этот ответ: почему null является объектом и в чем разница между null и undefined?

Свободно типизированный означает, что переменная объявлена ​​без ее типа, поэтому

var answer = 42;

свободно напечатан, это просто общая коробка, содержащая Number 42, когда дело доходит до сложения чисел, компилятор знает, как их сложить, и выдает результат.

var cartTotal не определено, но затем вы пытаетесь использовать его, используя +=. Это не будет работать, так как JavaScript не знает, что такое тип cartTotal, поскольку вы не установили его в 0. Это не сильные типы, поэтому нет возможности узнать, как преобразовать undefined в 0.

Смотрите: Пример

var cartTotal; // Undefined
var cartTotal = 0; // Defined as number


var cartTotal;
var itemTotal = 12;
alert("Cart total type: " + typeof(cartTotal)); // Causes an ex so returns NaN.
cartTotal += itemTotal; 
alert(cartTotal);

var cartTotal = 0;
var itemTotal = 12;
alert("Cart total type: " + typeof(cartTotal));
cartTotal += itemTotal; 
alert(cartTotal);
Другие вопросы по тегам