深入理解JavaScript中為什么string可以擁有方法
引子
我們都知道,JavaScript數(shù)據(jù)類型分兩大類,基本類型(或者稱原始類型)和引用類型。
基本類型的值是保存在棧內(nèi)存中的簡(jiǎn)單數(shù)據(jù)段,它們是按值訪問的。JS中有五種基本類型:Undefined、Null、Boolean、Number和String。
引用類型的值是保存在堆內(nèi)存中的對(duì)象,它的值是按引用訪問的。引用類型主要有Object、Array、Function、RegExp、Date。
對(duì)象是擁有屬性和方法的,所以我們看到下面這段代碼一點(diǎn)也不奇怪.
var favs=['雞蛋','蓮蓬']; favs.push('秋葵'); console.log(favs);//["雞蛋", "蓮蓬", "秋葵"] console.log(favs.length);//3
Array是引用類型,所以它自然可以擁有屬性(length)和方法(push),這天經(jīng)地義地就像夏天一定要吃冰淇淋一樣。但是,再看下面的代碼,仔細(xì)想想,這這這,合法嗎?
var realMessage="Said I love you but I lied"; var myMessage=realMessage.substring(5,15); console.log(myMessage); //"I love you"
有一個(gè)心碎的女紙任性地對(duì)一個(gè)用來分手的字符串任性地執(zhí)行了“substring”方法,然后開心地看著剪輯版睡過去了。可是可是可是,不是說string是基本類型嗎,為什么它可以擁有方法??還有沒有王法啊青天大老爺!
其實(shí),這一切,都是因?yàn)橛袀€(gè)叫“基本包裝類型”的東東。這個(gè)基本包裝類型特別耿直,是真正的“事了拂衣去,深藏功與名”!
基本包裝類型
除了一開始提到的Object、Array等引用類型,JavaScript還為我們提供了三種特殊的引用類型:String、Number和Boolean,方便我們操作對(duì)應(yīng)的基本類型。
繼續(xù)看上面的剪輯字符串的例子,有沒有注意到,盡管使用了substring方法,realMessage本身的值是不會(huì)變的,調(diào)用這個(gè)方法只是返回了一個(gè)新的字符串。
這就是基本包裝類型的作用了。本來你是沒有方法的,但是你想用方法的時(shí)候,你盡管調(diào),對(duì)應(yīng)的基本包裝類型有這個(gè)方法就行。例如上面的substring方法,string這個(gè)基本類型是不可能有這個(gè)方法的,但是String這個(gè)包裝類型有啊,它會(huì)吭吭哧哧地把這個(gè)方法執(zhí)行完把結(jié)果返回。在執(zhí)行到:
realMessage.substring(5,15)這行代碼時(shí),發(fā)生了很多事。
首先,它會(huì)從內(nèi)存中讀取realMessage的值。當(dāng)處于這種讀取模式下的時(shí)候,后臺(tái)就開始干活了。JS高程是這樣描述后臺(tái)完成的這些動(dòng)作的:
1.創(chuàng)建String類型的一個(gè)實(shí)例;
2.在實(shí)例上調(diào)用指定的方法;
3.銷毀這個(gè)實(shí)例
上面的例子可以用這樣的代碼來說明:
var _realMessage=new String("Said I love you but I lied"); var myMessage=_realMessage.substring(5,15); _realMessgae=null; //方法調(diào)用后即銷毀
所以,這樣我們就明白了,并不是基本類型string執(zhí)行了自身方法,而是后臺(tái)為它創(chuàng)建了一個(gè)對(duì)應(yīng)的基本包裝類型String,它根據(jù)基本類型的值實(shí)例化出了一個(gè)實(shí)例,讓這個(gè)實(shí)例去調(diào)用指定方法,最后銷毀自己,感天動(dòng)地有木有。
注意最后一步基本包裝類型“會(huì)銷毀”的特性,這決定了我們不能為基本類型值添加自定義屬性和方法。
var me="sunjing"; me.age=18; console.log(me.age);//undefined
我給“me“這個(gè)字符串添加了age屬性,值設(shè)為美好的18歲,然并卵,再次訪問時(shí),這個(gè)屬性已經(jīng)渺無蹤跡了。這是因?yàn)?
執(zhí)行到第二行代碼屬性賦值時(shí),后臺(tái)創(chuàng)建了一個(gè)基本包裝類型的實(shí)例,這個(gè)age屬性確實(shí)掛到實(shí)例上去了,但是緊跟著,這個(gè)實(shí)例就被銷毀了。執(zhí)行到第三行時(shí),又重新創(chuàng)建了新的基本包裝類型的實(shí)例,自然是沒有age屬性的。
顯示使用基本包裝類型
除了在字符串處于讀取模式下,后臺(tái)會(huì)幫我們創(chuàng)建基本包裝類型實(shí)例時(shí),我們自己也可以顯示地創(chuàng)建。
var str=new String("hello"); var str2=str.toUpperCase(); console.log(str2);//"HELLO:
這樣與后臺(tái)幫我們創(chuàng)建時(shí)變量中保存的東西是不同的。
var str1=new String("hello"); var str2="hello"; typeof str1 //"object" typeof str2 //"string"
總結(jié)
多虧了有基本包裝類型,我們操作string、boolean、number這三種基本類型更方便了。每當(dāng)讀取這三種基本類型值時(shí),后臺(tái)會(huì)創(chuàng)建對(duì)應(yīng)的包裝類型實(shí)例,這個(gè)實(shí)例會(huì)調(diào)用指定方法,調(diào)用完會(huì)被銷毀。這種短暫的生命周期決定了我們不能為基本類型添加自定義的屬性和方法。
以上這篇深入理解JavaScript中為什么string可以擁有方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- JS 對(duì)象(Object)和字符串(String)互轉(zhuǎn)方法
- 淺析JavaScript Array和string的轉(zhuǎn)換(推薦)
- js字符串截取函數(shù)slice、substring和substr的比較
- JavaScript String 對(duì)象常用方法詳解
- JavaScript String 對(duì)象常用方法總結(jié)
- JS中JSON對(duì)象和String之間的互轉(zhuǎn)及處理技巧
- JS簡(jiǎn)單實(shí)現(xiàn)String轉(zhuǎn)Date的方法
- Javascript實(shí)現(xiàn)Array和String互轉(zhuǎn)換的方法
- JavaScript的Number對(duì)象的toString()方法
相關(guān)文章
js實(shí)現(xiàn)prototype擴(kuò)展的方法(字符串,日期,數(shù)組擴(kuò)展)
這篇文章主要介紹了js實(shí)現(xiàn)prototype擴(kuò)展的方法,實(shí)例分析了JavaScript針對(duì)字符串、日期、數(shù)組等的prototype擴(kuò)展相關(guān)技巧,需要的朋友可以參考下2016-01-01JavaScript中push(),join() 函數(shù) 實(shí)例詳解
本文通過實(shí)例給大家介紹了JavaScript中push(),join() 的知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09js中判斷Object、Array、Function等引用類型對(duì)象是否相等
項(xiàng)目中有時(shí)會(huì)需要對(duì)引用類型進(jìn)行比較,如常見的object和array,我們知道,引用類型無法直接使用 == 或=== 取得期待結(jié)果,因此需要一個(gè)迭代的compare函數(shù)轉(zhuǎn)化成原始類型進(jìn)行比較2012-08-08基于JavaScript實(shí)現(xiàn)屏幕滾動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了基于JavaScript實(shí)現(xiàn)屏幕滾動(dòng)效果的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01