【问题标题】:Algorithm for javascript pre-defined functions (parseInt, parseFloat, isNaN, etc.)javascript 预定义函数的算法(parseInt、parseFloat、isNaN 等)
【发布时间】:2013-03-10 04:13:07
【问题描述】:

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

  • parseInt
  • parseFloat
  • isNaN

【问题讨论】:

    标签: javascript native-code


    【解决方案1】:

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

    不过,您可能对描述算法工作原理的EcmaScript specification 更感兴趣。

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

    【讨论】:

    • 是的。需要注意的是,这些函数不是在 JavaScript 中实现的console.log(parseInt) //=> function parseInt() { [native code] }
    • @AlexWayne:实际上,其中一些用JS实现的:code.google.com/p/v8/source/browse/trunk/src/v8natives.js
    • 我想“一些”或“大多数”会更准确:)
    【解决方案2】:

    进一步查看后,我在 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 的第一个字符是减号 -,则令 sign 为 1。
    5. 如果 S 不为空且 S 的第一个字符是加号 + 或减号 -,则删除第一个字符 来自 S.
    6. 令 R = ToInt32(radix)。
    7. 让 stripPrefix 为真。
    8. 如果 R  0,则© Ecma International 2011 105 一种。如果 R 36,则返回 NaN。 湾。如果 R  16,则让 stripPrefix 为假。
    9. 否则,R = 0 一种。令 R = 10。
    10. 如果 stripPrefix 为真,则 一种。如果 S 的长度至少为 2,并且 S 的前两个字符是“0x”或“0X”,则删除 S 中的前两个字符,令 R = 16。
    11. 如果 S 包含任何不是 radix-R 数字的字符,则令 Z 为 S 的子串,由所有 第一个此类字符之前的字符;否则,令 Z 为 S。
    12. 如果 Z 为空,则返回 NaN。
    13. 设 mathInt 为数学整数值,由 Z 以 radix-R 表示法表示,使用字母 A-Z 和 a-z 表示值为 10 到 35 的数字。(但是,如果 R 为 10 并且 Z 包含超过 20 有效数字,第 20 位之后的每个有效数字都可以由 0 数字代替,由 执行;如果 R 不是 2、4、8、10、16 或 32,则 mathInt 可能依赖于实现 用 radix-R 表示法中的 Z 表示的数学整数值的近似值。)
      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 时,结果才会为真。

    【讨论】:

    • 请注意,这是要遵循的算法,并且每个浏览器/JS 引擎都单独本地实现它,因为浏览器/引擎创建者认为适合所选语言。
    【解决方案3】:

    这些函数是特定于浏览器的实现,而不是用 JS 编写的(除非有人决定用 JS 编写浏览器引擎)。虽然代码确实必须(理论上)遵守 ECMAScript 规范的行为。

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多