JS提供了11種引用類型:Object、Array、Date、Function、Error、RegExp、Math、Number、String、Boolean、Globle。其中包括了三種基本包裝類型,也就是Number、String和Boolean,它們是特殊的引用類型,既與其餘的引用類型類似,同時又具備與各自的原始類型相應的特殊行爲。瀏覽器
1、什麼是包裝類型?對象
由於這字符串、數值、布爾三種原始類型的值,在必定條件下會自動轉化爲對象,所以被稱爲原始類型的「包裝類型」。內存
例如:var a1="some text";作用域
var a2=a1.substring(0,2);字符串
console.log(a2);//"so"string
上面這個例子中,變量a1是一個字符串,字符創必然是基本類型的值,可是它卻在第二行調用了substring()方法,並將結果返回保存在a2中,咱們都知道,既然a1是基本類型的值而不是對象,於是從邏輯上講,它是沒有方法的。其實在在實現這個操做的時候,JS內部已經隱式地幫咱們幫建立了一個包裝對象了,以上的實際的情形應該是這樣的:io
var a1=new String("some text");console
var a2=a1.substring(0,2);test
a1=null; 變量
console.log(a2);//"so"
可是這兩種方式仍是有區別的:
區別一:瀏覽器本身隱式建立的包裝對象和你顯式建立的包裝對象不嚴格相等。
var a1="test";
var a2=new String("test");
console.log(a1==a2);//true
console.log(a1===a2);//false
區別2:隱式建立的包裝對象,在使用完後以後就會被銷燬了。例如:
var s1="some text";
var s1.color="red";
console.log(s1.color);//undefined
上面的代碼,在第二行代碼試圖爲一個字符s1添加一個color屬性,可是當第三行再次訪問的時候,color屬性已經不見了。緣由就是第二行代碼建立的String對象在執行第三行代碼時已經被銷燬了,第三行代碼又建立來了本身的String對象,但是沒有了color屬性,因此最終返回的值是undefined。
在實際運用中,咱們能夠顯式的調用String、Number和Boolean來建立基本包裝類型的對象,不過,應該在絕對必要的時候再這麼作,由於這種作法很容易讓人分不清本身是在處理基本類型仍是引用類型。對基本包裝類型的實例調用 typeof 會返回object。
2、包裝類型和引用類型的區別
引用類型和包裝類型的主要區別是對象的生存期。使用new操做符建立的引用類型的實例,在執行流離開當前做用域以前都一直保存在內存中。而自動穿件的基本包轉類型的對象,則只存在於一行代碼的執行期間,而後當即被銷燬,這也意味着咱們不能在運行時爲基本類型添加屬性和方法。