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

6.3 直接量的包裝對象

直接量所對應的對象叫作包裝對象,string、number、boolean所對應的包裝對象分別是String對象、Number對象和Boolean對象,它們都是function類型的對象。本節我們就來學習這三個對象。

一個對象最重要的就是它所包含的屬性,而function對象的屬性又分為兩大類,一類是它自身的屬性,另一類是它創建的object類型實例對象的屬性,創建的實例對象的屬性又分為實例自己的屬性和function的prototype的屬性。

學習function類型對象最重要的是學習兩個方面的內容:function作為函數的功能和它對應的屬性。對于包裝類型的對象來說,作為函數使用時的功能都是將傳入的參數轉換為function所對應的直接量,例如,使用String("abc");可以新建值為abc的字符串類型的直接量等,其實和不使用函數的效果是一樣的,所以學習包裝類型對象主要是學習它所對應的屬性。包裝對象的屬性和普通對象的屬性沒有什么區別,也是一共包括三部分:function對象自身擁有的屬性、創建的實例對象所擁有的屬性和function的prototype屬性對象中的屬性。下面我們就從這三個方面分別學習這三個包裝對象。

本節的內容以ES5.1為主,ES2015中新增的內容會在后面給大家補充。

6.3.1 String對象

String對象是function類型的對象,對應的是字符串類型,可用來創建字符串類型的object對象,例如,new String("abc");就可以創建一個值為abc的字符串對象。最重要的還是它所對應的三種屬性。

1. String自身的屬性

String類型自身只有兩個屬性,一個是prototype,另一個是fromCharCode。對于prototype我們就不再解釋了,fromCharCode方法的作用是創建由Unicode值所對應的字符組成的字符串,需要一個或多個參數,例如下面的例子。

    var s = String.fromCharCode(97, 98, 99);
    console.log(s);     //abc

在這個例子中,因為97、98、99所對應的Unicode值分別為a、b、c,所以創建出來的字符串s就是abc。

2. String.prototype中的屬性

在ES5.1標準中,String的prototype有20個屬性,這20個屬性在使用String創建出來的object類型對象和字符串直接量中都可以直接使用,分別介紹如下。

? constructor:默認指向String對象本身。

? toString:因為String的prototype重寫了toString方法,所以字符串的toString不會返回[object, Object]或者[object, String]而是返回字符串本身的值。

? valueOf:String的prototype也重寫了valueOf方法,它會返回字符串本身。

? charAt:這個方法用來獲取指定位置的字符,序號從0開始,例如下面的例子。

    var s = "hello";
    console.log(s.charAt(1));     //e

這里獲取的是s字符串中序號為1的字符,也就是第二個字符,因此是e。

? charCodeAt:這個方法和charAt類似,但它獲取的是Unicode值,例如下面的例子。

    var s = "hello";
    console.log(s.charCodeAt(1));     //101

在這個例子中,因為e的Unicode值為101,所以這里返回的值為101。

? concat:這個方法可以將多個字符串連接在一起組成一個新字符串,例如下面的例子。

    var s = "hello";
    var s1 = s.concat(" ECMAScript", "! ");
    console.log(s1);                  //hello ECMAScript!

在這個例子中,concat方法就將字符串s、“ECMAScript”和“! ”連接在一起。需要注意的是,連接之后s并沒有發生變化,只是將連接之后的值返回給新的變量s1。

? indexOf:這個方法用來查找指定的字符或者字符串,它有兩個參數,第一個參數是要查找的字符或字符串;第二個參數可選,代表查找的起始位置,如果省略第二個參數,那么默認會從第一個字符開始查找。如果indexOf方法查找到指定的字符(串),就會返回查找到的第一個字符在字符串中的序號(從0開始);如果找不到就會返回-1。我們來看下面的例子。

    var s="prototype";
    console.log(s.indexOf("o"));             //2
    console.log(s.indexOf("ot"));            //2
    console.log(s.indexOf("ot", 3));        //4
    console.log(s.indexOf("a"));           //-1

