溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

golang V8怎么實現(xiàn)字符串拼接

發(fā)布時間:2023-05-04 16:12:33 來源:億速云 閱讀:111 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下golang V8怎么實現(xiàn)字符串拼接的相關(guān)知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

V8 是怎么執(zhí)行加法操作的?

當有兩個值相加的時候,比如:

a+b

通俗理解,V8 會提供了一個 ToPrimitive 方法,其作用是將 ab 轉(zhuǎn)換為原始數(shù)據(jù)類型,其轉(zhuǎn)換流程如下:

  • 先檢測該對象中是否存在 valueOf 方法,如果有并返回了原始類型,那么就使用該值進行強制類型轉(zhuǎn)換。

  • 如果 valueOf 沒有返回原始類型,那么就使用 toString 方法的返回值。

  • 如果 vauleOftoString 兩個方法都不返回基本類型值,便會觸發(fā)一個 TypeError 的錯誤。

將對象轉(zhuǎn)換為原始類型的流程圖如下所示:

golang V8怎么實現(xiàn)字符串拼接

當 V8 執(zhí)行 1+"2" 時,因為這是兩個原始值相加,原始值相加的時候,如果其中一項是字符串,那么 V8 會默認將另外一個值也轉(zhuǎn)換為字符串,相當于執(zhí)行了下面的操作:

Number(1).toString() + "2"

這里,把數(shù)字 1 偷偷轉(zhuǎn)換為字符串 "1" 的過程也稱為強制類型轉(zhuǎn)換,因為這種轉(zhuǎn)換是隱式的,所以如果我們不熟悉語義,那么就很容易判斷錯誤。

我們還可以再看一個例子來驗證上面流程,你可以看下面的代碼:

var Obj = {
    toString() {
      return '200'
    }, 
    valueOf() {
      return 100
    }   
  }
  Obj+3

執(zhí)行這段代碼,你覺得應該返回什么內(nèi)容呢?由于需要先使用 ToPrimitive 方法將 Obj 轉(zhuǎn)換為原始類型,而 ToPrimitive 會優(yōu)先調(diào)用對象中的 valueOf 方法,由于 valueOf 返回了 100,那么 Obj 就會被轉(zhuǎn)換為數(shù)字 100,那么數(shù)字 100 加數(shù)字 3,那么結(jié)果當然是 103 了。

如果改造一下代碼,讓 valueOf 方法和 toString 方法都返回對象,其改造后的代碼如下:

var Obj = {
    toString() {
      return new Object()
    }, 
    valueOf() {
      return new Object()
    }   
  }
  Obj+3

再執(zhí)行這段代碼,你覺得應該返回什么內(nèi)容呢?因為 ToPrimitive 會先調(diào)用 valueOf 方法,發(fā)現(xiàn)返回的是一個對象,并不是原生類型,當 ToPrimitive 繼續(xù)調(diào)用 toString 方法時,發(fā)現(xiàn) toString 返回的也是一個對象,都是對象,就無法執(zhí)行相加運算了,這時就會拋出一個異常,異常如下所示:

Uncaught TypeError: Cannot convert object to primitive value

提示的是類型錯誤,錯誤原因是無法將對象類型轉(zhuǎn)換為原始類型。所以說,在執(zhí)行加法操作的時候,V8 會通過 ToPrimitive 方法將對象類型轉(zhuǎn)換為原始類型,最后就是兩個原始類型相加,如果其中一個值的類型是字符串時,則另一個值也需要強制轉(zhuǎn)換為字符串,然后做字符串的連接運算。在其他情況時,所有的值都會轉(zhuǎn)換為數(shù)字類型值,然后做數(shù)字的相加。

以上就是“golang V8怎么實現(xiàn)字符串拼接”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI