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

时间:2013-03-20 20:37:10

标签: javascript native-code

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

  • parseInt
  • parseFloat
  • isNaN

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:3)

进一步观察后,我在ECMAScript规范中找到了这个。 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

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

  1. 让inputString为ToString(string)。
  2. 设S是一个新创建的inputString子串,由第一个不是a的字符组成 StrWhiteSpaceChar以及该角色后面的所有字符。 (换句话说,删除前导白色 space。)如果inputString不包含任何这样的字符,那么让S为空字符串。
  3. 让签名为1。
  4. 如果S不为空并且S的第一个字符是减号 - 那么让标志为1。
  5. 如果S不为空并且S的第一个字符是加号+或减号 - 则删除第一个字符 来自S。
  6. 设R = ToInt32(基数)。
  7. 让stripPrefix为真。
  8. 如果R0,那么©Ecma International 2011 105 一个。如果R< 2或R> 36,然后返回NaN。 湾如果R16,则让stripPrefix为假。
  9. 否则,R = 0 一个。设R = 10。
  10. 如果stripPrefix为true,那么 一个。如果S的长度至少为2且S的前两个字符为-0x‖或-0X‖,则删除 来自S的前两个字符,让R = 16。
  11. 如果S包含任何不是基数-R数字的字符,那么让Z成为S的子字符串 第一个这样的角色之前的角色;否则,让Z成为S.
  12. 如果Z为空,则返回NaN。
  13. 让mathInt成为数字整数值,用Z表示基数-R表示法,使用字母 A-Z和a-z表示数值为10到35的数字。(但是,如果R为10且Z包含20以上 有效数字,20之后的每个有效数字可以被替换为0数字,可以选择 实施;如果R不是2,4,8,10,16或32,那么mathInt可能是依赖于实现的 近似于由基数-R表示法中的Z表示的数学整数值。)
    1. 设number为mathInt的Number值。
    2. 返回标志号码。 注意parseInt可能只将字符串的前导部分解释为整数值;它忽略了任何字符 不能被解释为整数符号的一部分,并且没有给出任何这样的字符的指示 忽略。
  14. 调用parseFloat函数时,将执行以下步骤:

    1. 让inputString为ToString(string)。
    2. 让trimmedString成为inputString的子字符串,由最左边的字符组成 StrWhiteSpaceChar和该角色右侧的所有字符。 (换句话说,删除前导白色 space。)如果inputString不包含任何此类字符,则让trimmedString为空字符串。
    3. 如果trimmedString和trimmedString的任何前缀都不满足StrDecimalLiteral的语法(请参阅 9.3.1),返回NaN。
    4. 让numberString成为trimmedString的最长前缀,它可能是trimmedString本身,满足 StrDecimalLiteral的语法。
    5. 返回numberString的MV的Number值。
    6. 注意parseFloat可能只将字符串的前导部分解释为Number值;它忽略了任何字符 不能被解释为十进制文字符号的一部分,并且没有任何指示任何这样的字符 忽略。

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

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

答案 2 :(得分:0)

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