? lastIndexOf:這個方法和indexOf的用法一樣,不同之處在于:indexOf是從前往后找,而lastIndexOf是從后往前找,并且lastIndexOf的第二個參數position的作用是指定要查找的字符串的結束位置(從0開始計數),例如下面的例子。

    var s="prototype";
    console.log(s.lastIndexOf("o"));        //4
    console.log(s.lastIndexOf("o", 3));     //2,在“prot”字符串中查找

? localeCompare:這個方法的作用是使用本地化方式比較字符串,類似于>、<的作用,但是,>、<只能依據Unicode編碼來比較字符串的大小,而有些地區的字符順序和Unicode編碼并不一樣,這時就需要使用localeCompare方法來比較了。如果當前對象比要比較的字符小,則返回一個小于0的數,如果當前對象比要比較的字符大,則返回一個大于0的數,如果當前對象與要比較的字符相同,則返回0,例如下面的例子。

    console.log("a".localeCompare("b"));            //-1
    console.log("b".localeCompare("a"));            //1
    console.log("a".localeCompare("a"));            //0

? match:這個方法用于匹配指定的內容,如果傳入的參數為字符串,則會匹配字符串,如果傳入的參數是正則表達式,則會返回與正則表達式相匹配的內容,例如下面的例子。

    console.log("hello JavaScript".match("Script"));          //["Script"]
    console.log("hello JavaScript".match("script"));          //null
    console.log("hello JavaScript".match(/script/i));         //["Script"]
    console.log("hello JavaScript".match(/a+/g));             //["a", "a"]
    console.log("hello ECMAScript5.1 and ECMAScript2015".match(/\d+/g));
                                                              //["5", "1", "2015"]

如果直接使用字符串匹配,那么是區分大小寫的,如果使用正則表達式,則可以使用i(ignore case)標示不區分大小寫。還可以使用g(global)標示查找全部符合條件的內容,例如,上述例子中的最后一行代碼查找了所有數字。

? replace:這個方法用來將字符串中指定的內容替換為新內容,要替換的內容可以是字符串也可以是正則表達式。默認只會替換第一個符合條件的內容,使用正則表達式可以使用g來替換全部符合條件的內容。我們來看個例子。

    var s = "beneficial";
    console.log(s.replace("e", "E"));               //bEneficial
    console.log(s.replace(/e/, "E"));               //bEneficial
    console.log(s.replace(/e/g, "E"));              //bEnEficial
    console.log(s);                                 //beneficial
    console.log("pwd:12345".replace(/\d/g, "*"));  //pwd:*****

通過這個例子大家就可以明白replace的用法了。需要注意的是,replace并不會修改原來對象的值,而是返回新的對象,例如,這個例子中調用了s.replace("e", "E")之后s的值并沒有發生變化。如果需要同時修改s的值,那么可以將返回值再賦值給s,即s =s.replace("e", "E");,這樣就可以將替換后的值賦值給s。

? search:這個方法的功能類似indexOf方法,不同之處在于:search使用的是正則表達式而不是字符串進行查找,且不能指定起始位置,在正則表達式中也不能使用g標示,返回值和indexOf方法相同,例如下面的例子。

    console.log("hello ECMAScript5.1 and ECMAScript2015".search(/\d/));    //16

? slice:這個方法用于截取字符串的一部分,它有兩個參數,分別表示要截取的字符串的起始位置和結束位置,如果大于0,則從前面計數,如果小于0,則從后面計數,如果省略第二個參數,則會截取到字符串的末尾,例如下面的例子。

    var s = "hello ECMAScript5.1 and ECMAScript2015";
    console.log(s.slice(6,19));        //ECMAScript5.1
    console.log(s.slice(6, -4));      //ECMAScript5.1 and ECMAScript
    console.log(s.slice(-14, -4));    //ECMAScript
    console.log(s.slice(0, -14));    //hello ECMAScript5.1 and
    console.log(s.slice(-14));       //ECMAScript2015

