全部文章搬運自個人我的主頁:sheilasun.mecode
咱們都知道,JavaScript數據類型分兩大類,基本類型(或者稱原始類型)和引用類型。對象
基本類型的值是保存在棧內存中的簡單數據段,它們是按值訪問的。JS中有五種基本類型:Undefined、Null、Boolean、Number和String。生命週期
引用類型的值是保存在堆內存中的對象,它的值是按引用訪問的。引用類型主要有Object、Array、Function、RegExp、Date。ip
對象是擁有屬性和方法的,因此咱們看到下面這段代碼一點也不奇怪.內存
var favs=['雞蛋','蓮蓬']; favs.push('秋葵'); console.log(favs);//["雞蛋", "蓮蓬", "秋葵"] console.log(favs.length);//3
Array是引用類型,因此它天然能夠擁有屬性(length)和方法(push),這天經地義地就像夏天必定要吃冰淇淋同樣。可是,再看下面的代碼,仔細想一想,這這這,合法嗎?字符串
var realMessage="Said I love you but I lied"; var myMessage=realMessage.substring(5,15); console.log(myMessage); //"I love you"
有一個心碎的女紙任性地對一個用來分手的字符串任性地執行了「substring」方法,而後開心地看着剪輯版睡過去了。但是但是但是,不是說string是基本類型嗎,爲何它能夠擁有方法??還有沒有王法啊青天大老爺!get
其實,這一切,都是由於有個叫「基本包裝類型」的東東。這個基本包裝類型特別耿直,是真正的「事了拂衣去,深藏功與名」!string
除了一開始提到的Object、Array等引用類型,JavaScript還爲咱們提供了三種特殊的引用類型:String、Number和Boolean,方便咱們操做對應的基本類型。io
繼續看上面的剪輯字符串的例子,有沒有注意到,儘管使用了substring方法,realMessage自己的值是不會變的,調用這個方法只是返回了一個新的字符串。console
這就是基本包裝類型的做用了。原本你是沒有方法的,可是你想用方法的時候,你儘管調,對應的基本包裝類型有這個方法就行。例如上面的substring方法,string這個基本類型是不可能有這個方法的,可是String這個包裝類型有啊,它會吭吭哧哧地把這個方法執行完把結果返回。在執行到:
realMessage.substring(5,15)
這行代碼時,發生了不少事。
首先,它會從內存中讀取realMessage的值。當處於這種讀取模式下的時候,後臺就開始幹活了。JS高程是這樣描述後臺完成的這些動做的:
1.建立String類型的一個實例;
2.在實例上調用指定的方法;
3.銷燬這個實例
上面的例子能夠用這樣的代碼來講明:
var _realMessage=new String("Said I love you but I lied"); var myMessage=_realMessage.substring(5,15); _realMessgae=null; //方法調用後即銷燬
因此,這樣咱們就明白了,並非基本類型string執行了自身方法,而是後臺爲它建立了一個對應的基本包裝類型String,它根據基本類型的值實例化出了一個實例,讓這個實例去調用指定方法,最後銷燬本身,感天動地有木有。
注意最後一步基本包裝類型「會銷燬」的特性,這決定了咱們不能爲基本類型值添加自定義屬性和方法。
var me="sunjing"; me.age=18; console.log(me.age);//undefined
我給「me「這個字符串添加了age屬性,值設爲美好的18歲,然並卵,再次訪問時,這個屬性已經渺無蹤影了。這是由於:
執行到第二行代碼屬性賦值時,後臺建立了一個基本包裝類型的實例,這個age屬性確實掛到實例上去了,可是緊跟着,這個實例就被銷燬了。執行到第三行時,又從新建立了新的基本包裝類型的實例,天然是沒有age屬性的。
除了在字符串處於讀取模式下,後臺會幫咱們建立基本包裝類型實例時,咱們本身也能夠顯示地建立。
var str=new String("hello"); var str2=str.toUpperCase(); console.log(str2);//"HELLO:
這樣與後臺幫咱們建立時變量中保存的東西是不一樣的。
var str1=new String("hello"); var str2="hello"; typeof str1 //"object" typeof str2 //"string"
多虧了有基本包裝類型,咱們操做string、boolean、number這三種基本類型更方便了。每當讀取這三種基本類型值時,後臺會建立對應的包裝類型實例,這個實例會調用指定方法,調用完會被銷燬。這種短暫的生命週期決定了咱們不能爲基本類型添加自定義的屬性和方法。