javascript预定义函数的算法(parseInt,parseFloat,isNaN等)

Kin*_*rog 9 javascript native-code

如果可能的话,在Javascript中查看预定义函数的底层代码的最佳方法是什么.是否有文档显示这些是如何编码的,或者是实际查看底层代码的简单方法?

  • parseInt
  • parseFloat
  • isNaN

Ber*_*rgi 7

它们是本机函数,可能使用您的JS引擎编写的语言编写 - 您需要联系它的源代码.

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

如果你很幸运,对于某些功能你甚至可能找到一个JS等价物.你会发现它们主要是在针对标准测试ES实现的页面上.

  • 我想"一些"或"大多数"会更准确:) (2认同)

Kin*_*rog 3

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

\n\n

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

\n\n
    \n
  1. 令 inputString 为 ToString(string)。
  2. \n
  3. 令 S 为 inputString 新创建的子字符串,由第一个不是 \nStrWhiteSpaceChar 的字符以及该字符后面的所有字符组成。(换句话说,删除前导白色\n空格。)如果 inputString 不包含任何此类字符,则令 S 为空字符串。
  4. \n
  5. 令符号为1。
  6. \n
  7. 如果S不为空且S的第一个字符是减号-,则令sign为\xef\x80\xad1。
  8. \n
  9. 如果 S 不为空且 S 的第一个字符是加号 + 或减号 -,则从 S 中删除第一个字符 \n。
  10. \n
  11. 设 R = ToInt32(基数)。
  12. \n
  13. 令 stripPrefix 为 true。
  14. \n
  15. 如果 R \xef\x82\xb9 0,则 \xc2\xa9 Ecma International 2011 105\na。如果 R < 2 或 R > 36,则返回 NaN。\nb。如果 R \xef\x82\xb9 16,则设 stripPrefix 为 false。
  16. \n
  17. 否则,R = 0\na。令 R = 10。
  18. \n
  19. 如果 stripPrefix 为 true,则\na。如果 S 的长度至少为 2 并且 S 的前两个字符是 \xe2\x80\x950x\xe2\x80\x96 或 \xe2\x80\x950X\xe2\x80\x96,则删除 \n前两个S 中的字符并令 R = 16。
  20. \n
  21. 如果 S 包含任何不是基数 R 数字的字符,则设 Z 为 S 的子字符串,由第一个此类字符之前的所有字符组成;否则,令 Z 为 S。
  22. \n
  23. 如果 Z 为空,则返回 NaN。
  24. \n
  25. 令 mathInt 为由 Z 以基数 R 表示法表示的数学整数值,使用字母 \nA-Z 和 az 表示值 10 到 35 的数字。(但是,如果 R 为 10 并且 Z 包含超过 20 \n有效值)数字,第 20 位之后的每个有效数字都可以由 0 数字替换,由实现选择;如果 R 不是 2、4、8、10、16 或 32,则 mathInt 可能是依赖于实现的\nZ 以基数 R 表示法表示的数学整数值的近似值。)\n
      \n
    1. 令 number 为 mathInt 的 Number 值。
    2. \n
    3. 返回符号 \xef\x82\xb4 数字。\n注意 parseInt 可能仅将字符串的前导部分解释为整数值;它忽略任何不能被解释为整数表示法一部分的字符,并且没有给出任何此类字符被忽略的指示。
    4. \n
  26. \n
\n\n

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

\n\n
    \n
  1. 令 inputString 为 ToString(string)。
  2. \n
  3. 令 trimmedString 为 inputString 的子字符串,由最左边的非 \nStrWhiteSpaceChar 字符和该字符右侧的所有字符组成。(换句话说,删除前导的白色\n空格。)如果 inputString 不包含任何此类字符,则令 trimmedString 为空字符串。
  4. \n
  5. 如果trimmedString 和trimmedString 的任何前缀都不满足StrDecimalLiteral 的语法(请参阅\n9.3.1),则返回NaN。
  6. \n
  7. 令numberString 为trimmedString 的最长前缀,它可能是trimmedString 本身,且满足StrDecimalLiteral 的语法。
  8. \n
  9. 返回 numberString 的 MV 的 Number 值。
  10. \n
\n\n

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

\n\n

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

\n\n
    \n
  1. 如果 ToNumber(number) 为 NaN,则返回 true。
  2. \n
  3. 否则,返回 false。\n注意 ECMAScript 代码测试值 X 是否为 NaN 的可靠方法是 X !== X 形式的表达式。当且仅当 X 为 NaN 时,\n结果才为 true。
  4. \n
\n