需要注意的是,slice方法也不會改變原來的字符串,同樣會返回一個新的字符串。

? substring:這個方法和slice類似,也是截取字符串中的一部分,它的兩個參數也分別表示字符串的起始位置和結束位置,所不同的是substring中如果結束位置在起始位置之前,則會自動將其調換之后再截取,當參數小于0時會按0處理,例如下面的例子。

    console.log("www.excelib.com".substring(4, 11));       //excelib
    console.log("www.excelib.com".substring(11, 4));       //excelib
    console.log("www.excelib.com".substring(3, -4));       //www
    console.log("www.excelib.com".substring(3, 0));        //www
    console.log("www.excelib.com".substring(4));           //excelib.com

從這個例子可以看出,substring(4, 11)和substring(11, 4)是一樣的,substring(3, -4)和substring(3, 0)也是一樣的,如果省略第二個參數,則會截取到字符串末尾。

與substring類似的還有一個substr方法,但substr并不是標準里的方法。substr方法也有兩個參數,第一個參數也是起始位置,第二個參數表示要截取的長度。如果第一個參數是負數,則會從字符串的后面向前面計數(同slice方法),例如下面的例子。

    console.log("www.excelib.com".substr(4, 7));           //excelib
    console.log("www.excelib.com".substr(-11, 7));         //excelib
    console.log("www.excelib.com".substr(-11));            //excelib.com

雖然現在的主流瀏覽器都對substr方法提供了支持,但是,因為它不是標準里的方法,隨時都有可能被舍棄,所以應該盡量少使用它。

? split:這個方法用于按照指定分隔符將字符串轉換為字符串數組。split方法有兩個參數,第一個是分隔符,如果不為空則使用它來分隔字符串,如果為空則按字符分隔字符串;第二個參數可選,表示需要返回數組中元素的個數,如果省略則將分隔后的元素全部返回,例如下面的例子。

    var s = "hello ECMAScript5.1 and ECMAScript2015";
    console.log(s.split(" "));                      //["hello", "ECMAScript5.1", "and",
      "ECMAScript2015"]


    s = "是諸法空相不生不滅不垢不凈不增不減";
    console.log(s.split("不"));                    //["是諸法空相", "生", "滅",
                                                  //"垢", "凈", "增", "減"]


    s = "hello張三豐hello老子hello王陽明";
    console.log(s.split("hello"));                //["", "張三豐", "老子", "王陽明"]


    console.log("www.excelib.com".split("."));   //["www", "excelib", "com"]
    console.log("excelib".split(""));           //["e", "x", "c", "e", "l", "i", "b"]
    console.log("excelib".split("", 5));       //["e", "x", "c", "e", "l"]

從這個例子可以看出,split的分隔符不僅可以是英文字符,還可以是字符串甚至漢字。另外,如果字符串起始位置就是分隔符,那么分隔后數組的第一個元素會是空字符串。

? toLowerCase:這個方法的作用是將字符串轉換為小寫形式,例如下面的例子。

    console.log("Hello Mick".toLowerCase());        //hello mick

? toLocaleLowerCase:這個方法的作用是使用本地語言將字符串轉換為小寫。有些地區有自己的大小寫字符對應規則,在那種環境下就會用到此方法。一般情況下它與toLowerCase的作用一樣。

? toUpperCase:這個方法的作用是將字符串轉換為大寫形式,例如下面的例子。

    console.log("www.excelib.com".toUpperCase());    //WWW.EXCELIB.COM

? toLocaleUpperCase:一般情況下這個方法與toUpperCase相同,只有在具有自己的大小寫字符對應規則的地區才會被用到。

? trim:這個方法的作用是去掉字符串中頭部和尾部的空格,例如下面的例子。

    console.log(" hello張三豐 ".trim());              //"hello張三豐"

