为什么这种添加会导致NaN?

时间:2014-03-11 14:16:56

标签: javascript jquery

我尝试添加价格以查找总数,但console.log打印NaN或只重复该数字:

这是我的JavaScript代码:

var qt_articles = new Array();
var tab_prix = new Array();

function print_nb_article(article, nb){
    $('#top_ten_nb_'+article).text(nb);
    var prix = $('#top_ten_nb_'+article+'_prix').val();
    var prix_tt =  $('.prix_'+article).text(prix*nb);


    if (prix_tt > 0) tab_prix.push(prix_tt);
    for(i=0; i<tab_prix.length; i++){
        prix_global += parseFloat(tab_prix[i]);
        console.log(prix_global);
    }
}

$('#plus_veste').click(function() {
    veste++;
    print_nb_article('veste', veste);
    return false;
});

我的HTML:

<span id="prix_global">0</span>

问题出在哪里?

2 个答案:

答案 0 :(得分:4)

因为您没有初始化prix_global。添加

var prix_global = 0;

在某些浏览器中,由于id(但从未对span的解析内容进行处理),它将初始化为元素。如果您尝试添加跨度的初始值,请执行

var prix_global = parseFloat(document.getElementById('prix_global').innerHTML);
... computations... 
document.getElementById('prix_global').innerHTML = prix_global;

更一般地说,请注意变量的初始化(另请参阅veste)及其解析(您prix*nb幸运)。

答案 1 :(得分:1)

我看到几个问题,用评论突出显示:

var qt_articles = new Array();
var tab_prix = new Array();

function print_nb_article(article, nb) {
    $('#top_ten_nb_' + article).text(nb);
    var prix = $('#top_ten_nb_' + article + '_prix').val();
    // Note 1: Below, `prix_tt` will be a jQuery object, not a string or number.
    // You might want to set `prix_tt`, *then* set it as the text of the element.
    var prix_tt = $('.prix_' + article).text(prix * nb);

    // Note 2: So this comparison will compare `"[object Object]"` to `"0"`,
    // and get `false`. This'll get fixed if you fix the above.
    if (prix_tt > 0) tab_prix.push(prix_tt);
    for (i = 0; i < tab_prix.length; i++) {
        // Note 3: If the push *had* happened, here you'd be retrieving
        // the object and trying to parse `"[object Object]"` as a number.
        // This would also get fixed by the above.
        // Note 4: You're not setting `prix_global` to `0` before the loop,
        // so either it's `undefined` or you're going to get the wrong total
        prix_global += parseFloat(tab_prix[i]);
        console.log(prix_global);
    }

    // Note 5: Do you ever do anything with `prix_global`??
}

$('#plus_veste').click(function () {
    veste++;
    print_nb_article('veste', veste);
    return false;
});

另请注意,您不会在任何地方声明i(您用于循环的变量),因此您几乎肯定会成为The Horror of Implicit Globals的牺牲品。这也适用于veste,除非它被宣布在你没有展示的地方(可能还有其他地方)。

所以要解决它:

  1. 可能会将注释1下的代码更改为:

    var prix_tt = prix * nb;
    $('.prix_' + article).text(prix_tt);
    
  2. 在您需要的最里面的范围内声明变量。

  3. 在循环之前将prix_global设置为0

  4. 在计算完毕后对prix_global执行某些操作。

  5. 我会做的其他事情:

    • 摆脱全局变量。你几乎肯定不需要它们。

    • 使用[]而不是new Array()来创建数组。