对于空字符串,如何将 NaN 从 parseInt 转换为 0?

IT技术 javascript nan
2021-02-08 23:13:53

是否有可能以某种方式返回 0 而不是NaN在 JavaScript 中解析值时?

在空字符串的情况下parseInt返回NaN

是否可以在 JavaScript 中做类似的事情来检查NaN

var value = parseInt(tbb) == NaN ? 0 : parseInt(tbb)

或者也许有另一个功能或 jQuery 插件可以做类似的事情?

6个回答
var s = '';

var num = parseInt(s) || 0;

当不与布尔值一起使用时,逻辑 OR ( ||) 运算符返回第一个表达式 ( parseInt(s)) 如果它可以被评估为真,否则返回第二个表达式 (0)。的返回值为parseInt('')NaN。NaN 的计算结果为 false,因此num最终设置为 0。

@Matthew 请使用术语"falsy""truthy"因为 NaN === false 是假的!但 Boolean(NaN) === Boolean(false) 为真。逻辑 OR 返回第一个表达式,如果它可以被评估为“真实”
2021-03-14 23:13:53
@markzzz var nextIphone = parseInt("4S") + 1; // wow it works!
2021-03-22 23:13:53
如果 s="4s",这将不起作用;(它返回 4...这是不正确的...)
2021-04-02 23:13:53
@markzzz 再次阅读问题。OP 询问:“是否有可能以某种方式返回 0 而不是 NaN ”。OP 不想检查特定字符串是否可解析为 int。OP 想要获取0而不是NaN. 这被 Matt 的代码完美解决了。
2021-04-05 23:13:53
js中的parseInt函数解析字符串中的任何数字
2021-04-09 23:13:53

您还可以使用该isNaN()功能:

var s = ''
var num = isNaN(parseInt(s)) ? 0 : parseInt(s)
@GeorgeJempty 默认基数为“10”;该参数是可选的。打电话parseInt()两次的好点子
2021-03-14 23:13:53
@AutumnLeonard 这只是一种真实。如果您的字符串以 0 开头,则假定该数字为八进制格式,因此 parseInt('077') 为您提供 63。这可能会导致很难找到错误,因此您应该始终指定第二个参数。参见例如stackoverflow.com/questions/8763396/...
2021-03-27 23:13:53
为什么要打parseInt(s)两次电话此外应该是parseInt(s, 10)
2021-03-29 23:13:53

我很惊讶没有看到有人提到使用Number(). 如果提供的话,它会解析小数,因此其行为与 不同parseInt(),但它已经假定基数为 10,并且会将 "" 甚至 " " 变为 0。

是的,从 localStorage 读取非常方便: Number(localStorage.getItem('appBanner.count')) + 1
2021-03-16 23:13:53
虽然这适用于被问到的问题,但它仍然为非数字非空白字符返回 NaN
2021-04-03 23:13:53

问题

其他答案没有考虑到这0是假的,因此以下将是 20 而不是 0:

const myNumber = parseInt('0') || 20; // 20

解决方案

我提出了一个辅助函数,它解决了大部分问题:

function getNumber({ value, defaultValue }) {
  const num = parseInt(value, 10);
  return isNaN(num) ? defaultValue : num;
}

辅助函数将给出以下结果:

getNumber({ value: "0", defaultValue: 20 }); // 0
getNumber({ value: "2", defaultValue: 20 }); // 2
getNumber({ value: "2.2", defaultValue: 20 }); // 2
getNumber({ value: "any string", defaultValue: 20 }); // 20
getNumber({ value: undefined, defaultValue: 20 }); // 20
getNumber({ value: null, defaultValue: 20 }); // 20
getNumber({ value: NaN, defaultValue: 20 }); // 20
getNumber({ value: false, defaultValue: 20 }); // 20
getNumber({ value: true, defaultValue: 20 }); // 20
请将基数发送到 parseInt: parseInt(string, radix),考虑一下:在某些浏览器中parseInt("0x10") === 16parseInt("010")可能产生8
2021-03-27 23:13:53
如果您已经依赖 lodash 来处理其他事情,那么有一个方便的defaultTo函数可以做到这一点:_.defaultTo(NaN, -1)returns -1,but _.defaultTo(0, -1);returns 0
2021-03-27 23:13:53
这是一个很好的观点!你只能依靠 || 最后,当您的首选默认值为零时提供正确的默认值(当然,这是 OP 想要的)。正如您所提到的,由于 '0' 输入的虚假性质,在这种情况下它被视为无效输入,并且该语句将返回默认值(可能不是预期的!)
2021-03-29 23:13:53
当然你应该使用 const 而不是调用parseInt两次
2021-04-03 23:13:53

对于不受 限制的人parseInt,您可以使用按位 OR 运算符(隐式调用ToInt32其操作数)。

var value = s | 0;

// NaN | 0     ==>> 0
// ''  | 0     ==>> 0
// '5' | 0     ==>> 5
// '33Ab' | 0  ==>> 0
// '0x23' | 0  ==>> 35
// 113 | 0     ==>> 113
// -12 | 0     ==>> -12
// 3.9 | 0     ==>> 3

注意:ToInt32不同于parseInt. (即parseInt('33Ab') === 33

但是:'10000000000' | 0 === 1410065408
2021-03-16 23:13:53
@trincot 是的,任何值 >=Math.pow(2, 31)都会溢出。
2021-03-30 23:13:53