欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

V8實(shí)現(xiàn)字符串拼接

 更新時(shí)間:2023年05月04日 15:13:20   作者:codinglin  
本文主要介紹了V8實(shí)現(xiàn)字符串拼接,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

在之前的一篇文章 JavaScript 隱式類型轉(zhuǎn)換規(guī)則中有提到,JavaScript 中的加號(hào)可以用來拼接字符串。本文就具體來介紹一下 V8 是如何來執(zhí)行這一操作的......

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

當(dāng)有兩個(gè)值相加的時(shí)候,比如:

a+b

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

  • 先檢測(cè)該對(duì)象中是否存在 valueOf 方法,如果有并返回了原始類型,那么就使用該值進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
  • 如果 valueOf 沒有返回原始類型,那么就使用 toString 方法的返回值。
  • 如果 vauleOftoString 兩個(gè)方法都不返回基本類型值,便會(huì)觸發(fā)一個(gè) TypeError 的錯(cuò)誤。

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

當(dāng) V8 執(zhí)行 1+"2" 時(shí),因?yàn)檫@是兩個(gè)原始值相加,原始值相加的時(shí)候,如果其中一項(xiàng)是字符串,那么 V8 會(huì)默認(rèn)將另外一個(gè)值也轉(zhuǎn)換為字符串,相當(dāng)于執(zhí)行了下面的操作:

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

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

我們還可以再看一個(gè)例子來驗(yàn)證上面流程,你可以看下面的代碼:

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

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

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

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

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

Uncaught TypeError: Cannot convert object to primitive value

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

總結(jié)

在 JavaScript 中,類型系統(tǒng)是依據(jù) ECMAScript 標(biāo)準(zhǔn)來實(shí)現(xiàn)的,所以 V8 會(huì)嚴(yán)格根據(jù) ECMAScript 標(biāo)準(zhǔn)來執(zhí)行。在執(zhí)行加法過程中,V8 會(huì)先通過 ToPrimitive 函數(shù),將對(duì)象轉(zhuǎn)換為原始字符串或者是數(shù)字類型,在轉(zhuǎn)換過程中,ToPrimitive 會(huì)先調(diào)用對(duì)象的 valueOf 方法,如果沒有 valueOf 方法,則調(diào)用 toString 方法,如果 vauleOftoString 兩個(gè)方法都不返回基本類型值,便會(huì)觸發(fā)一個(gè) TypeError 的錯(cuò)誤。

到此這篇關(guān)于V8實(shí)現(xiàn)字符串拼接的文章就介紹到這了,更多相關(guān)V8 字符串拼接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript單元測(cè)試ABC

    JavaScript單元測(cè)試ABC

    在服務(wù)器端的單元測(cè)試中,都有各種各樣的測(cè)試框架,在JavaScript中現(xiàn)在也有一些很優(yōu)秀的框架,但在本文中,我們將自己動(dòng)手一步步來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的單元測(cè)試框架
    2012-04-04
  • JavaScript實(shí)現(xiàn)電商平臺(tái)商品細(xì)節(jié)圖

    JavaScript實(shí)現(xiàn)電商平臺(tái)商品細(xì)節(jié)圖

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)電商平臺(tái)商品細(xì)節(jié)圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • JavaScript自執(zhí)行閉包的小例子

    JavaScript自執(zhí)行閉包的小例子

    JQuery是一個(gè)很明顯的自執(zhí)行閉包的例子,有需要的朋友可以參考一下
    2013-06-06
  • JavaScript動(dòng)態(tài)添加css樣式和script標(biāo)簽

    JavaScript動(dòng)態(tài)添加css樣式和script標(biāo)簽

    這篇文章主要介紹了JavaScript動(dòng)態(tài)添加css樣式和script標(biāo)簽的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • js將字符串轉(zhuǎn)成正則表達(dá)式的實(shí)現(xiàn)方法

    js將字符串轉(zhuǎn)成正則表達(dá)式的實(shí)現(xiàn)方法

    js將字符串轉(zhuǎn)成正則表達(dá)式的實(shí)現(xiàn)方法。其實(shí)很簡(jiǎn)單哦!需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2013-11-11
  • JS通過調(diào)用微信API實(shí)現(xiàn)微信支付功能的方法示例

    JS通過調(diào)用微信API實(shí)現(xiàn)微信支付功能的方法示例

    這篇文章主要介紹了JS通過調(diào)用微信API實(shí)現(xiàn)微信支付功能的方法,結(jié)合具體實(shí)例形式分析了javascript微信支付接口的調(diào)用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-06-06
  • js實(shí)現(xiàn)七夕表白彈幕效果 jQuery實(shí)現(xiàn)彈幕技術(shù)

    js實(shí)現(xiàn)七夕表白彈幕效果 jQuery實(shí)現(xiàn)彈幕技術(shù)

    這篇文章主要介紹了js實(shí)現(xiàn)七夕表白彈幕效果,jQuery實(shí)現(xiàn)彈幕技術(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 微信小程序中正確使用地圖的方法實(shí)例

    微信小程序中正確使用地圖的方法實(shí)例

    微信小程序誕生之初,功能受限于小程序的理念,微信小程序要體現(xiàn)輕量級(jí)的應(yīng)用特點(diǎn),但在隨后不斷更新中,API接口很好的為小程序賦能,使其可以在不影響本質(zhì)的情況下實(shí)現(xiàn)完善功能,這篇文章主要給大家介紹了關(guān)于微信小程序中正確使用地圖的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • javascript中的delete使用詳解

    javascript中的delete使用詳解

    在這篇文章中作者從《JavaScript面向?qū)ο缶幊讨改稀芬粫嘘P(guān)于 delete 的錯(cuò)誤講起,詳細(xì)講述了關(guān)于 delete 操作的實(shí)現(xiàn), 局限以及在不同瀏覽器和插件(這里指 firebug)中的表現(xiàn)
    2013-04-04
  • JavaScript打印網(wǎng)頁指定區(qū)域的例子

    JavaScript打印網(wǎng)頁指定區(qū)域的例子

    這篇文章主要介紹了JavaScript打印網(wǎng)頁指定區(qū)域的例子,需要的朋友可以參考下
    2014-05-05

最新評(píng)論