9

如果可能的话,最好的方法是查看 Javascript 中预定义函数的底层代码。是否有说明这些代码是如何编码的文档,或者是实际查看底层代码的简单方法?

  • parseInt
  • parseFloat
  • isNaN
4

3 回答 3

7

它们是本机函数,并且可能以您的 JS 引擎编写的语言编码 - 您需要联系它的源代码。

但是,您可能对描述算法如何工作的EcmaScript 规范更感兴趣。

如果幸运的话,对于某些功能,您甚至可能会找到 JS 等价物。您会在根据标准测试 ES 实现的页面上找到它们。

于 2013-03-20T20:40:37.933 回答
3

进一步查看后,我在 ECMAScript 规范中发现了这一点。 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

当调用 parseInt 函数时,会执行以下步骤:

  1. 让 inputString 为 ToString(string)。
  2. 令 S 是 inputString 的一个新创建的子字符串,由不是 StrWhiteSpaceChar 的第一个字符和该字符之后的所有字符组成。(换句话说,删除前导空格。)如果 inputString 不包含任何此类字符,则令 S 为空字符串。
  3. 设符号为 1。
  4. 如果 S 不为空且 S 的第一个字符是减号 -,则令符号为 1。
  5. 如果 S 不为空并且 S 的第一个字符是加号 + 或减号 -,则从 S 中删除第一个字符。
  6. 令 R = ToInt32(radix)。
  7. 让 stripPrefix 为真。
  8. 如果 R  0,则 © Ecma International 2011 105 a. 如果 R < 2 或 R > 36,则返回 NaN。湾。如果 R  16,让 stripPrefix 为假。
  9. 否则,R = 0 a。令 R = 10。
  10. 如果 stripPrefix 为真,则 a. 如果 S 的长度至少为 2,并且 S 的前两个字符是“0x”或“0X”,则从 S 中删除前两个字符并令 R = 16。
  11. 如果 S 包含任何不是 radix-R 数字的字符,则令 Z 是 S 的子串,由第一个此类字符之前的所有字符组成;否则,令 Z 为 S。
  12. 如果 Z 为空,则返回 NaN。
  13. 令 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 表示法表示的值。)
    1. 令 number 为 mathInt 的 Number 值。
    2. 返回符号数字。注意 parseInt 只能将字符串的前导部分解释为整数值;它忽略任何不能被解释为整数表示法的一部分的字符,并且没有给出任何此类字符被忽略的指示。

当调用 parseFloat 函数时,会执行以下步骤:

  1. 让 inputString 为 ToString(string)。
  2. 令 trimmedString 是 inputString 的一个子字符串,它由不是 StrWhiteSpaceChar 的最左侧字符和该字符右侧的所有字符组成。(换句话说,删除前导空格。)如果 inputString 不包含任何此类字符,则让 trimmedString 为空字符串。
  3. 如果 trimmedString 和 trimmedString 的任何前缀都不满足 StrDecimalLiteral 的语法(见 9.3.1),则返回 NaN。
  4. 令 numberString 为 trimmedString 的最长前缀,它可能是 trimmedString 本身,满足 StrDecimalLiteral 的语法。
  5. 返回 numberString 的 MV 的 Number 值。

注意 parseFloat 可能仅将字符串的前导部分解释为数字值;它忽略任何不能被解释为十进制文字符号的一部分的字符,并且没有给出任何此类字符被忽略的指示。

如果参数强制为 NaN,则返回 true,否则返回 false。

  1. 如果 ToNumber(number) 为 NaN,则返回 true。
  2. 否则,返回假。注意 ECMAScript 代码测试值 X 是否为 NaN 的一种可靠方法是 X !== X 形式的表达式。当且仅当 X 为 NaN 时结果才为真。
于 2013-03-20T20:43:15.983 回答
0

这些功能是特定于浏览器的实现,而不是用 JS 编写的(除非有人决定用 JS 编写浏览器引擎)。不保证代码在不同环境中是相同的,尽管它们必须(理论上)遵守 ECMAScript 规范的行为。

于 2013-03-20T20:43:28.993 回答