js 中的基本類型,引用類型,基本包裝類型

基本類型:Undefined,Null,Boolean,Number,String
引用類型:Object,Array,Date,RegExp等,說白了就是對象。。。
基本包裝類型:Boolean,Number,String

以下~this

var str = 'hello'; //string 基本類型
var s2 = str.charAt(0);
alert(s2); // h

毫無疑問上面的string是一個基本類型,可是它卻能召喚出一個 charAt() 的方法,這是什麼緣由呢?
主要是由於在基本類型中,有三個比較特殊的存在就是:String Number Boolean,這三個基本類型都有本身對應的包裝對象。而且隨時等候召喚。包裝對象呢,其實就是對象,有相應的屬性和方法。至於這個過程是怎麼發生呢,實際上是在後臺偷偷發生的。prototype

//咱們日常寫程序的過程:
var str = 'hello'; //string 基本類型
var s2 = str.charAt(0); //在執行到這一句的時候 後臺會自動完成如下動做 :
( 
 var _str = new String('hello'); // 1 找到對應的包裝對象類型,而後經過包裝對象建立出一個和基本類型值相同的對象
 var s2 = _str.chaAt(0); // 2 而後這個對象就能夠調用包裝對象下的方法,而且返回結給s2.
 _str = null;  //    3 以後這個臨時建立的對象就被銷燬了, str =null; 
 ) 
alert(s2);//h 
alert(str);//hello

注意這是一瞬間的動做 實際上咱們沒有改變字符串自己的值。就是作了下面的動做.這也是爲何每一個字符串具備的方法並無改變字符串自己的緣由。code

由此咱們能夠知道,引用類型和基本包裝對象的區別在於:生存期
引用類型所建立的對象,在執行的期間一直在內存中,而基本包裝對象只是存在了一瞬間。對象

因此咱們沒法直接給基本類型添加方法:內存

var str = 'hello';
str.number = 10; //假設咱們想給字符串添加一個屬性number ,後臺會有以下步驟
{ 
 var _str = new String('hello'); // 1 找到對應的包裝對象類型,而後經過包裝對象建立出一個和基本類型值相同的對象
  _str.number = 10; // 2 經過這個對象調用包裝對象下的方法 但結果並無被任何東西保存
 _str =null; // 3 這個對象又被銷燬
 }
alert(str.number); //undefined  當執行到這一句的時候,由於基本類型原本沒有屬性,後臺又會從新重複上面的步驟
{ 
 var str = new String('hello'); // 1 找到基本包裝對象,而後又新開闢一個內存,建立一個值爲hello對象
 str.number = undefined   // 2 由於包裝對象下面沒有number這個屬性,因此又會從新添加,由於沒有值,因此值是未定義;而後彈出結果
 str =null; // 3 這個對象又被銷燬
 }

那麼咱們怎麼才能給基本類型添加方法或者屬性呢?
答案是在基本包裝對象的原型下面添加,每一個對象都有原型。字符串

//給字符串添加方法  要寫到對應的包裝對象的原型下才行
var str = 'hello';
String.prototype.last= fuction(){ 
    return this.charAt(this.length);
}; 
str.last(); // 5 執行到這一句,後臺依然會偷偷的幹這些事
{ 
    var _str = new String('hello');// 找到基本包裝對象,new一個和字符串值相同的對象,
    _str.last();  // 經過這個對象找到了包裝對象下的方法並調用 
    _str =null; //  這個對象被銷燬
}
相關文章
相關標籤/搜索