簡體   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