【JS】基本包裝類型

在 ES 中,數據的分類分爲基本數據類型和引用類型。
而基本包裝類型,嚴格來講不屬於上面兩個中的任意一個,可是又和這兩種類型息息相關。javascript

基本數據類型和引用類型這兩個類型其中一個很明顯的區別是,引用類型有本身內置的方法,也能夠自定義其餘方法用來操做數據,而基本數據類型不能像引用類型那樣有本身的內置方法對數據進行更多的操做。java

但基本數據類型真的沒有嗎?函數

對於部分基本類型來講確實是這樣的。code

按照最新 ES 標準定義,基本數據類型(primitive value)包括 Undefined, Null, Boolean, Number, Symbol, String。對象

在這 6 個基本數據類型中,其中有 3 個是 ES 提供的特殊引用類型(基本包裝類型):Boolean, Number, String。ip

基本包裝類型,和其餘引用類型同樣,擁有內置的方法能夠對數據進行額外操做。
以下:內存

let str = 'test'
let str2 = str.substring(2)
console.log(str2) //st

上面 str 變量存儲的值是一個字符串,'test' 字符串是基本數據類型 String 類型的值。
按照常理來講,字符串不是引用類型,因此它不該該有本身的方法,第二行代碼應該報錯纔對。作用域

字符串 'test' 確實不該該有本身的方法,可是在執行第二行代碼時,後臺會自動進行下面的步驟:
1.自動建立 String 類型的一個實例(和基本類型的值不一樣,這個實例就是一個基本包裝類型的對象)
2.調用實例(對象)上指定的方法
3.銷燬這個實例開發

用代碼的方式解釋就是以下:字符串

//用 String 構造函數建立一個實例,這個實例是一個對象
let str = new String('test')
//對象中有內置方法供開發人員調用
let str2 = str.substring()
str = null

雖然基本類型的值沒有方法能夠調用,可是後臺臨時建立的構造函數實例(也就是對象)上有內置方法可讓咱們對值進行操做,所以這樣咱們就能夠對字符串、數值、布爾值這三種基本數據類型的數據進行更多操做,這也是基本包裝類型的主要用處:便於操做基本類型值。

而何時後臺會自動建立一個對應的基本包裝類型的對象,取決於當前執行的代碼是不是爲了獲取他的值。
每當讀取一個基本類型的值,也就是當咱們須要從內存中獲取到他的值時(這個訪問過程稱爲讀取模式),這時,後臺就會自動建立一個基本包裝類型的對象。
以下:

let test = 'hhh'
console.log(test) //讀取模式,後臺自動建立基本包裝類型對象
let test2 = test //賦值給變量 test2,也須要讀取 test 的值,同上

基本包裝類型的對象和引用類型的對象最大的一個區別是,對象的生存期不一樣,致使的一個結果就是,基本包裝類型沒法自定義本身的方法。

對於引用類型的數據,在執行流離開當前做用域以前都會保存在內存中,而對於自動建立的基本包裝類型的對象,只存在於一行代碼的執行瞬間,執行完畢就會當即被銷燬。
以下:

let str = 'test'
str.test = 'hhh'
console.log(str.test) //undefined

上面第二行代碼給自動建立的 String 實例對象添加了 test 屬性,雖然此刻代碼執行時他是生效的,可是在這行代碼執行完畢後該 String 實例就會馬上被銷燬,String 實例的 test 屬性也就不存在了。當執行第三行代碼時,因爲是讀取模式,又從新建立了新的 String 實例,而這個新建立的 String 實例沒有 test 屬性,結果也就是 undefined。

相關文章
相關標籤/搜索