您好,登錄后才能下訂單哦!
今天小編給大家分享一下golang V8怎么實現字符串拼接的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
當有兩個值相加的時候,比如:
a+b
通俗理解,V8 會提供了一個 ToPrimitive
方法,其作用是將 a
和 b
轉換為原始數據類型,其轉換流程如下:
先檢測該對象中是否存在 valueOf
方法,如果有并返回了原始類型,那么就使用該值進行強制類型轉換。
如果 valueOf
沒有返回原始類型,那么就使用 toString
方法的返回值。
如果 vauleOf
和 toString
兩個方法都不返回基本類型值,便會觸發一個 TypeError
的錯誤。
將對象轉換為原始類型的流程圖如下所示:
當 V8 執行 1+"2" 時,因為這是兩個原始值相加,原始值相加的時候,如果其中一項是字符串,那么 V8 會默認將另外一個值也轉換為字符串,相當于執行了下面的操作:
Number(1).toString() + "2"
這里,把數字 1
偷偷轉換為字符串 "1"
的過程也稱為強制類型轉換,因為這種轉換是隱式的,所以如果我們不熟悉語義,那么就很容易判斷錯誤。
我們還可以再看一個例子來驗證上面流程,你可以看下面的代碼:
var Obj = { toString() { return '200' }, valueOf() { return 100 } } Obj+3
執行這段代碼,你覺得應該返回什么內容呢?由于需要先使用 ToPrimitive
方法將 Obj
轉換為原始類型,而 ToPrimitive
會優先調用對象中的 valueOf
方法,由于 valueOf
返回了 100
,那么 Obj
就會被轉換為數字 100
,那么數字 100
加數字 3
,那么結果當然是 103
了。
如果改造一下代碼,讓 valueOf
方法和 toString
方法都返回對象,其改造后的代碼如下:
var Obj = { toString() { return new Object() }, valueOf() { return new Object() } } Obj+3
再執行這段代碼,你覺得應該返回什么內容呢?因為 ToPrimitive
會先調用 valueOf
方法,發現返回的是一個對象,并不是原生類型,當 ToPrimitive
繼續調用 toString
方法時,發現 toString
返回的也是一個對象,都是對象,就無法執行相加運算了,這時就會拋出一個異常,異常如下所示:
Uncaught TypeError: Cannot convert object to primitive value
提示的是類型錯誤,錯誤原因是無法將對象類型轉換為原始類型。所以說,在執行加法操作的時候,V8 會通過 ToPrimitive
方法將對象類型轉換為原始類型,最后就是兩個原始類型相加,如果其中一個值的類型是字符串時,則另一個值也需要強制轉換為字符串,然后做字符串的連接運算。在其他情況時,所有的值都會轉換為數字類型值,然后做數字的相加。
以上就是“golang V8怎么實現字符串拼接”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。