进一步查看后,我在 ECMAScript 规范中发现了这一点。
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
当调用 parseInt 函数时,会执行以下步骤:
- 让 inputString 为 ToString(string)。
- 令 S 是 inputString 的一个新创建的子字符串,由不是 StrWhiteSpaceChar 的第一个字符和该字符之后的所有字符组成。(换句话说,删除前导空格。)如果 inputString 不包含任何此类字符,则令 S 为空字符串。
- 设符号为 1。
- 如果 S 不为空且 S 的第一个字符是减号 -,则令符号为 1。
- 如果 S 不为空并且 S 的第一个字符是加号 + 或减号 -,则从 S 中删除第一个字符。
- 令 R = ToInt32(radix)。
- 让 stripPrefix 为真。
- 如果 R 0,则 © Ecma International 2011 105 a. 如果 R < 2 或 R > 36,则返回 NaN。湾。如果 R 16,让 stripPrefix 为假。
- 否则,R = 0 a。令 R = 10。
- 如果 stripPrefix 为真,则 a. 如果 S 的长度至少为 2,并且 S 的前两个字符是“0x”或“0X”,则从 S 中删除前两个字符并令 R = 16。
- 如果 S 包含任何不是 radix-R 数字的字符,则令 Z 是 S 的子串,由第一个此类字符之前的所有字符组成;否则,令 Z 为 S。
- 如果 Z 为空,则返回 NaN。
- 令 mathInt 为由 Z 以 radix-R 表示法表示的数学整数值,使用字母 AZ 和 az 表示值为 10 到 35 的数字。(但是,如果 R 为 10 且 Z 包含超过 20 个有效数字,则每个有效数字根据实现的选择,第 20 位之后的数字可以替换为 0 数字;如果 R 不是 2、4、8、10、16 或 32,则 mathInt 可能是数学整数的依赖于实现的近似由 Z 以 radix-R 表示法表示的值。)
- 令 number 为 mathInt 的 Number 值。
- 返回符号数字。注意 parseInt 只能将字符串的前导部分解释为整数值;它忽略任何不能被解释为整数表示法的一部分的字符,并且没有给出任何此类字符被忽略的指示。
当调用 parseFloat 函数时,会执行以下步骤:
- 让 inputString 为 ToString(string)。
- 令 trimmedString 是 inputString 的一个子字符串,它由不是 StrWhiteSpaceChar 的最左侧字符和该字符右侧的所有字符组成。(换句话说,删除前导空格。)如果 inputString 不包含任何此类字符,则让 trimmedString 为空字符串。
- 如果 trimmedString 和 trimmedString 的任何前缀都不满足 StrDecimalLiteral 的语法(见 9.3.1),则返回 NaN。
- 令 numberString 为 trimmedString 的最长前缀,它可能是 trimmedString 本身,满足 StrDecimalLiteral 的语法。
- 返回 numberString 的 MV 的 Number 值。
注意 parseFloat 可能仅将字符串的前导部分解释为数字值;它忽略任何不能被解释为十进制文字符号的一部分的字符,并且没有给出任何此类字符被忽略的指示。
如果参数强制为 NaN,则返回 true,否则返回 false。
- 如果 ToNumber(number) 为 NaN,则返回 true。
- 否则,返回假。注意 ECMAScript 代码测试值 X 是否为 NaN 的一种可靠方法是 X !== X 形式的表达式。当且仅当 X 为 NaN 时结果才为真。