基本類(lèi)型:Undefined,Null,Boolean,Number,String
引用類(lèi)型:Object,Array,Date,RegExp等,一般是對(duì)象或者對(duì)象的子類(lèi)型醇蝴;
基本包裝類(lèi)型:Boolean,Number,String
如下~
var str = 'hello'; //string 基本類(lèi)型
var s2 = str.charAt(0);
alert(s2); // h
毫無(wú)疑問(wèn)上面的string是一個(gè)基本類(lèi)型抡四,但是它卻能召喚出一個(gè) charAt() 的方法,這是什么原因呢芜赌?
主要是因?yàn)樵诨绢?lèi)型中瓜挽,有三個(gè)比較特殊的存在就是:String Number Boolean酱酬,這三個(gè)基本類(lèi)型都有自己對(duì)應(yīng)的包裝對(duì)象婆翔。并且隨時(shí)等候召喚姥宝。包裝對(duì)象呢爸业,其實(shí)就是對(duì)象其骄,有相應(yīng)的屬性和方法。至于這個(gè)過(guò)程是怎么發(fā)生呢扯旷,其實(shí)是在后臺(tái)偷偷發(fā)生的拯爽。
//我們平常寫(xiě)程序的過(guò)程:
var str = 'hello'; //string 基本類(lèi)型
var s2 = str.charAt(0); //在執(zhí)行到這一句的時(shí)候 后臺(tái)會(huì)自動(dòng)完成以下動(dòng)作 :
(
var _str = new String('hello'); // 1 找到對(duì)應(yīng)的包裝對(duì)象類(lèi)型,然后通過(guò)包裝對(duì)象創(chuàng)建出一個(gè)和基本類(lèi)型值相同的對(duì)象
var s2 = _str.chaAt(0); // 2 然后這個(gè)對(duì)象就可以調(diào)用包裝對(duì)象下的方法钧忽,并且返回結(jié)給s2.
_str = null; // 3 之后這個(gè)臨時(shí)創(chuàng)建的對(duì)象就被銷(xiāo)毀了毯炮, str =null;
)
alert(s2);//h
alert(str);//hello
注意這是一瞬間的動(dòng)作 實(shí)際上我們沒(méi)有改變字符串本身的值。就是做了下面的動(dòng)作.這也是為什么每個(gè)字符串具有的方法并沒(méi)有改變字符串本身的原因耸黑。
由此我們可以知道桃煎,引用類(lèi)型和基本包裝對(duì)象的區(qū)別在于:生存期
引用類(lèi)型所創(chuàng)建的對(duì)象,在執(zhí)行的期間一直在內(nèi)存中大刊,而基本包裝對(duì)象只是存在了一瞬間为迈。
所以我們無(wú)法直接給基本類(lèi)型添加方法:
var str = 'hello';
str.number = 10; //假設(shè)我們想給字符串添加一個(gè)屬性number ,后臺(tái)會(huì)有如下步驟
{
var _str = new String('hello'); // 1 找到對(duì)應(yīng)的包裝對(duì)象類(lèi)型缺菌,然后通過(guò)包裝對(duì)象創(chuàng)建出一個(gè)和基本類(lèi)型值相同的對(duì)象
_str.number = 10; // 2 通過(guò)這個(gè)對(duì)象調(diào)用包裝對(duì)象下的方法 但結(jié)果并沒(méi)有被任何東西保存
_str =null; // 3 這個(gè)對(duì)象又被銷(xiāo)毀
}
alert(str.number); //undefined 當(dāng)執(zhí)行到這一句的時(shí)候曲尸,因?yàn)榛绢?lèi)型本來(lái)沒(méi)有屬性,后臺(tái)又會(huì)重新重復(fù)上面的步驟
{
var str = new String('hello'); // 1 找到基本包裝對(duì)象男翰,然后又新開(kāi)辟一個(gè)內(nèi)存另患,創(chuàng)建一個(gè)值為hello對(duì)象
str.number = undefined // 2 因?yàn)榘b對(duì)象下面沒(méi)有number這個(gè)屬性,所以又會(huì)重新添加蛾绎,因?yàn)闆](méi)有值昆箕,所以值是未定義;然后彈出結(jié)果
str =null; // 3 這個(gè)對(duì)象又被銷(xiāo)毀
}
那么我們?cè)趺床拍芙o基本類(lèi)型添加方法或者屬性呢?
答案是在基本包裝對(duì)象的原型下面添加租冠,每個(gè)對(duì)象都有原型鹏倘。
//給字符串添加方法 要寫(xiě)到對(duì)應(yīng)的包裝對(duì)象的原型下才行
var str = 'hello';
String.prototype.last= fuction(){
return this.charAt(this.length);
};
str.last(); // 5 執(zhí)行到這一句,后臺(tái)依然會(huì)偷偷的干這些事
{
var _str = new String('hello');// 找到基本包裝對(duì)象顽爹,new一個(gè)和字符串值相同的對(duì)象纤泵,
_str.last(); // 通過(guò)這個(gè)對(duì)象找到了包裝對(duì)象下的方法并調(diào)用
_str =null; // 這個(gè)對(duì)象被銷(xiāo)毀
}