今天來討論一下JS中的基本包裝對象(也叫基本包裝類型),之前剛學到這里的時候,自己也是一頭霧水,不明白這個基本包裝對象到底是個什么鬼,后來找了很多資料,終於看清了它的真面目。首先呢,我們現在復習一下JS的數據類型,JS數據類型被分為了兩大門派,基本類型和引用類型。
基本類型:Undefined,Null,Boolean,Number,String
引用類型:Object,Array,Date,RegExp等,說白了就是對象。。。
我們都知道,引用類型有方法和屬性,但是基本類型是木有的,但是你一定見過這樣的代碼
var str = 'hello'; //string 基本類型 var s2 = str.charAt(0);
alert(s2); // h
毫無疑問上面的string是一個基本類型,但是它卻能召喚出一個charAt()的方法,這是什么原因呢?
主要是因為在基本類型中,有三個比較特殊的存在就是:String Number Boolean,這三個基本類型都有自己對應的包裝對象。並且隨時等候召喚。包裝對象呢,其實就是對象,有相應的屬性和方法。至於這個過程是怎么發生呢,其實是在后台偷偷發生的。
來看個栗子
//我們平常寫程序的過程: 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 注意這是一瞬間的動作 實際上我們沒有改變字符串本身的值。就是做了下面的動作.這也是為什么每個字符串具有的方法並沒有改變字符串本身的原因。
由此我們可以知道,引用類型和基本包裝對象的區別在於:生存期
引用類型所創建的對象,在執行的期間一直在內存中,而基本包裝對象只是存在了一瞬間。
所以我們無法直接給基本類型添加方法:
舉個栗子
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; // 這個對象被銷毀 }
看注釋相信能看出創建在基本包裝對象原型下面的方法和屬性才能被保存。
關於基本包裝對象就嘮到這里了,希望大家都有所收獲,一起學習,我是沐晴,一個隨性灑脫的前端妹子,下篇不見不散。