我正在尝试编写一个辅助函数,该函数将从<input type="text" />
转换为Number
的String
。
由于我不确定是使用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
在这里似乎与isNaN(null)
更加连贯.
为什么?
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
-
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
应用于其参数,如果结果NaN
则返回true
。由于Number(null)
是+0
,isNaN(null)
是false
。
希望这能带来一些启发...
NaN 代表 "Not a Number"。ParseFloat 和 ParseInt 返回实数和整数,所以这就像函数返回的错误。另一方面,Number(( 表示对象的值。例如,Number(false( 将输出 0。
原因似乎与parseInt
和parseFloat
的工作方式非常微妙:
如果传递给 parseInt
/parseFloat
的参数不是String
(null 不是(,则它调用返回 "[object Undefined]"
的toString(null)
。
如果第一个字符无法转换为数字,parseInt 将返回 NaN。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt