溫馨提示×

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

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

javascript拆箱裝箱和類型轉(zhuǎn)換的方法

發(fā)布時(shí)間:2022-03-03 09:39:26 來源:億速云 閱讀:134 作者:iii 欄目:web開發(fā)

這篇“javascript拆箱裝箱和類型轉(zhuǎn)換的方法”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“javascript拆箱裝箱和類型轉(zhuǎn)換的方法”文章吧。

javascript拆箱裝箱和類型轉(zhuǎn)換的方法

基本數(shù)據(jù)類型:stringnumber、boolean

引用類型:object、function

不存在的類型:undefined

String、Number、Boolean分別屬于stringnumber、boolean三個(gè)原始類型的包裝類型,它們的對(duì)象屬于引用類型。

裝箱

裝箱是指把基本數(shù)據(jù)類型轉(zhuǎn)換為對(duì)應(yīng)的引用類型的操作,該過程主要是指string、numberboolean類型的數(shù)據(jù),通過String、Number、Boolean進(jìn)行包裝成為引用類型數(shù)據(jù)的過程。

// 隱式裝箱var s1 = 'Hello World'; 
var s2 = s1.substring(2);

上面第二行代碼的執(zhí)行步驟其實(shí)是這樣的:

  1. 使用new String('Hello World')創(chuàng)建一個(gè)臨時(shí)的實(shí)例對(duì)象;

  2. 使用臨時(shí)對(duì)象調(diào)用substring方法;

  3. 將執(zhí)行結(jié)果賦值給s2;銷毀臨時(shí)的實(shí)例對(duì)象。

上面的步驟轉(zhuǎn)換為代碼,如下:

// 顯式裝箱var s1 = 'Hello World'; 
var tempObj = new String('Hello World');
var s2 = tempObj.substring(2);

拆箱

拆箱是把引用類型轉(zhuǎn)換為基本的數(shù)據(jù)類型。

關(guān)于拆箱過程中的ToPrimitive

類型轉(zhuǎn)換

運(yùn)算符對(duì)于兩端的變量,都有一個(gè)期待類型,在javascript中,凡是不滿足運(yùn)算符期待類型的變量,都會(huì)做做隱式轉(zhuǎn)換。

邏輯運(yùn)算符

在進(jìn)行邏輯運(yùn)算時(shí),隱式轉(zhuǎn)換只有一個(gè)標(biāo)準(zhǔn):只有 null 、undefined、 ''、 NaN、 0false 表示 false,其他的情況都是 true,比如 {} , []

算術(shù)運(yùn)算符
  1. 如果算術(shù)運(yùn)算符兩端均為number類型的數(shù)據(jù),直接進(jìn)行計(jì)算;

  2. 如果算術(shù)運(yùn)算符兩端存在非number的基本數(shù)據(jù)類型,則對(duì)非number的運(yùn)算數(shù)使用Number()進(jìn)行裝箱,然后對(duì)返回值進(jìn)行拆箱為number類型,參與計(jì)算;

  3. 算術(shù)運(yùn)算符兩端存在引用數(shù)據(jù)類型,則先對(duì)引用類型進(jìn)行拆箱操作,如果結(jié)果為非number類型,則根據(jù)條件2執(zhí)行,否則執(zhí)行條件1。

1 - true 
// 0, 首先 Number(true) 轉(zhuǎn)換為數(shù)字 1, 然后執(zhí)行 1 - 11 - null 
// 1,  首先把 Number(null) 轉(zhuǎn)換為數(shù)字 0, 然后執(zhí)行 1 - 01 * undefined 
//  NaN, Number(undefined) 轉(zhuǎn)換為數(shù)字是 NaN , 然后執(zhí)行 1 * NaN2 * ['5'] 
//  10, ['5'] 依照ToPrimitive規(guī)則進(jìn)行拆箱會(huì)變成 '5', 然后通過 Number('5') 進(jìn)行拆裝箱再變成數(shù)字 5123 + {valueOf:()=>{return 10}}   
// 133  {valueOf:()=>{return 10}} 依照ToPrimitive規(guī)則會(huì)先調(diào)用valueOf,獲得結(jié)果為10

