最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談JavaScript中的string擁有方法的原因

 更新時間:2015年08月28日 09:00:45   作者:SheilaSun  
這篇文章主要介紹了淺談JavaScript中的string擁有方法的原因,需要的朋友可以參考下

引子

我們都知道,JavaScript數(shù)據(jù)類型分兩大類,基本類型(或者稱原始類型)和引用類型。

基本類型的值是保存在棧內(nèi)存中的簡單數(shù)據(jù)段,它們是按值訪問的。JS中有五種基本類型:Undefined、Null、Boolean、Number和String。

引用類型的值是保存在堆內(nèi)存中的對象,它的值是按引用訪問的。引用類型主要有Object、Array、Function、RegExp、Date。

對象是擁有屬性和方法的,所以我們看到下面這段代碼一點也不奇怪.

var favs=['雞蛋','蓮蓬'];
favs.push('秋葵');
console.log(favs);//["雞蛋", "蓮蓬", "秋葵"]
console.log(favs.length);//3

Array是引用類型,所以它自然可以擁有屬性(length)和方法(push),這天經(jīng)地義地就像夏天一定要吃冰淇淋一樣。但是,再看下面的代碼,仔細想想,這這這,合法嗎?

var realMessage="Said I love you but I lied";
var myMessage=realMessage.substring(5,15);
console.log(myMessage); //"I love you"

有一個心碎的女紙任性地對一個用來分手的字符串任性地執(zhí)行了“substring”方法,然后開心地看著剪輯版睡過去了??墒强墒强墒?,不是說string是基本類型嗎,為什么它可以擁有方法??還有沒有王法啊青天大老爺!

其實,這一切,都是因為有個叫“基本包裝類型”的東東。這個基本包裝類型特別耿直,是真正的“事了拂衣去,深藏功與名”!

基本包裝類型

除了一開始提到的Object、Array等引用類型,JavaScript還為我們提供了三種特殊的引用類型:String、Number和Boolean,方便我們操作對應(yīng)的基本類型。

繼續(xù)看上面的剪輯字符串的例子,有沒有注意到,盡管使用了substring方法,realMessage本身的值是不會變的,調(diào)用這個方法只是返回了一個新的字符串。

這就是基本包裝類型的作用了。本來你是沒有方法的,但是你想用方法的時候,你盡管調(diào),對應(yīng)的基本包裝類型有這個方法就行。例如上面的substring方法,string這個基本類型是不可能有這個方法的,但是String這個包裝類型有啊,它會吭吭哧哧地把這個方法執(zhí)行完把結(jié)果返回。在執(zhí)行到:

realMessage.substring(5,15)

這行代碼時,發(fā)生了很多事。

首先,它會從內(nèi)存中讀取realMessage的值。當處于這種讀取模式下的時候,后臺就開始干活了。JS高程是這樣描述后臺完成的這些動作的:

1.創(chuàng)建String類型的一個實例;
2.在實例上調(diào)用指定的方法;
3.銷毀這個實例

上面的例子可以用這樣的代碼來說明:

var _realMessage=new String("Said I love you but I lied");
var myMessage=_realMessage.substring(5,15);
_realMessgae=null; //方法調(diào)用后即銷毀

所以,這樣我們就明白了,并不是基本類型string執(zhí)行了自身方法,而是后臺為它創(chuàng)建了一個對應(yīng)的基本包裝類型String,它根據(jù)基本類型的值實例化出了一個實例,讓這個實例去調(diào)用指定方法,最后銷毀自己,感天動地有木有。

注意最后一步基本包裝類型“會銷毀”的特性,這決定了我們不能為基本類型值添加自定義屬性和方法。

var me="sunjing";
me.age=18;
console.log(me.age);//undefined

我給“me“這個字符串添加了age屬性,值設(shè)為美好的18歲,然并卵,再次訪問時,這個屬性已經(jīng)渺無蹤跡了。這是因為:

執(zhí)行到第二行代碼屬性賦值時,后臺創(chuàng)建了一個基本包裝類型的實例,這個age屬性確實掛到實例上去了,但是緊跟著,這個實例就被銷毀了。執(zhí)行到第三行時,又重新創(chuàng)建了新的基本包裝類型的實例,自然是沒有age屬性的。

顯示使用基本包裝類型

除了在字符串處于讀取模式下,后臺會幫我們創(chuàng)建基本包裝類型實例時,我們自己也可以顯示地創(chuàng)建。

var str=new String("hello");
var str2=str.toUpperCase();
console.log(str2);//"HELLO:

這樣與后臺幫我們創(chuàng)建時變量中保存的東西是不同的。

var str1=new String("hello");
var str2="hello";
typeof str1 //"object"
typeof str2 //"string"

總結(jié)

多虧了有基本包裝類型,我們操作string、boolean、number這三種基本類型更方便了。每當讀取這三種基本類型值時,后臺會創(chuàng)建對應(yīng)的包裝類型實例,這個實例會調(diào)用指定方法,調(diào)用完會被銷毀。這種短暫的生命周期決定了我們不能為基本類型添加自定義的屬性和方法。

我們再來看下javascript中String類的subString()方法和slice()方法

