在JavaScript中将NaN转换为0

有没有办法在没有如果语句的情况下将NaN值转换为0 ?例子:

if (isNaN(a)) a = 0;

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

264954 次浏览

你可以这样做:

a = a || 0

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

“伪”值是:

  • false
  • null
  • undefined
  • 0
  • "" (空字符串)
  • NaN (Not a Number)

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

a = a ? a : 0;

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


如果意图不仅仅是测试NaN,那么你也可以这样做,但首先要进行当时转换。

a = +a || 0

它使用一元+运算符尝试将a转换为数字。这有一个额外的好处,可以将数字字符串'123'之类的东西转换为数字。

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

+['123']  // 123

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

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

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

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

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

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

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

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

NaN的工作方式是,如果在某个子-子-子操作中出现错误(在较低的级别产生NaN),最终结果将为NaN,即使你的错误处理逻辑(可能是throw/catch ?)还没有完成,你也会立即识别出错误。

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));
}

使用user113716的解决方案,顺便说一下,这是避免所有if-else的好方法,我以这种方式实现它,从文本框单位和文本框数量计算我的文本框小总数。

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

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


<!--------- link above two 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 i = [NaN, 1,2,3];


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

console.log(j)

请试试这个简单的功能

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

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

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

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

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


const inputsArray = [...document.querySelectorAll('input')];


document.getElementById("getTotal").addEventListener("click", () => {
let total = inputsArray.map(fld => getNum(fld.value)).reduce((a,b)=>a+b);
console.log(total)
});
<input type="text" />
<input type="text" />
<input type="text" />
<input type="text" disabled />
<button type="button" id="getTotal">Calculate</button>

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

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

...将a从任何“;false”;值设置为0

“falsey"值:

  • false
  • null
  • undefined
  • 0
  • "" (空字符串)
  • NaN (Not a Number)

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

NaN是JavaScript中唯一不等于自身的值,所以我们可以利用这个信息:

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