JS中IF的逻辑问题

我通过JS调用WordPress的API。

number的值有时候时00,我想把这些值为00的,都变为0,这样就可以求和了。

大概代码如下:

var sum = 0;
for (i = 0; i < postsData.length;  i++) { 
    var x =postsData[i].number;
    if (x === "00") {
       x= 0;
       sum += x;
       } else {sum += x;}
}

但结果是错误的,当number是00时,则不显示求和结果,也没有错误提示.

补充:
求和的代码大概是这样的:

if (sum > 0 ) { document.getElementById("test").innerHTML = sum; }

原始代码比较复杂,是一个Nested loop.
number是字符串。
当number的值都不是两个零时,计算结果正确。
但当number的其中一个值为两个零时,不显示计算结果,也没有错误提示。我感觉是if这块写错了。当一个函数等于某个值时,可以再给这个函数赋予另一个值吗?

阅读 3.2k
5 个回答
var sumFun = function(postsData_){
    var sum = 0;
    for (var i = 0; i < postsData_.length;  i++) { 
        var x =postsData_[i];
        if (x === "00") {
           x= 0;
           sum += x;
           } else {
           sum += x;
           }
    }
    return sum;
}
var postsData =['00','0','1',00,2,3];//字符串和数字混合,第1个00字符串转成数字0,相加sum还是数值0,第2个为字符串0,那么就转为字符串拼接,后续都是字符串拼接操作
console.log(sumFun(postsData));//001023 字符串
postsData =[00,1,2,3];//都是数字,数值求和
console.log(sumFun(postsData));//001023

+操作符在JS中,有如下规则

  • 当2个操作数都是数字时,执行数值加法操作;
  • 当2个操作数都是字符串是,执行字符串拼接操作
  • 优先考虑进行字符串拼接
  • 如果其中一个操作数为对象,那么就会用调用valueOf方法(日期对象调用toString方法)转成原始类型
  • 原始类型包括字符串,数值,布尔类型,null,undefined,
  • 操作数都是原始值后,如果一个操作数为字符串,那么另一个操作数也转成字符串,进行字符串拼接操作。
  • 否则,2个操作数都将转成数字或NaN,进行加法操作
// 如果不考虑 NaN 的存在
// 直接通过 Number 转格式就好了,if 都不需要
sum += x => sum += Number(x)

// 如果需要考虑其他字符导致的 NaN
x = Number(x);
if(!Number.isNaN(x)){
    sum += Number(x)
}

按照描述,你已经能确定postsData[i].number一定是数字,及时不是数字类型,也是字符串类型的数字。这样,只要把这个制转换成数字就可以实现你说的功能了,忽略00,将所有的值都转换,确保值一定是数字类型。

var sum = 0;
for (i = 0; i < postsData.length;  i++) { 
    var x =postsData[i].number;
    sum += +x; //+x作用是把字符串转成数字
}

注意知识点,js中字符串转数字最简单的方法,可以直接用+、-实现,由于-会是数值变号,所以建议使用+。

如果想数字求和,其实用Number对象,或者文本转数字parseInt显式转换处理后更好。

var sum = 0;
for (i = 0; i < postsData.length;  i++) { 
    let x =parseIn(postsData[i].number);
    sum += x; 
}
sum = eval(postsData.map(v=>v.number).join('+'))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题