在javascript中将NaN转换为0

时间:2011-09-24 16:49:23

标签: javascript

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

if (isNaN(a)) a = 0;

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

11 个答案:

答案 0 :(得分:496)

你可以这样做:

a = a || 0

...会将任何“假”值转换为0

“假”值是:

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

如果您愿意,可以这样:

a = a ? a : 0;

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


如果目的是测试的不仅仅是NaN,那么你可以做同样的事情,但首先进行 toNumber 转换。

a = +a || 0

这使用一元+运算符尝试将a转换为数字。这样可以将数字字符串'123'之类的内容转换为数字。

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

+['123']  // 123

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

答案 1 :(得分:25)

使用双波浪号(双​​按位NOT) - ~~ - 在JavaScript中做了一些有趣的事情。例如,您可以使用它代替Math.floor,甚至可以替代parseInt("123", 10)!它已经在网上进行了很多讨论,所以我不会介绍它为什么在这里工作,但是如果你感兴趣的话:What is the "double tilde" (~~) operator in JavaScript?

我们可以利用双波浪号的这个属性将NaN转换为数字,并且很高兴这个数字为零!

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

答案 2 :(得分:21)

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

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

答案 3 :(得分:2)

为什么不备份并且想知道为什么你在第一时间遇到NaN,而不是克服它以便继续,

如果操作的任何数字输入是NaN,则输出也将是NaN。这就是当前IEEE浮点标准的工作方式(它不仅仅是Javascript)。这种行为是出于正当理由:潜在的意图是让你不使用伪造的结果,而不会发现它是虚假的。

NaN的工作方式是,如果某些子子操作出现问题(在较低级别产生NaN),最终结果为NaN,你就是即使您的错误处理逻辑(throw / catch可能?)尚未完成,也会立即识别为错误。

NaN作为算术计算的结果始终表示在算术的细节中出现了错误。这是计算机说“需要在这里调试”的一种方式。而不是找到某种方式继续使用一些几乎没有正确的数字(真的是0你想要的吗?),为什么不找到问题并修复它。

Javascript中的一个常见问题是parseInt(...)parseFloat(...)如果给出了无意义的参数(null''等),则会返回NaN。将问题修复到可能的最低级别而不是更高级别。然后整体计算的结果很有可能有意义,并且你不会用一些幻数(0或1或其他)代替整个计算的结果。 ((parseInt(foo.value)|| 0)的技巧仅适用于总和,而不适用于产品 - 对于您希望默认值为1而不是0的产品,但如果指定的值确实为0则不起作用。)

为了便于编码,您希望函数从用户检索值,清理它,并在必要时提供默认值,如下所示:

function getFoobarFromUser(elementid) {
        var foobar = parseFloat(document.getElementById(elementid).innerHTML)
        if (isNaN(foobar)) foobar = 3.21;       // default value
        return(foobar.toFixed(2));
}

答案 4 :(得分:2)

regex怎么样?

function getNum(str) {
  return /[-+]?[0-9]*\.?[0-9]+/.test(str)?parseFloat(str):0;
}
var inputsArray = document.getElementsByTagName('input');

function computeTotal() {
  var tot = 0;
  tot += getNum(inputsArray[0].value);
  tot += getNum(inputsArray[1].value);
  tot += getNum(inputsArray[2].value);
  inputsArray[3].value = tot;
}

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



<input type="text"></input>
<input type="text"></input>
<input type="text"></input>
<input type="text" disabled></input>
<button type="button" onclick="computeTotal()">Calculate</button>
&#13;
map.put("group.1_path", "/content/path1");
map.put("group.2_path", "/content/path2");
map.put("group.p.or", "true");
&#13;
&#13;
&#13;

答案 5 :(得分:2)

例如,如果您尝试使用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则不将其视为有效数字。在OSX Mojave上通过Safari,Firefox和Chrome进行了验证。

答案 6 :(得分:1)

var i = [NaN, 1,2,3];

var j = i.map(i =>{ return isNaN(i) ? 0 : i});
console.log(j)
  

[0,1,2,3]

答案 7 :(得分:1)

更简单,更有效的方法:

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

...这会将a的任何“假”值转换为0

“假”值是:

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

答案 8 :(得分:0)

使用用户113716解决方案,这样可以避免所有那些if-else 我已经通过这种方式实现它来从文本框单元和文本框数量计算我的小计文本框。

在单位和数量文本框中编写非数字的过程中,它们的值被替换为零,因此最终发布的用户数据没有非数字。

     <script src="/common/tools/jquery-1.10.2.js"></script>
     <script src="/common/tools/jquery-ui.js"></script>

     <!----------------- link above 2 lines to your jquery files ------>





    <script type="text/javascript" >
    function calculate_subtotal(){

    $('#quantity').val((+$('#quantity').val() || 0));
    $('#unit').val((+$('#unit').val() || 0));

    var  calculated = $('#quantity').val() * $('#unit').val() ;
    $('#subtotal').val(calculated);


    }
    </script>


      <input type = "text" onChange ="calculate_subtotal();" id = "quantity"/>
      <input type = "text" onChange ="calculate_subtotal();" id = "unit"/>
      <input type = "text" id = "subtotal"/>

答案 9 :(得分:0)

请尝试这个简单的功能

var NanValue = function (entry) {
    if(entry=="NaN") {
        return 0.00;
    } else {
        return entry;
    }
}

答案 10 :(得分:0)

NaN是JS中唯一不等于自身的值 因此我们可以使用我们的信息

const x = NaN;
let y = x!=x && 0; 
y = Number.isNaN(x) && 0

我们还可以使用 Number.isNaN 代替isNaN函数,因为后者会强制将其参数转换为数字

isNaN('string')        // true which is incorrect because 'string'=='string'
Number.isNaN('string') // false