有没有一种方法可以将 NaN 值转换为 0 而不使用 if 语句?例如:
if (isNaN(a)) a = 0;
每次检查我的变量真的很烦人。
有没有一种方法可以将 NaN 值转换为 0 而不使用 if 语句?例如:
if (isNaN(a)) a = 0;
每次检查我的变量真的很烦人。
a = a || 0
这将把任何“falsy”值转换为0
。
“falsy”值包括:
false
null
undefined
0
""
(空字符串)NaN
(非数字)如果您喜欢,也可以使用此方法:
a = a ? a : 0;
......这将产生与上述相同的效果。
如果意图是检测不止是NaN
,那么可以做相同的操作,但首先进行toNumber转换。
a = +a || 0
此处使用一元 + 运算符尝试将 a
转换为数字。这样做的额外好处是将像数值字符串 '123'
这样的内容转换为数字。
唯一令人意外的情况可能是如果有人传入成功被转换为数字的数组:
+['123'] // 123
在这里,我们有一个数组,只包含一个数值字符串元素。它将成功转换为数字。
在JavaScript中,使用双波浪线(双按位非)~~
可以做一些有趣的事情。例如,您可以将其用作 Math.floor
的替代品,甚至是 parseInt("123", 10)
的替代品!它已经在网络上讨论了很多次,所以我不会在这里解释为什么它起作用,但如果您感兴趣: What is the "double tilde" (~~) operator in JavaScript?
我们可以利用双波浪线的这个属性将 NaN
转换为数字,而且幸运的是,该数字是零!
console.log(~~NaN); // 0
~~
,我只是和 parseFloat()
一起使用,像这样:~~parseFloat($variable);
。非常好用 :) +1 - Rens Tillmann~~20000000000
会得到 -1474836480
。 - sidneyparseFloat(4.567)
返回 4.567
,但 ~~parseFloat(4.567)
返回 4
,因此它丢失了小数部分和小数点。 - Baz Guvenkaya编写自己的方法,并在需要数字值的任何地方使用它:
function getNum(val) {
if (isNaN(val)) {
return 0;
}
return val;
}
null
,它不会给我期望的结果0
。更多关于我的观点在这里:https://dev59.com/f3VD5IYBdhLWcg3wBWzd - Andrei BazanovNumber(val)
代替了原先的方法,因为它在无法解析时返回0。 - Andrei Bazanovnull
不是NaN
,但您为什么期望它的结果为0呢? - tshnull
不是NaN
,但你为什么期望它的结果是0呢? - tsh任何事情都需要简单而有效的解决方案:
function getNum(val) {
val = +val || 0
return val;
}
此方法将把任何“假值”转换为0。
“假值”包括:
false
null
undefined
0
""
(空字符串)NaN
(非数字)function getFoobarFromUser(elementid) {
var foobar = parseFloat(document.getElementById(elementid).innerHTML)
if (isNaN(foobar)) foobar = 3.21; // default value
return(foobar.toFixed(2));
}
我建议您使用正则表达式(regex):
const getNum = str => /[-+]?[0-9]*\.?[0-9]+/.test(str) ? parseFloat(str) : 0;
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>
如果你试图使用parseInt(),那么使用isNaN的方法是无效的。例如:
parseInt("abc"); // NaN
parseInt(""); // NaN
parseInt("14px"); // 14
n="abc"; isNaN(n) ? 0 : parseInt(n); // 0
n=""; isNaN(n) ? 0: parseInt(n); // NaN
n="14px"; isNaN(n) ? 0 : parseInt(n); // 14
简而言之,null字符串在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
var NanValue = function (entry) {
if(entry=="NaN") {
return 0.00;
} else {
return entry;
}
}
var i = [NaN, 1,2,3];
var j = i.map(i =>{ return isNaN(i) ? 0 : i});
console.log(j)
NaN
值。这不能测试所有非数字值。虽然我们可以先尝试进行toNumber转换。我会更新的。 - user113716