ECMAScript 提供了 3 個特殊的引用類型:Boolean琳省、Number和 String。這些類型與其他引用類型相似握截,但同時也具有與各自的基本類型相應(yīng)的特殊行為袖订。包裝對象:
包裝對象,就是當(dāng)基本類型以對象的方式去使用時隘截,JavaScript會轉(zhuǎn)換成對應(yīng)的包裝類型扎阶,相當(dāng)于new一個對象,內(nèi)容和基本類型的內(nèi)容一樣技俐,然后當(dāng)操作完成再去訪問的時候乘陪,這個臨時對象會被銷毀,然后再訪問時候就是undefined雕擂。number,string,boolean都有對應(yīng)的包裝類型。
number,string,boolean都有對應(yīng)的包裝類型
基本包裝類型概述
實際上,每當(dāng)讀取一個基本類型值的時候,后臺就會創(chuàng)建一個對應(yīng)的基本包裝類型的對象,從而能夠調(diào)用一些方法來操作這些數(shù)據(jù);
var box = 'Mr.Lee';? ? ? ? ? // 定義一個String字符串;?
var box2 = box.substring(2);? ? // 截掉字符串前兩位;
console.log(box2);? ? ? ? ? // 輸出新字符串;=>.Lee;
// 變量box是一個字符串String類型,而box.substring(2)又說明它是一個對象(只有對象才會調(diào)用方法);
console.log('Mr.Lee'.substring(3));? // 直接通過字符串值來調(diào)用方法=>Lee;
引用類型和基本包裝類型的主要區(qū)別就是對象的生存期;
自動創(chuàng)建的基本包裝類型的對象,則只存在于一行代碼的執(zhí)行瞬間,然后立即被銷毀;
這意味著我們不能在運行時為基本類型值添加屬性和方法;
var s1 = 'some text'; // => var s1 = new String('some text');
var s2 = s1.substring(5); // => var s2 = s1.substring(5);
// s1 = null; 銷毀這個實例;后臺自動執(zhí)行;
列:
var str = 'hello';
str.number = 10; //假設(shè)我們想給字符串添加一個屬性number 贱勃,后臺會有如下步驟
{
var str = new String('hello'); // 1 找到對應(yīng)的包裝對象類型井赌,然后通過包裝對象創(chuàng)建出一個和基本類型值相同的對象
? str.number = 10; // 2 通過這個對象調(diào)用包裝對象下的方法 但結(jié)果并沒有被任何東西保存
str =null; // 3 這個對象又被銷毀
}
alert(str.number); //undefined? 當(dāng)執(zhí)行到這一句的時候,因為基本類型本來沒有屬性贵扰,后臺又會重新重復(fù)上面的步驟
{
var str = new String('hello'); // 1 找到基本包裝對象仇穗,然后又新開辟一個內(nèi)存,創(chuàng)建一個值為hello對象
str.number = undefined? // 2 因為包裝對象下面沒有number這個屬性戚绕,所以又會重新添加纹坐,因為沒有值,所以值是未定 ;然后彈出結(jié)果
str =null; // 3 這個對象又被銷毀
}
每個對象都有原型舞丛。
舉例:
//給字符串添加方法? 要寫到對應(yīng)的包裝對象的原型下才行
var str = 'hello';
String.prototype.last= fuction(){
? ? return this.charAt(this.length);
};
str.last(); // 5 執(zhí)行到這一句耘子,后臺依然會偷偷的干這些事
{
? ? var str = new String('hello');// 找到基本包裝對象,new一個和字符串值相同的對象球切,
? ? str.last();? // 通過這個對象找到了包裝對象下的方法并調(diào)用
? ? str =null; //? 這個對象被銷毀
}