在javascript中将NaN转换为0

2020/10/10 13:21 · javascript ·  · 0评论

没有if语句,有没有办法将NaN值转换为0:

if (isNaN(a)) a = 0;

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

你可以这样做:

a = a || 0

...这会将a的“ falsey”值转换为0

“假”值是:

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

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

a = a ? a : 0;

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


如果要测试的不仅仅是NaN,则可以执行相同的操作,但首先进行toNumber转换。

a = +a || 0

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

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

+['123']  // 123

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

使用双波浪号(双​​按位NOT)-~~在JavaScript中做了一些有趣的事情。例如,您可以使用它代替Math.floor甚至替代它parseInt("123", 10)网上已经对此进行了很多讨论,所以我不会在这里解释为什么它起作用,但是如果您有兴趣的话,JavaScript中的“双波浪号”(~~)运算符是什么?

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

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

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

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

更简单有效的方法:

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

...这会将a的“ falsey”值转换为0

“假”值是:

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

与其将其混为一谈以使您可以继续,不如不备份并想知道为什么首先要遇到NaN?

如果操作的任何数字输入为NaN,则输出也将为NaN。这就是当前IEEE浮点标准的工作方式(不仅仅是Javascript)。该行为是有充分理由的:潜在目的是防止您使用假结果而不意识到它是假的。

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

作为算术运算结果的NaN始终表示在算术细节方面出现了问题。这是计算机说“这里需要调试”的一种方式。与其找到某种方法来继续用几乎不可能的数字继续下去(真的是0就是您想要的?),不如找到问题并解决它。

在Javascript中一个常见的问题是,无论是parseInt(...)parseFloat(...)如果给一个荒谬的说法(将返回NaN的null''等等)。在最低级别(而不是更高级别)上解决问题。这样一来,整个计算的结果就有很大的道理,而您并没有用魔术数(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));
}

怎么样一个正则表达式

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

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

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

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

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

console.log(j)

[0,1,2,3]

使用用户113716解决方案,这很好地避免了所有这些问题,否则我已经实现了这种方法,可以根据文本框单位和文本框数量计算小计文本框。

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

     <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"/>

请尝试这个简单的功能

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

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 
本文地址:http://javascript.askforanswer.com/zaijavascriptzhongjiangnanzhuanhuanwei0.html
文章标签:
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!