有没有一种方法将NaN值转换为0而不使用if语句?例子:

if (isNaN(a)) a = 0;

每次检查我的变量都很烦人。


当前回答

如果您试图使用parseInt(),则使用isNaN的方法将不起作用。例如,

parseInt("abc"); // NaN
parseInt(""); // NaN
parseInt("14px"); // 14

但在第二种情况下,isNaN产生false(即,空字符串是一个数字)。

n="abc"; isNaN(n) ? 0 : parseInt(n); // 0
n=""; isNaN(n) ? 0: parseInt(n); // NaN
n="14px"; isNaN(n) ? 0 : parseInt(n); // 14

总而言之,空字符串被isNaN视为有效数字,而不是parseInt()。它已在macOS v10.14 (Mojave)上的Safari, Firefox和Chrome上进行了验证。

其他回答

我建议你使用正则表达式:

const getNum = str => /[-+]?[0-9]*\.?[0-9]+/.test(str) ? parseFloat(str) : 0;

下面的代码将忽略NaN,以允许计算正确输入的数字:

几点getNum str = => /[-+]?[ 0] * \ 0 - 9] + - ?[。(str)测试?欧芹(str): 输入]; getElementById (getTotal”)的文件。addEventListener(点击)=> 使共=滴哩。文件夹(fld => getNum(fld.value) .reduce(a、b)=>a+b); 控制台日志(总量)。 }); <输入类型=“文本”/> <输入类型=“文本”/> <输入类型=“文本”/> <输入类型=“文本”disabled /> <巴顿打字=“巴顿”id=“getall”>Calculate</按钮>

你可以这样做:

a = a || 0

...这将把a从任何“假”值转换为0。

“伪”值是:

假 零 未定义的 0 ""(空字符串) NaN(非数字)


如果你喜欢,也可以这样:

a = a ? a : 0;

...这和上面的效果是一样的。


如果意图不仅仅是测试NaN,那么您可以做同样的事情,但首先要做toNumber转换。

a = +a || 0

它使用一元+运算符将a转换为数字。这有一个额外的好处,可以将数字字符串“123”转换为数字。

唯一意想不到的事情可能是,如果有人传递一个可以成功转换为数字的数组:

+['123']  // 123

这里我们有一个数组,它有一个成员是数字字符串。它将成功地转换为一个数字。

使用双波浪号(双位NOT) - ~~ -在JavaScript中做了一些有趣的事情。例如,你可以用它来代替数学。floor或甚至作为parseInt("123", 10)的替代!在网络上已经讨论过很多次了,所以我不会在这里解释为什么它可以工作,但如果你感兴趣的话:JavaScript中的“双波浪号”(~~)操作符是什么?

我们可以利用双波浪号的这个属性将NaN转换为一个数字,幸运的是,这个数字是零!

console.log(~~NaN);0

如果您试图使用parseInt(),则使用isNaN的方法将不起作用。例如,

parseInt("abc"); // NaN
parseInt(""); // NaN
parseInt("14px"); // 14

但在第二种情况下,isNaN产生false(即,空字符串是一个数字)。

n="abc"; isNaN(n) ? 0 : parseInt(n); // 0
n=""; isNaN(n) ? 0: parseInt(n); // NaN
n="14px"; isNaN(n) ? 0 : parseInt(n); // 14

总而言之,空字符串被isNaN视为有效数字,而不是parseInt()。它已在macOS v10.14 (Mojave)上的Safari, Firefox和Chrome上进行了验证。

编写自己的方法,并在任何需要数值的地方使用它:

function getNum(val) {
   if (isNaN(val)) {
     return 0;
   }
   return val;
}