Неявная установка переменной как числа приводит к 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);