注意,trim方法只能去掉頭部和尾部的空格,而不能去掉字符串中間的空格,如果想去掉字符串中所有的空格,則可以使用replace和正則表達式來操作,例如下面的例子。

    console.log(" h e     l l o   ".replace(/\s+/g, ""));  //hello

3. String創建的對象實例的屬性

String創建的實例對象一共有兩個屬性,一個是length屬性,它代表字符串的長度;另外一個屬性類似于數組,屬性名為0到length-1,屬性值為序號所對應的字符,例如下面的例子。

    var s = "www.excelib.com";
    console.log(s.length);           //15
    console.log(s[7]);               //e

使用第二個屬性我們就可以把字符串當作字符數組來使用了。

6.3.2 Number對象

Number對象是function類型的對象,對應的是數字類型,可用來創建數字類型的object對象,例如,new Number (123)就可以創建一個值為123的數字實例對象。最重要的依然是它所對應的三種屬性。

1. Number自身的屬性

Number共有6個屬性,如下所示。

? prototype:這個屬性我們就不再解釋了。

? MAX_VALUE:用來表示最大的數,其值約為1.7976931348623157×10308

? MIN_VALUE:用來表示最小的數,其值約為5×10-324

? NaN:Not a Number的縮寫,表示不是數字。

? NEGATIVE_INFINITY:表示負無窮大,一般使用-Infinity來表示。

? POSITIVE_INFINITY:表示正無窮大,一般使用Infinity來表示。

下面來看個例子。

    console.log(Number("abc"));              //NaN
    console.log(Number.MAX_VALUE);           //1.7976931348623157e+308
    console.log(Number.MIN_VALUE);           //5e-324
    console.log(Number.MAX_VALUE*2);        //Infinity
    console.log(-Number.MAX_VALUE*2);       //-Infinity
    console.log(1/0);                       //Infinity

從這個例子可以看出,將字符串“abc”轉換為數字就會產生NaN,最大數乘以2就會產生正無窮大,負最大數乘以2就會出現負無窮大,0做分母也會產生無窮大。

2. Number.prototype的屬性

Number的prototype一共有7個屬性:constructor、toString、toLocaleString、valueOf、toFixed、toExponential和toPrecision,分別介紹如下。

? constructor:這個屬性默認指向Number對象本身。

? toString:Number的prototype重寫了toString方法,重寫后的toString方法會返回數字的字符串形式,還可以指定要轉換為數字的基數,即指定幾進制,默認為十進制。下面來看個例子。

    var n = 11;
    console.log(n.toString());               //11
    console.log(n.toString(2));              //1011
    console.log( (255).toString(16));       //ff
    console.log( (0xff).toString());        //255
    console.log( (5).toString(2));         //101

? toLocaleString:這個方法會按照數字的本地表示法來輸出,例如下面的例子。

    var n = 2739297;
    console.log(n.toLocaleString());                          //2,739,297
    console.log(n.toLocaleString("zh-Hans-CN-u-nu-hanidec")); //二,七三九,二九七

ES5.1標準中的toLocaleString方法并沒有參數,但在第6版(ES2015)中規定可以使用參數指定區域,并且現在大部分主流瀏覽器也都支持。

? valueOf:返回數字直接量。下面來看個例子。

    var n = new Number(34290);
    console.log(typeof n);                   //object
    console.log(typeof n.valueOf());        //number

因為Number創建的實例對象有自動解包的功能,所以這個方法很少使用。

? toFixed:這個方法用來指定數字的精度,即保留幾位小數。它的參數為要保留小數的位數,如果不指定則按0處理,即沒有小數,并且它會按需要自動進行四舍五入。下面來看個例子。

    console.log(837.346.toFixed(2));        //837.35
    console.log(837.346.toFixed());         //837
    console.log(837.346.toFixed(5));        //837.34600
    console.log(-837.346.toFixed(2));       //-837.35
    console.log( (3.17e7).toFixed(2));      //31700000.00

