【发布时间】:2016-10-04 06:59:47
【问题描述】:
我希望了解一些 Javascript 函数在底层是如何工作的。例如我想了解 Chrome 的 V8 引擎如何实现一元 (-) 操作或String.prototype.toString() 方法。
如何查看原生的C/C++ 实现?我在这里看到了许多链接到 Chromium 存储库和 V8 存储库的答案,但这些答案都很大,而且对初学者不太友好,而且据我所知,在任何地方都没有任何指南。
我正在寻找这样的东西:
// Pseudo code
function -(arg) {
return arg * -1
}
显然,我知道我不会发现这个用 Javascript 写的。我只是在寻找类似的详细程度。
我还没有找到简明扼要地说明如何在任何地方找到 Javascript 函数的本机实现的答案。有人能指出我正确的方向吗?
ECMA 规范 here 为一元 - 操作提供以下规范:
一元 - 运算符
一元 - 运算符将其操作数转换为数字类型,然后 否定它。请注意,对 +0 取反产生 -0,对 -0 取反 产生 +0。
产生式 UnaryExpression : - UnaryExpression 被评估为 如下:
让
expr成为评估UnaryExpression的结果。让oldValue成为ToNumber(GetValue(expr))。如果 oldValue 是NaN,则返回NaN。返回 否定oldValue的结果;也就是说,计算一个具有相同的数字 大小但符号相反。
这很有用,但我想了解的是,如何
计算一个大小相同但符号相反的数字
是计算出来的。是number * -1 还是别的什么?还是有多种方式?
【问题讨论】:
-
我不认为,这涉及乘法,因为符号更改比乘法便宜。所以
function -(x) { return -x; }. -
@NinaScholz 这可能不是乘法,这只是我的猜测。我试图找到它实际上是什么,以了解本机实现
-
您不会找到比查看 V8 源代码、SpiderMonkey (Mozilla) 或 Chakra (Edge) 更好的东西了 - 或者阅读 ecmascript ecma-262 语言规范以了解这些功能是如何实现的应该可以工作 - 因为毫无疑问 V8、蜘蛛猴和脉轮会做很多不同的事情
-
@JaromandaX 我完全赞成这种方法。但问题是我不是 C 或 C++ 程序员,我不知道从哪里开始。代码库非常大,到目前为止我的搜索还没有证明有用。
-
这就是困难——你不是 C 或 C++ 程序员,但你想知道 C/C++ 代码是如何工作的……想到两件事……你将如何理解你看到了什么,为什么你需要看看事情是如何运作的?
标签: javascript google-chrome open-source native v8