欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談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,方便我們操作對應的基本類型。

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

這就是基本包裝類型的作用了。本來你是沒有方法的,但是你想用方法的時候,你盡管調(diào),對應的基本包裝類型有這個方法就行。例如上面的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)建了一個對應的基本包裝類型String,它根據(jù)基本類型的值實例化出了一個實例,讓這個實例去調(diào)用指定方法,最后銷毀自己,感天動地有木有。

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

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

我給“me“這個字符串添加了age屬性,值設為美好的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)建對應的包裝類型實例,這個實例會調(diào)用指定方法,調(diào)用完會被銷毀。這種短暫的生命周期決定了我們不能為基本類型添加自定義的屬性和方法。

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

最近在看《Javascript高級程序設計》一書,在書中發(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ù)字最為終止位。

相關文章

  • JavaScript實現(xiàn)點擊圖片換背景

    JavaScript實現(xiàn)點擊圖片換背景

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)點擊圖片換背景,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • JS中的THIS和WINDOW.EVENT.SRCELEMENT詳解

    JS中的THIS和WINDOW.EVENT.SRCELEMENT詳解

    對于js初學著必須理解this和srcElement的應用,這也是面試中經(jīng)??嫉降摹O旅嫖覀兙屯ㄟ^幾個示例來詳細了解下
    2015-05-05
  • 使用TypeScript實現(xiàn)一個類型安全的EventBus示例詳解

    使用TypeScript實現(xiàn)一個類型安全的EventBus示例詳解

    EventBus是工作中常用的工具,本文用Typescript實現(xiàn)一個具備基礎功能且類型安全的EventBus,是我近期學習Typescript的知識總結(jié),對TypeScript實現(xiàn)EventBus相關知識感興趣的朋友一起看看吧
    2022-06-06
  • javascript設計簡單的秒表計時器

    javascript設計簡單的秒表計時器

    這篇文章主要介紹了javascript設計簡單的秒表計時器,該秒表將包括兩個按鈕和一個用于顯示時間的文本框,當單擊開始按鈕時開始計時,最小單位為0.01秒,此時再次單擊按鈕則停止計時,文本框顯示經(jīng)過的時間,需要的朋友可以參考下
    2015-11-11
  • 十個你必須要會的TypeScript技巧分享

    十個你必須要會的TypeScript技巧分享

    學習Typescript通常是一個重新發(fā)現(xiàn)的過程。這篇文章為大家整理了十個你必須要會的TypeScript技巧,希望對大家學習TypeScript有所幫助
    2023-06-06
  • Vim快速合并行及vim 將文件所有行合并到一行

    Vim快速合并行及vim 將文件所有行合并到一行

    Vim是一個類似于Vi的著名的功能強大、高度可定制的文本編輯器,在Vi的基礎上改進和增加了很多特性.這篇文章主要介紹了Vim快速合并行及vim 將文件所有行合并到一行,需要的朋友可以參考下
    2017-11-11
  • JavaScript實現(xiàn)電燈開關小案例

    JavaScript實現(xiàn)電燈開關小案例

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)電燈開關小案例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 區(qū)別JavaScript函數(shù)聲明與變量聲明

    區(qū)別JavaScript函數(shù)聲明與變量聲明

    這篇文章給大家分享了關于JavaScript中函數(shù)聲明與變量聲明之間的區(qū)別以及相關知識點,有興趣的朋友參考下。
    2018-09-09
  • 詳解JavaScript中Arguments對象用途

    詳解JavaScript中Arguments對象用途

    本文主要介紹了詳解JavaScript中Arguments對象用途,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • JavaScript實現(xiàn)全選取消效果

    JavaScript實現(xiàn)全選取消效果

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)全選取消效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評論