最近在看《Javascript高級程序設(shè)計》一書,在書中發(fā)現(xiàn)一些以前沒有接觸過的且比較實用的技巧和知識點,想通過博客記錄一下,以加深記憶。

在該書2.8.4節(jié)中講到String類中的subString()方法和slice()方法,其用法和返回結(jié)果都基本相同,如下示例:

var strObj = new String("hello world");
alert(strObj.slice(3));      // 輸出結(jié)果:"ol world"
alert(strObj.subString(3));    // 輸出結(jié)果:"ol world"
alert(strObj.slice(3, 7));    // 輸出結(jié)果:"lo w"
alert(strObj.subString(3,7));   // 輸出結(jié)果:"lo w"

由以上代碼的輸出結(jié)果可已看出,slice()方法和subString()方調(diào)用方法法和輸出結(jié)果完全一樣,這兩種方法返回的都是要處理的字符串的子串,都接受一個或兩個參數(shù),第一個參數(shù)是要獲取的子串的起始位置,第二個參數(shù)是要獲取子串的終止位置,如果第二個參數(shù)省略終止位置就默認為字符串的長度,且兩個方法都不改變String對象自身的值。

為什么有兩個功能完全相同的方法呢?事實上,這兩個方法并不完全相同,不過只在參數(shù)為負值時,他們處理參數(shù)的方式稍有不同。

對于負數(shù)參數(shù),slice()方法會用字符串的長度加上參數(shù),subString()方法將其作為0處理,例如:

var strObj = new String("hello world");
alert(strObj.slice(-3));      // 輸出結(jié)果:"rld"
alert(strObj.subString(-3));    // 輸出結(jié)果:"hello world"
alert(strObj.slice(3,-4));     // 輸出結(jié)果:"lo w"
alert(strObj.subString(3,-4))   // 輸出結(jié)果:"hel"

這樣既可看到slice()和subString()方法的主要不同。當只有參數(shù)-3時,slice()返回"rld",subString()則返回"hello world"。這是因為對于字符串"hello world",slice(-3)將被轉(zhuǎn)換成slice(8),而subString(-3)則轉(zhuǎn)化成subString(0)。同樣,使用3和-4差別也是很明顯。slice()方法將被轉(zhuǎn)換成slice(3,7),與前面的例子相同,返回"lo w"。而subString()方法則將這個兩個參數(shù)解釋為subString(0,3),實際上是:subString(0,3),因為subString()總是把較小的參數(shù)作為起始位,較大的數(shù)字最為終止位。

相關(guān)文章

  • 純文字版返回頂端的js代碼

    純文字版返回頂端的js代碼

    這篇文章介紹了純文字版返回頂端的js代碼,有需要的朋友可以參考一下
    2013-08-08
  • 理解javascript async的用法

    理解javascript async的用法

    本篇文章主要介紹了理解javascript async的用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • JS設(shè)置緩存和緩存過期時間的操作方法

    JS設(shè)置緩存和緩存過期時間的操作方法

    js-cookie是一個用于處理瀏覽器Cookie的JavaScript庫,本文通過實例代碼講解JS設(shè)置緩存和緩存過期時間的操作方法,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • js中async函數(shù)結(jié)合promise的小案例淺析

    js中async函數(shù)結(jié)合promise的小案例淺析

    這篇文章主要介紹了js中async函數(shù)結(jié)合promise的小案例淺析,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • JS document form表單元素操作完整示例

    JS document form表單元素操作完整示例

    這篇文章主要介紹了JS document form表單元素操作,結(jié)合完整實例形式詳細分析了JavaScript form表單元素獲取、輸出、遍歷等相關(guān)操作技巧,需要的朋友可以參考下
    2020-01-01
  • js控制再次點擊按鈕之間的間隔時間可防止重復(fù)提交

    js控制再次點擊按鈕之間的間隔時間可防止重復(fù)提交

    使用js控制再次點擊按鈕之間的間隔時間可防止重復(fù)提交,需要的朋友可以參考下
    2014-08-08
  • JavaScript圖片url地址轉(zhuǎn)base64簡單示例

    JavaScript圖片url地址轉(zhuǎn)base64簡單示例

    這篇文章主要給大家介紹了關(guān)于JavaScript圖片url地址轉(zhuǎn)base64的相關(guān)資料,圖片URL轉(zhuǎn)Base64是把圖片URL轉(zhuǎn)化為一個以base64編碼的字符串格式,使得圖片可以直接在HTML或CSS中使用,需要的朋友可以參考下
    2023-10-10
  • 最新評論

    大宁县| 望谟县| 大渡口区| 桑植县| 依兰县| 西林县| 黔江区| 界首市| 松原市| 金秀| 油尖旺区| 合作市| 贵定县| 柳江县| 阿鲁科尔沁旗| 栖霞市| 凤台县| 安国市| 万州区| 进贤县| 外汇| 马尔康县| 明光市| 会理县| 丰宁| 慈溪市| 宁强县| 邹城市| 洛川县| 灯塔市| 汝阳县| 澎湖县| 和静县| 浑源县| 黄浦区| 合肥市| 丘北县| 印江| 迁安市| 油尖旺区| 抚顺县|