官术网_书友最值得收藏!

6.2 直接量的封包與解包

直接量是單個值,并不是對象,當(dāng)然也就沒有屬性。但是在ES中,我們可以使用直接量來調(diào)用屬性方法,例如下面的例子。

    function log(msg){
        console.log(msg);
    }


    var s ="hello";
    log(s.toUpperCase());                                     //HELLO
    log(s.substr(3, s.length));                               //lo


    var n = 325.764;
    log(n.toPrecision(5));                                   //325.76
    log(n.toExponential(5));                                 //3.25764e+2


    n = 7596389;
    log(n.toLocaleString());                                 //7,596,389
    log(n.toLocaleString("zh-Hans-CN-u-nu-hanidec"));        //七,五九六,三八九


    var b = true;
    log(b ===“true”);                                       //false
    log(b.toString() ===“true”);                            //true
    log(b.toString() === true);                             //false

這個例子中,string類型的變量s調(diào)用了toUpperCase、substr和length屬性,分別用于將s的值變?yōu)榇髮?、截取s的一部分及獲取s的長度;number類型的變量n調(diào)用了toPrecision、toExponential和toLocaleString方法,分別用于設(shè)置n的精度、將n轉(zhuǎn)換為科學(xué)計(jì)數(shù)法,以及將n轉(zhuǎn)換為本地?cái)?shù)組表達(dá)格式;boolean類型的b屬性調(diào)用了toString方法,用于將boolean轉(zhuǎn)換為string類型。

既然直接量只是一個值而不是對象,那么它怎么可以調(diào)用屬性方法呢?原來ES有一種叫作自動封包/解包的功能。封包/解包對于熟悉Java的讀者來說一定不會陌生(在Java中也稱裝箱/拆箱,它們的含義都一樣),其作用是在程序執(zhí)行過程中按照實(shí)際需要自動在直接量和其所對應(yīng)的對象類型之間進(jìn)行轉(zhuǎn)化。將直接量轉(zhuǎn)換為對應(yīng)的對象進(jìn)行處理叫作封包,反過來,將對象轉(zhuǎn)換為直接量叫作解包。封包和解包都是JS引擎自動完成的,而且只是為了完成程序的執(zhí)行而進(jìn)行的暫時轉(zhuǎn)換,并不會實(shí)際修改變量的類型。有了封包/解包我們就不需要考慮什么時候使用直接量什么時候使用對象了,而且也不需要擔(dān)心變量類型會發(fā)生變化。上面的例子就使用了封包功能,下面我們再來看一個使用到解包功能的例子。

    var m = new Number(5);
    var n = m+2;                      //m會自動解包為直接量后再計(jì)算
    console.log(n);                   //7
    console.log(typeof  m);          //object
    console.log(typeof  n);          //number

這個例子中,定義了對象類型的m變量,當(dāng)對其進(jìn)行加法計(jì)算時m會自動解包為直接量再進(jìn)行計(jì)算,但是計(jì)算之后m的類型并不會變化,還是object類型。

實(shí)際使用中我們很少直接使用直接量所對應(yīng)的包裝對象,所以封包功能使用得非常多,但是解包功能相對使用得就比較少了。

主站蜘蛛池模板: 法库县| 永新县| 呼伦贝尔市| 揭阳市| 通山县| 蒲城县| 滦平县| 淮南市| 灵山县| 鄂托克旗| 资中县| 类乌齐县| 江城| 西乌珠穆沁旗| 通山县| 宾川县| 甘德县| 西乌| 廊坊市| 德钦县| 平顶山市| 荥阳市| 方正县| 虎林市| 二连浩特市| 乌兰察布市| 临夏县| 濮阳县| 彭阳县| 治县。| 大港区| 井研县| 凉城县| 景洪市| 隆尧县| 香格里拉县| 廉江市| 上饶县| 稻城县| 临猗县| 平江县|