當(dāng)+作為單目運(yùn)算符出現(xiàn)在變量的前面時(shí),表示的意思是將變量轉(zhuǎn)換為Number類型

+"10" 	
// 10  同 Number("10")+['5']  
// 5   ['5']依照ToPrimitive規(guī)則會(huì)變成 '5', 然后通過`Number`的拆箱操作再變成數(shù)字 5
字符串連接符

字符串連接符的符號(hào)同算術(shù)運(yùn)算符的+ 。

  1. 如果算術(shù)運(yùn)算符兩端均為string類型的數(shù)據(jù),直接進(jìn)行連接

  2. 如果運(yùn)算符的兩端存在非string的基本類型,則對(duì)非string的基本類型數(shù)據(jù)使用String()進(jìn)行裝箱,然后對(duì)返回值進(jìn)行拆箱為基本類型,參與字符串拼接。

  3. 當(dāng)+兩端兩端存在引用數(shù)據(jù)類型,則先對(duì)引用類型進(jìn)行拆箱操作,如果結(jié)果為非string類型,則根據(jù)條件2執(zhí)行,否則執(zhí)行條件1。

關(guān)系運(yùn)算符
  • NaN和其他任何類型,做任何關(guān)系運(yùn)算永遠(yuǎn)返回false(包括和他自己)。如果想判斷一個(gè)變量是不是NaN , 可以通過Number.isNaN()來判斷。

  • null == undefined比較結(jié)果是true,除此之外,nullundefined和其他的(不包括它們自身)任何結(jié)果的比較值都為false。

    這里是規(guī)則定義的,null 為 object 的類型,可是調(diào)用valueOf或者toString都會(huì)有語法錯(cuò)誤,這里直接記住結(jié)果就行。

  • 一般情況:

    1. 如果算術(shù)運(yùn)算符兩端均為number類型的數(shù)據(jù),直接進(jìn)行計(jì)算;

    2. 如果算術(shù)運(yùn)算符兩端存在非number的基本數(shù)據(jù)類型,則對(duì)非number的運(yùn)算數(shù)使用Number()進(jìn)行裝箱,然后對(duì)返回值進(jìn)行拆箱為number類型,參與計(jì)算;

    3. 算術(shù)運(yùn)算符兩端存在引用數(shù)據(jù)類型,則先對(duì)引用類型進(jìn)行拆箱操作,如果結(jié)果為非number類型,則根據(jù)條件2執(zhí)行,否則執(zhí)行條件1。

{} == !{}  
// false   Number({}.valueOf().toString())==> NaN , 所以題目等同于 NaN == false , NaN 和 任何類型比較都是 false[] == []  
// false  內(nèi)存地址不同![] == 0  
// true   ![]==>false , 所以題目等同于 false==0 , Number(false)==>0 ,  所以結(jié)果為 true

一些題目

  1. [] == ![]

        - 第一步,![] 會(huì)變成 false
        - 第二步,[]的valueOf是[],[]是引用類型,繼續(xù)調(diào)用toString,題目變成: "" == false
        - 第三步,符號(hào)兩端轉(zhuǎn)換為Number, 得到 0==0
        - 所以, 答案是 true
  2. [undefined] == false

        - 第一步,[undefined]的valueOf結(jié)果為 [undefined],然后[undefined]通過toString變成 '' ,所以題目變成  '' == false
        - 第二步,符號(hào)兩端轉(zhuǎn)換為Number, 得到 0==0
        - 所以, 答案是 true !
  3. 如何使a==1 && a==2 && a==3的結(jié)果為 true

    var a = {
        value: 0,
        valueOf: function() {
            this.value += 1;
            return this.value    }};console.log(a == 1 && a == 2 && a == 3) // true
  4. 如何使a===1&&a===2&&a===3的結(jié)果為 true

    // 使用 defineProperty 進(jìn)行數(shù)據(jù)劫持var value = 0;Object.defineProperty(window,"a",{
        get(){
            return ++value;
        }})console.log(a===1&&a===2&&a===3)  //true
  5. 實(shí)現(xiàn)一個(gè)無限累加函數(shù)

  6. 柯里化實(shí)現(xiàn)多參累加

以上就是關(guān)于“javascript拆箱裝箱和類型轉(zhuǎn)換的方法”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

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

AI