我正在尝试编写一个辅助函数,该函数会将String
的{{1}}转换为<input type="text" />
。
由于我不确定是使用Number
还是parseFloat(str)
,所以我仔细检查了它们如何处理可能存在问题的参数。
请参阅:
Number(str)
console.log(Number(null)); // 0
console.log(parseFloat(null)); // NaN
console.log(parseInt(null)); // NaN
console.log(isNaN(null)); // false
和parseFloat
都返回parseInt
,而NaN
返回Number
。 0
在这里与Number
更加连贯。
那是为什么?
答案 0 :(得分:3)
Number
构造函数尝试将参数强制为number。因此,空字符串'',false
,null
和所有伪造的值都变为0。
类似地,Number(true)
将返回1。Number('some string')
将是NaN
,因为“某些字符串”无法转换为数字。
请注意,如注释中所指出,Number(undefined)
是NaN,在算术运算中不是0。 (在此处https://codeburst.io/understanding-null-undefined-and-nan-b603cb74b44c阅读)
在此处了解更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number
答案 1 :(得分:2)
parseInt/Float
将其参数转换为字符串,从左边开始逐字符读取字符,然后尝试从发现的内容中得出一个数字。由于String(null)
为"null"
,并且十进制数字不能以"n"
开头,因此parseInt(null)
将为NaN
。如果您提供不同的底数,其中n
,u
和l
是数字,则结果将不同:
console.log(parseInt(null, 32))
Number
将其参数整体转换为数字。 Number(null)
返回+0
是因为ECMA委员会希望它:http://www.ecma-international.org/ecma-262/7.0/#sec-tonumber。这可能是出于历史原因。
全局isNaN
(不要与Number.isNaN
混淆)将Number
应用于其自变量,如果结果为true
,则返回NaN
。由于Number(null)
是+0
,所以isNaN(null)
是false
。
希望这能为您提供一些启示...
答案 2 :(得分:0)
NaN代表“非数字”。 ParseFloat和ParseInt返回实数和整数,因此就像该函数返回的错误一样。另一方面,Number()表示对象的值。例如,Number(false)将输出0。
答案 3 :(得分:0)
parseInt
和parseFloat
的工作原理似乎很微妙:
如果传递给parseInt
/ parseFloat
的参数不是String
(不是null),则它将调用toString(null)
并返回"[object Undefined]"
。
如果第一个字符不能转换为数字,则parseInt返回NaN。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt