Javascript 之基本包裝型別
基本包裝型別是
特殊的引用型別
。每當讀取一個基本型別值的時候,後臺就會建立一個對應的
基本包裝型別的物件
,從而可以呼叫屬性、方法來進行後續操作。
ECMAScript還提供了三種基本包裝型別:Number、String、Boolean。
程式碼現狀
我們經常寫類似這樣的程式碼,基本型別的變數可以當做物件一樣呼叫屬性、方法,但這又不是一個真正的物件只是一個變數而已,那麼這是為什麼呢?
1 var str = "hello world";2 console.log(str.length); // 113 console.log(str.toUpperCase());// HELLO WORLD
其實為了便於操作基本資料型別的值,
JavaScript 中的基本資料型別的值會在後臺建立一個對應的基本包裝型別物件
,除了
null 和 undefined 所有的基本型別都有對應的包裝型別。如上程式碼,後臺會自動完成下列的處理:
執行到第二行時:
1.
建立
String 型別的一個例項;2.
在例項上呼叫指定的屬性;
3.
銷燬這個例項;
執行到第三行時:
1.
建立
String 型別的一個例項;2.
在例項上呼叫指定的方法;
3.
銷燬這個例項;
可以將以上三個步驟想象成是執行了下列
ECMAScript程式碼:1 // 執行到第二行時2 var str = new String("hello world");3 str.length;4 str = null;5 6 // 執行到第三行時7 var str = new String("hello world");8 str.toUpperCase();9 str = null;
這樣以上程式碼中字串就變得跟物件一樣了,同理分別適用與
Boolean、Number型別對應的基本資料型別;現在是不是明白原來這個這個基本包裝型別其實就是基本資料型別對應的型別
注意:
並不是包裝型別提供了方法,而是
javascript 引擎後臺建立了對應基本包裝型別的例項(物件)每當讀取一個基本型別值的時候,後臺就會建立一個對應的基本包裝型別物件
如:
1 var str = new String("hello world");2 str.length;3 str = null;
引用型別物件與基本包裝型別物件的區別
主要區別就是這兩種物件的生命週期不同。
通過以上程式碼塊我們知道基本包裝型別自動建立的物件在物件被呼叫的時刻存在,呼叫完後就被銷燬了,而使用
new關鍵字建立的引用型別的例項,物件在當前作用域都存在。//基本包裝型別物件
1 var s='some';2 s.age='Joel';3 console.log(s.age);//undefined
如上程式碼在給字串
s新增age屬性,但是當程式碼執行到第三行時name屬性已經被銷燬了,當程式碼執行第三行時,又建立了一個String 例項,但是這個例項並沒有age屬性所以輸出undefined;//顯示例項化包裝型別
1 var s=new String('some'); 2 s.age='Joel'; 3 console.log(s.age);//Joel