javascript技巧之拆箱裝箱和型別轉換

2022-03-02 19:00:44
本篇文章給大家帶來了關於中的相關知識,其中主要介紹了拆箱裝箱和型別轉換的相關問題,裝箱是指把基本資料型別轉換為對應的參照型別的操作,下面就一起來看一下,希望對大家有幫助。

相關推薦:

基本資料型別:stringnumberboolean

參照型別:objectfunction

不存在的型別:undefined

StringNumberBoolean分別屬於stringnumberboolean三個原始型別的包裝型別,它們的物件屬於參照型別。

裝箱

裝箱是指把基本資料型別轉換為對應的參照型別的操作,該過程主要是指stringnumberboolean型別的資料,通過StringNumberBoolean進行包裝成為參照型別資料的過程。

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

上面第二行程式碼的執行步驟其實是這樣的:

  1. 使用new String('Hello World')建立一個臨時的範例物件;
  2. 使用臨時物件呼叫substring方法;
  3. 將執行結果賦值給s2;銷燬臨時的範例物件。

上面的步驟轉換為程式碼,如下:

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

拆箱

拆箱是把參照型別轉換為基本的資料型別。

關於拆箱過程中的ToPrimitive

型別轉換

運運算元對於兩端的變數,都有一個期待型別,在javascript中,凡是不滿足運運算元期待型別的變數,都會做做隱式轉換。

邏輯運運算元

在進行邏輯運算時,隱式轉換隻有一個標準:只有 nullundefined''NaN0false 表示 false,其他的情況都是 true,比如 {} , []

算術運運算元

  1. 如果算術運運算元兩端均為number型別的資料,直接進行計算;

  2. 如果算術運運算元兩端存在非number的基本資料型別,則對非number的運算數使用Number()進行裝箱,然後對返回值進行拆箱為number型別,參與計算;

  3. 算術運運算元兩端存在參照資料型別,則先對參照型別進行拆箱操作,如果結果為非number型別,則根據條件2執行,否則執行條件1

1 - true 
// 0, 首先 Number(true) 轉換為數位 1, 然後執行 1 - 11 - null 
// 1,  首先把 Number(null) 轉換為數位 0, 然後執行 1 - 01 * undefined 
//  NaN, Number(undefined) 轉換為數位是 NaN , 然後執行 1 * NaN2 * ['5'] 
//  10, ['5'] 依照ToPrimitive規則進行拆箱會變成 '5', 然後通過 Number('5') 進行拆裝箱再變成數位 5123 + {valueOf:()=>{return 10}}   
// 133  {valueOf:()=>{return 10}} 依照ToPrimitive規則會先呼叫valueOf,獲得結果為10

+作為單目運運算元出現在變數的前面時,表示的意思是將變數轉換為Number型別

+"10" 	
// 10  同 Number("10")+['5']  
// 5   ['5']依照ToPrimitive規則會變成 '5', 然後通過`Number`的拆箱操作再變成數位 5

字串連線符

字串連線符的符號同算術運運算元的+

  1. 如果算術運運算元兩端均為string型別的資料,直接進行連線
  2. 如果運運算元的兩端存在非string的基本型別,則對非string的基本型別資料使用String()進行裝箱,然後對返回值進行拆箱為基本型別,參與字串拼接。
  3. +兩端兩端存在參照資料型別,則先對參照型別進行拆箱操作,如果結果為非string型別,則根據條件2執行,否則執行條件1

關係運算子

  • NaN和其他任何型別,做任何關係運算永遠返回false(包括和他自己)。如果想判斷一個變數是不是NaN , 可以通過Number.isNaN()來判斷。

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

    這裡是規則定義的,null 為 object 的型別,可是呼叫valueOf或者toString都會有語法錯誤,這裡直接記住結果就行。

  • 一般情況:

    1. 如果算術運運算元兩端均為number型別的資料,直接進行計算;
    2. 如果算術運運算元兩端存在非number的基本資料型別,則對非number的運算數使用Number()進行裝箱,然後對返回值進行拆箱為number型別,參與計算;
    3. 算術運運算元兩端存在參照資料型別,則先對參照型別進行拆箱操作,如果結果為非number型別,則根據條件2執行,否則執行條件1
{} == !{}  
// false   Number({}.valueOf().toString())==> NaN , 所以題目等同於 NaN == false , NaN 和 任何型別比較都是 false[] == []  
// false  記憶體地址不同![] == 0  
// true   ![]==>false , 所以題目等同於 false==0 , Number(false)==>0 ,  所以結果為 true

一些題目

  1. [] == ![]

        - 第一步,![] 會變成 false
        - 第二步,[]的valueOf是[],[]是參照型別,繼續呼叫toString,題目變成: "" == false
        - 第三步,符號兩端轉換為Number, 得到 0==0
        - 所以, 答案是 true
  2. [undefined] == false

        - 第一步,[undefined]的valueOf結果為 [undefined],然後[undefined]通過toString變成 '' ,所以題目變成  '' == false
        - 第二步,符號兩端轉換為Number, 得到 0==0
        - 所以, 答案是 true !
  3. 如何使a==1 && a==2 && a==3的結果為 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的結果為 true

    // 使用 defineProperty 進行資料劫持var value = 0;Object.defineProperty(window,"a",{
        get(){
            return ++value;
        }})console.log(a===1&&a===2&&a===3)  //true
  5. 實現一個無限累加函數

  6. 柯里化實現多參累加

相關推薦:

以上就是javascript技巧之拆箱裝箱和型別轉換的詳細內容,更多請關注TW511.COM其它相關文章!