繁体   English   中英

Javascript:如何查看像toString这样的本机函数的源代码实现

[英]Javascript: How to see source code implementation of native functions like toString

我期待看到一些Javascript函数如何工作。 例如,我想了解Chrome的V8引擎如何实现一元( - )操作或String.prototype.toString()方法。

如何查看本机C/C++实现? 我在这里看到许多链接到Chromium存储库和V8存储库的答案,但这些都是巨大的,并不是非常适合初学者,并且在我能找到的任何地方都没有任何指南。

我在寻找这样的东西:

// Pseudo code
function -(arg) {
  return arg * -1
}

显然,我明白我不会发现这是用Javascript编写 我只是在寻找类似的细节。

我还没有找到一个简明扼要地展示如何在任何地方找到Javascript函数的本机实现的答案。 有人能指出我正确的方向吗?

这里的ECMA规范给出了Unary的以下规范 - 操作:

一元 - 运算符

一元 - 运算符将其操作数转换为数字类型然后否定它。 注意,否定+0会产生-0,而否定-0会产生+0。

生产UnaryExpression: - UnaryExpression的计算方法如下:

expr是评估UnaryExpression的结果。 oldValueToNumber(GetValue(expr)) 如果oldValue是NaN ,则返回NaN 返回否定oldValue的结果; 也就是说,计算具有相同幅度但符号相反的数字。

这非常有用,但我想要了解的是,如何

计算具有相同幅度但符号相反的数字

算了。 它是number * -1还是其他什么? 或者是多种方式?

V8中没有单独的运算符代码或单个实现。 V8是一个即时编译器,通过动态编译本机代码来执行所有JavaScript。 V8支持大约10种不同的CPU架构,每种架构有4层编译器。 这已经使每个运营商的40个不同的实现。 在许多这些编译中,编译经历了一系列阶段,将输入转换为实际的机器代码。 并且在每种情况下,确切的转换取决于在编译时可用的类型信息(在先前的运行中收集)。

要了解正在发生的事情,您需要了解V8复杂架构的重要部分,因此在SO回复中回答您的问题几乎是不可能的。 如果您只对语义感兴趣,我建议您查看EcmaScript语言定义。

(您引用的代码片段只是一个辅助函数,用于转换一元运算符的编译器内部类型信息,这是多个阶段之一。)

编辑:您在更新的问题中引用的EcmaScript定义的摘录是正确的地方。 请记住,所有JavaScript编号都是IEEE浮点数。 这句话基本上就是说-只是反转这个数字的符号位。 您需要参考IEEE 754标准了解更多详情。 乘法-1.0是一个复杂得多的操作,但在大多数情况下会有相同的结果(可能除NaN操作数外)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM