在JavaScript中将NaN转换为0
有没有办法将NaN值转换为0没有if语句:
if (isNaN(a)) a = 0;
每次检查我的variables是非常烦人的。
你可以这样做:
a = a || 0
…将从任何“falsey”值转换为0
。
“错误”的价值是:
-
false
-
null
-
undefined
-
0
-
""
(空string) -
NaN
(不是数字)
或者,如果你喜欢:
a = a ? a : 0;
…将具有与上述相同的效果。
编辑:
如果意图testing的不仅仅是NaN
,那么你可以做同样的事情,但是先做一个toNumber转换。
a = +a || 0
这使用一元+运算符来尝试将a
转换为数字。 这有附加的好处,如数字string'123'
转换为数字。
唯一的意外的事情可能是如果有人传递一个可以成功转换为数字的数组:
+['123'] // 123
这里我们有一个数组,它有一个数字string的单个成员。 它将成功转换为一个数字。
写你自己的方法,并在任何你想要的数值使用它:
function getNum(val) { if (isNaN(val)) { return 0; } return val; }
使用双撇号(双位不) – 在JavaScript中做一些有趣的事情。 例如,你可以使用它来代替Math.floor
,甚至可以作为parseInt("123", 10)
的替代方法! 在networking上已经讨论了很多,所以我不会为什么在这里工作,但是如果你感兴趣的话: JavaScript中的“double tilde”(~~)运算符是什么?
我们可以利用这个double-tilde属性将NaN
转换成一个数字,并且幸运的是这个数字是零!
console.log(~~NaN); // 0
而不是为了让你继续下去,为什么不备份并想知道为什么你会遇到NaN呢?
如果某个操作的任何数字input是NaN,则输出也将是NaN。 这就是当前的IEEE浮点标准的工作方式(不仅仅是Javascript)。 这种行为有一个很好的理由 :潜在的意图是阻止你使用虚假结果而不意识到它是假的。
NaN的工作方式是,如果某些子子操作(在较低级别生成NaN)出现问题,则最终结果也将是NaN,即使您的操作系统error handling逻辑(throw / catch也许?)尚未完成。
作为算术计算结果的NaN 总是表明在算术细节上出现了某些错误。 这是计算机说“这里需要debugging”的一种方法。 而不是find某种方式来继续使用一些几乎没有问题的数字(真的是你想要的?),为什么不find问题并修复它。
在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)); }
使用用户113716解决scheme,这是很好的,以避免所有这些如果 – 其他我已经实现了这种方式来计算我的小计文本框从文本框单位和文本框数量。
在单位和数量文本框中编写非数字的过程中,它们的值被replace为零,所以用户数据的最终发布没有非数字。
<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 i = [NaN, 1,2,3]; var j = i.map(i =>{ return isNaN(i) ? 0 : i});
console.log(j)
[0,1,2,3]
请尝试这个简单的function
var NanValue = function (entry) { if(entry=="NaN") { return 0.00; } else { return entry; } }
谢谢
最stream行的答案为我工作,也可以混合多种算术运算,如:
(((400-200)*100)/750 || 0).toFixed(1);