没有显式地将变量设置为数字,会产生带有后续数学函数的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吗?

原因是您正在尝试向undefined变量添加一个数字,对于JavaScript undefined + 10 for ex返回NaN,您可以尝试以下操作:

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

要了解nullundefined之间的区别,请查看以下答案:为什么null是一个对象,null和undefined之间的区别是什么?

松散类型意味着变量声明时没有它的类型,所以

var answer = 42;

是松散类型的,它只是一个通用的盒子容纳 Number42,当涉及到数字加法时,编译器知道如何将两者相加并给出结果。

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);

最新更新