在javascript中将NaN转换为0

IT技术 javascript
2021-01-13 20:13:20

有没有办法在没有 if 语句的情况下将 NaN 值转换为 0:

if (isNaN(a)) a = 0;

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

6个回答

你可以这样做:

a = a || 0

...这会将 a 从任何“falsey”值转换为0.

“falsey”值是:

  • false
  • null
  • undefined
  • 0
  • "" (空字符串)
  • NaN (不是数字)

或者这个,如果你喜欢:

a = a ? a : 0;

...这将具有与上述相同的效果。


如果意图不仅仅是测试NaN,那么您可以执行相同的操作,但首先进行toNumber转换。

a = +a || 0

这使用一元 + 运算符来尝试转换a为数字。这具有将数字字符串等内容转换为数字的额外好处'123'

唯一出乎意料的可能是,如果有人传递了一个可以成功转换为数字的数组:

+['123']  // 123

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

...啊,这是因为标题"Convert NaN to 0"无论如何,现在涵盖了两种方式。
2021-03-21 20:13:20
惊人的。谢谢
2021-03-29 20:13:20
@Bakudan:好点。我在想 OP 只关心具体的NaNvalue。这不适用于所有非数字值的测试。虽然我们可以先尝试 toNumber 转换。我会更新。
2021-04-02 20:13:20
把验证变成函数的想法很好,但是这个更优雅。
2021-04-04 20:13:20
谢谢伙计,为自己选择并修改了一些 a = a*1 || 0
2021-04-11 20:13:20

使用双波浪号(double bitwise NOT) - ~~- 在 JavaScript 中做了一些有趣的事情。例如,您可以使用它来代替Math.floor甚至替代parseInt("123", 10)! 它在网络上已经讨论了很多,所以我不会在这里介绍它的工作原理,但是如果您有兴趣:JavaScript 中的“双波浪号”(~~) 运算符是什么?

我们可以利用双波浪号的这个特性来转换NaN为一个数字,很高兴这个数字为零!

console.log(~~NaN); // 0

谢谢,我根本不知道这个~~,我只是把它和parseFloat()这样的一起使用~~parseFloat($variable);非常整洁:) +1
2021-04-03 20:13:20

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

function getNum(val) {
   if (isNaN(val)) {
     return 0;
   }
   return val;
}
除了我上面的评论之外,我最终使用Number(val)了它0,因为它无论如何都无法弄清楚它会返回
2021-03-19 20:13:20
如果我传入,null那么它不会给我预期的结果0更多关于我的观点:stackoverflow.com/questions/115548/why-is-isnannull-false-in-js
2021-04-09 20:13:20

对任何事情都更简单有效:

function getNum(val) {
   val = +val || 0
   return val;
}

...这会将 a 从任何“falsey”值转换为0.

“falsey”值是:

  • false
  • null
  • undefined
  • 0
  • "" (空字符串)
  • NaN (不是数字)
有趣的!只是想知道当 val 可能是负值时它会如何反应。据我测试,这没有任何问题,但以防万一......
2021-03-16 20:13:20

怎么样一个正则表达式

function getNum(str) {
  return /[-+]?[0-9]*\.?[0-9]+/.test(str)?parseFloat(str):0;
}

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