引子: 類型轉換涉及到了拆箱裝箱,那什麼是拆箱裝箱?如何進行拆箱裝箱?
1.什麼是裝箱拆箱?
1-1.裝箱轉換
定義:基本類型 轉化為對應的 對象
1-2.拆箱轉換
定義:對象 轉化為對應的 基本類型。JS 標準規定了ToPrimitive用於拆箱轉換。
2. 如何裝箱?
2-1.前言
Number、String、Boolean、Symbol、BigInt 都在對象中有對應的類。
聯想: 隱藏類 map 僅在 V8 對象中存在,V8 為每一個對象創建一個隱藏類,對象的 map 屬性指向隱藏類。在 V8 內存空間中,Map 區存放著隱藏類。(Map 其實也可當作屬於老生代) (1)map 定義:類似於靜態語言的結構體,假設屬性相對於對象的偏移量不會改變(無增刪屬性) (2)常識:靜態語言直接通過偏移量查詢對象的屬性值,而 JS 是動態語言,偏移量可能會發生變化,需查找。而隱藏類剛好解決了這個問題。 (3)map 作用:提升對象的屬性訪問速度 (4)map 內容:1.所有屬性 2.每個屬性相對於對象的偏移量 (5)重構 map: 1.增加屬性 2.刪除屬性 3.改變屬性類型 (6)重構 map 會影響程序執行的性能。 (7)代碼層麵優化:1.避免增刪屬性 2.字麵量初始化對象,屬性順序一致 3.避免改變屬性類型。 (8)回收 map: 當不再被任何對象引用時(即無相應結構的對象存在),會被回收。
2-2.Number、String、Boolean
Number、String、Boolean 構造函數 可與new操作符搭配,進行顯式裝箱,產生對象。也可與.運算符 搭配,進行隱式裝箱,產生對象。若可直接調用,則用於強製類型轉換。
// 顯式裝箱
let a \u003d new Number(1)
let b \u003d new String(\u0027b\u0027)
let c \u003d new Boolean(true)
// 隱式裝箱
\u0027lxh\u0027.charAt(0)
2-3.Symbol、BigInt
Symbol、BigInt 構造函數 不可以與 new 搭配,可調用call進行隱式裝箱(強製裝箱),產生對象。
. 運算符提供裝箱操作,根據基礎類型構造一個[臨時對象],能在基礎類型上調用對應對象的原型上的方法。 注意:Object(Symbol())無法滿足 instaceof、construtor 指向。
function createSymbolObject(description) {
return function () {