? toExponential:此方法的作用是將數字轉換為科學計數法來表示,有一個可選參數,表示保留小數的位數,如果省略參數,則將輸出盡可能多的數字,下面來看個例子。

    console.log(24803.5.toExponential());           //2.48035e+4
    console.log(24803.5.toExponential(2));          //2.48e+4
    console.log(24803.5.toExponential(1));          //2.5e+4

? toPrecision:這個方法用于將數字格式化為指定位數(包括整數和小數)。如果指定的位數小于數字的整數部分,那么將使用科學計數法來表示。下面來看個例子。

    console.log(49320.34702.toPrecision(7));        //49320.35
    console.log(49320.34702.toPrecision(9));        //49320.3470
    console.log(49320.34702.toPrecision(3));        //4.93e+4

3. Number創建的實例對象的屬性

Number創建的實例對象沒有自己的命名屬性。

6.3.3 Boolean對象

Boolean對象是function類型的對象,對應的是布爾類型,可用來創建布爾類型的object實例對象。例如,new Boolean (true)就可以創建一個值為true的布爾類型實例對象。Boolean對象非常簡單。

1. Boolean自身的屬性

Boolean作為對象時自身只有一個prototype屬性。prototype我們已經非常熟悉了,這里就不再重述了。

2. Boolean.prototype的屬性

Boolean的prototype一共有三個屬性:constructor、toString和valueOf。constructor指向Boolean本身,toString和valueOf都返回實例對象的值,但它們的類型不一樣,toString返回string類型,而valueOf返回boolean類型。下面來看個例子。

    var b = new Boolean(true);
    console.log(b.toString());               //true
    console.log(b.valueOf());                //true
    console.log(typeof b.toString());       //string
    console.log(typeof b.valueOf());        //boolean
    console.log(typeof b);                 //object

3. Boolean創建的對象實例的屬性

Boolean創建的對象實例自身不包含命名屬性。

多知道點

如何在瀏覽器中查看對象的屬性

本節介紹的包裝對象中的屬性主要是標準中規定的屬性,但不同的瀏覽器除了實現標準中的屬性外,還可能會添加自己特有的屬性,我們可以使用Object的getOwnPropertyNames方法來獲取當前瀏覽器中對象自身的所有屬性。對于function類型的對象,我們需要獲取三種類型的屬性:function自身的屬性、function.prototype包含的屬性以及使用function創建的實例對象自身所包含的屬性。這三種屬性都可以通過Object的getOwnPropertyNames方法來獲取。例如,可以通過下面的代碼來獲取String對象的三種類型的屬性。

    console.log(Object.getOwnPropertyNames(String));
    //獲取String對象自身的屬性
    console.log(Object.getOwnPropertyNames(String.prototype));
    //獲取String的prototype的屬性
    console.log(Object.getOwnPropertyNames(new String()));
    //獲取String創建的對象實例的屬性

通過上述方法可以獲取當前瀏覽器中某個具體function對象的相關屬性。對于所有function類型的對象都可以使用這個方法,包括Object對象和瀏覽器中的Window對象。注意Window對象不可以用來創建新的實例對象。

主站蜘蛛池模板: 惠水县| 永平县| 红桥区| 泾阳县| 河西区| 简阳市| 上栗县| 普格县| 巴楚县| 海阳市| 龙里县| 房产| 闽清县| 开阳县| 抚州市| 中牟县| 柳江县| 长岭县| 乌鲁木齐县| 平阳县| 洮南市| 锡林郭勒盟| 论坛| 乌鲁木齐县| 中江县| 绥化市| 兴海县| 伊吾县| 安义县| 锦州市| 富平县| 连云港市| 枣庄市| 澄城县| 静海县| 进贤县| 阳春市| 乐亭县| 商丘市| 平利县| 页游|