【问题标题】:Convert NaN to 0 in JavaScript在javascript中将NaN转换为0
【发布时间】:2011-11-24 07:40:33
【问题描述】:

有没有一种方法可以在不使用 if 语句的情况下将 NaN 值转换为 0:

if (isNaN(a)) a = 0;

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

【问题讨论】:

  • 你不能把它变成一个函数吗?
  • 这只有20个字符,有什么问题?
  • function noNaN( n ) { return isNaN( n ) ? 0 : n; } 然后只是noNaN( a )
  • @rfausak 你通常不想重复自己(见DRY)。如果某个功能需要多次使用,则首选专用功能。

标签: javascript


【解决方案1】:

你可以这样做:

a = a || 0

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

“虚假”值是:

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

如果您愿意,也可以这样做:

a = a ? a : 0;

...效果和上面一样。


如果您的意图不仅仅是测试 NaN,那么您也可以这样做,但首先进行 toNumber 转换。

a = +a || 0

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

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

+['123']  // 123

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

【讨论】:

  • 把验证变成函数的思路不错,不过这个更优雅。
  • @Bakudan:好点子。我在想 OP 只关心特定的 NaN 值。这不适用于所有非数字值的测试。虽然我们可以先尝试 toNumber 转换。我会更新的。
  • ...啊,是因为标题“Convert NaN to 0”。无论如何,现在两种方式都涵盖了。
  • 谢谢伙计,为我自己选择并修改了一点 a = a*1 || 0
  • 太棒了。谢谢
【解决方案2】:

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

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

【讨论】:

【解决方案3】:

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

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

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

【讨论】:

  • 谢谢,我根本不知道这个~~,我只是将它与parseFloat() 一起使用,就像这样:~~parseFloat($variable);。非常整洁:) +1
  • 警告~~20000000000 给出-1474836480
【解决方案4】:

与其拼凑它以便您可以继续,为什么不备份并想知道为什么您首先会遇到 NaN?

如果运算的任何数字输入为 NaN,则输出也将为 NaN。这就是当前 IEEE 浮点标准的工作方式(不仅仅是 Javascript)。这种行为有一个很好的理由:潜在的目的是防止您在没有意识到它是虚假的情况下使用虚假结果。

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

NaN 作为算术计算的结果总是 表示算术的细节出现了问题。这是计算机说“此处需要调试”的一种方式。与其想办法继续用一些几乎永远不正确的数字(0 真的是你想要的吗?),为什么不找到问题并解决它。

Javascript 中的一个常见问题是,如果给定一个无意义的参数(null'' 等),parseInt(...)parseFloat(...) 都将返回 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));
}

【讨论】:

    【解决方案5】:

    使用用户 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"/>
    

    【讨论】:

      【解决方案6】:

          var i = [NaN, 1,2,3];
      
          var j = i.map(i =>{ return isNaN(i) ? 0 : i});
          
          console.log(j)

      【讨论】:

        【解决方案7】:

        请试试这个简单的功能

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

        【讨论】:

          【解决方案8】:

          regex 怎么样?

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

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

          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;
          }
          <input type="text"></input>
          <input type="text"></input>
          <input type="text"></input>
          <input type="text" disabled></input>
          <button type="button" onclick="computeTotal()">Calculate</button>

          【讨论】:

            【解决方案9】:

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

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

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

            “虚假”值是:

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

            【讨论】:

            • 有趣!只是想知道当 val 可以是负值时它会如何反应。据我测试,这没有什么问题,但以防万一......
            【解决方案10】:

            如果您尝试使用 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 验证。

            【讨论】:

            • 一个明显的解决方案有点麻烦,在 parseInt 之后检查 NaN,而不是之前: isNaN(parseInt(n)) ?解析整数(n):0; // 调用 parseInt 两次 :(
            • 那条评论应该是(开始)你的答案!
            • 一个更有效的解决方案假设空字符串是唯一的异常:n=="" ||是NaN(n) 吗? 0:解析整数(n); (但如果还有其他字符串呢?)
            【解决方案11】:

            NaN 是 JS 中唯一不等于自身的值 所以我们可以利用这些信息对我们有利

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

            我们也可以使用 Number.isNaN 代替 isNaN 函数,因为后者将其参数强制为 number

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

            【讨论】:

              猜你喜欢
              • 2013-04-26
              • 2020-02-08
              • 2018-03-07
              • 1970-01-01
              • 2013-01-21
              • 2023-01-20
              • 1970-01-01
              • 2017-01-10
              • 1970-01-01
              相关资源
              最近更新 更多