[英]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
的結果。 設oldValue
為ToNumber(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.