1. 程式人生 > 其它 >《JavaScript高階程式設計》學習筆記(4)——引用型別

《JavaScript高階程式設計》學習筆記(4)——引用型別

  歡迎關注本人的微信公眾號“前端小填填”,專注前端技術的基礎和專案開發的學習。

  本節內容對應《JavaScript高階程式設計》的第五章內容。

  在ECMAScript中,引用型別是一種資料結構,用於將資料和功能組織在一起,通常也被稱為類,有時候也被成為物件定義,因為他們描述的是一類物件所具有的屬性和方法。物件是某個特定引用型別的例項,新物件是使用new操作符後跟一個建構函式來建立的, var person = new Object() ; 建立了一個object物件。建構函式本身就是一個函式,只不過該函式是出於建立新物件的目的而定義的。

  ECMAScript提供了很多原生引用型別,以便開發人員用以實現常見愛你的計算任務。

1、Object型別:Object型別是ECMAScript中使用最多的一個型別。

  •  建立Object例項的方式有兩種。
    • 第一種是使用new操作符後跟Object建構函式,如下所示:
    • 另一種方式是使用物件字面量表示法。物件字面量是物件定義的一種簡寫形式,目的在於簡化建立包含大量屬性的物件的過程。注意:在通過這種方法建立物件時,實際上並不會呼叫object的建構函式
    var person = {
        name:”Nicholas”,
        age:29  //最後一個屬性不加逗號
    };
var person = new Object();
person.name = “Nicholas”;
person.age = 29;
  • Object物件訪問屬性的方法也有兩種:
    • 第一種是用點表示法, ,很常用的一種方法。一般除非必須使用變數來訪問屬性,否則建議使用點表示法。
    • 另一種是是使用方括號表示法來訪問物件的屬性, ,該方法的主要優點是可以通過變數來訪問屬性,eg:var propName = "name" ; alert(person[propName]) ;

    person["name"]

person.name

2、Array型別:除了Object之外,Array型別恐怕是ECMAScript中最常用的型別了。而且,ECMAScript中的陣列與其他多數語言中的陣列有著很大的區別。與其他語言不同的是,ECMAScript陣列的每一項可以儲存任何型別的資料

。也就是說,可以用陣列的第一個位置來儲存字串,用第二個位置來儲存數值,用第三個位置來儲存物件,依次類推。而且,ECMAScript陣列的大小是可以動態調整的,即可以隨著資料的新增自動增長以容納新增資料。

  • 建立陣列的基本方式有兩種:
    • 第一種是使用Array建構函式
    • 陣列字面量表示法建立。與Object一樣,使用陣列字面量表示法也不會呼叫Array建構函式
    //建立一個空陣列
    var names = [];
    //建立一個包含三個字串的陣列
    var colors = [“red”,”blue”,”green”];
//直接建立物件
var colors = new Array() ;
//建立指定陣列大小的陣列物件
var nums = new Array(20) ;
//預先知道要儲存的資料項
var anims = new Array("tiger","cat","dog") ;
  • 陣列的length屬性不是隻讀的,通過設定這個屬性,可以從陣列的末尾移除項或向陣列中新增新項。
var colors = ["red","blue","green"];   
colors.length = 2;  
alert(colors[2]); //undefined  
  • 所有物件都具有toLocalString()toString()valueOf()方法。其中,呼叫陣列的toString()方法會返回由陣列中每個值的字串形式拼接而成的一個以逗號分隔的字串;而呼叫valueOf()返回的還是陣列;toLocalString()方法是呼叫陣列中的每一項的toLocalString()方法後拼接成字串返回。如果陣列中的某一項的值是null或者undefined,那麼該值在這些方法中返回的結果中以空字串表示
  • ECMAScript中陣列可以表現得像(先進後出,插入和刪除都發生在棧頂元素)一樣,ECMAScript為陣列專門提供了push()和pop()方法,以便實現類似棧的行為。其中push()方法可以接收任意數量的引數,把它們逐個新增到陣列末尾,並返回修改後陣列的長度。而pop()方法則從陣列末尾移除最後一項,減少陣列的length值,然後返回移除的項。結合push()和pop()方法,可以像使用棧一樣使用陣列。
  • ECMAScript中陣列可以表現得像佇列(先進先出,插入發生在隊尾,刪除發生在隊頭)一樣,ECMAScript為陣列專門提供了push()和shift()方法,以便實現類似佇列的行為。push()方法和棧中的push()一樣的用法,shift()方法是移除陣列中的第一個項並返回該項,同時將陣列的長度減1。結合push()和shift()方法,可以像使用佇列一樣使用陣列。
  • 重排序方法:reverse()和sort()方法。reverse()方法會反轉陣列。sort()方法預設情況下按升序排列——即最小的值位於最前面,最大的值排在最後面。為了實現排序,sort()方法會呼叫每個陣列項的toString()轉型方法,然後比較得到的字串,以確定如何排序。即使陣列中的每一項都是數值,sort()方法比較的也是字串sort()方法可以接收一個比較函式作為引數,以便指定哪個值位於哪個值的前面。比較函式接收兩個引數,如果第一個引數應該位於第二個引數之前則返回一個負數,如果兩個引數相等則返回0,如果第一個引數應該位於第二個之後則返回一個正數。
function compare(value1 , value2){  
    if(value1 < value2){  
        return -1;  
    }else if(value1 > value2){  
        return 1;  
    }else{  
        return 0;  
    }  
}  
var numbers = [0,1,5,10,15];  
var characters = ["A" , "a" , "e" , "b"];  
characters.sort(compare);  
numbers.sort(compare);  
alert(numbers);//0,1,5,10,15  
alert(characters);//A,a,b,e 
  • 操作方法:concat()方法(返回的是一個包含兩個陣列所有元素的新陣列,不會改變原來陣列的值)、slice()方法(擷取陣列部分元素,只有一個引數時,擷取從該引數指定下標的位置到陣列末尾的所有元素作為新陣列返回,有兩個引數(負數表示倒數)時,擷取前閉後開的所有元素組成的新陣列返回)、splice()方法(很強大的功能):
    • splice()的主要用途是向陣列的中部插入項,但使用這種方法的方式有如下3種。 刪除:可以刪除任意數量的項,只需指定兩個引數:要刪除的第一項的位置和要刪除的項數。例如:splice(0,2)會刪除陣列中的前量項。 插入:可以向指定位置插入任意數量的項,只需提供3個引數:起始位置、0(要刪除的項數)和要插入的項。如果插入多個項,可以再傳入第四、第五,以至任意多個項。例如:splice(2,0,”red” , “green”),會從當前陣列的位置2開始插入字串”red”和”green”。 替換:可以項指定位置插入任意數量的項,同時刪除任意數量的項,只需指定3個引數:其實位置、要刪除的項數和要插入的任意數量的項。插入的項數不必與刪除的項數相等。例如,splice(2,1,”red”,”green”)會刪除當前陣列位置2的項,然後再從位置2開始插入字串”red”和”green”。 splice()方法始終會返回一個數組,該陣列中包含從原始陣列中刪除的項(如果沒有刪除任何項,則返回一個空陣列)。
var numbers = [0,1,2,3];  
var removed = numbers.splice(0,1);//刪除第一項  
alert(numbers);//1,2,3  
alert(removed);//0  
removed = numbers.splice(1,0,8,9);  
alert(removed);//返回的是一個空陣列  
removed = numbers.splice(1,1,5,6);  
alert(removed);//8  
  • 位置方法:indexOf()lastIndexOf()。這兩個函式都接收兩個引數:要查詢的項和(可選的)表示查詢起點位置的索引。其中,indexOf()方法從陣列的開頭(位置0)開始向後查詢,lastIndexOf()方法則從陣列的末尾開始向前查詢。這兩個方法都返回要查詢的項在陣列中的位置,或者在沒找到的情況下返回-1。在比較第一個引數與陣列中的每一項時,會使用全等操作符;也就是說,要求查詢的項必須嚴格相等
  • 迭代方法:ECMAScript為陣列定義了5個迭代方法。每個方法都接收兩個引數:要在每一項上執行的函式和(可選的)執行該函式的作用域物件——影響this的值。傳入這些方法中的函式會接收三個引數:陣列項的值、該項在陣列中的位置和陣列物件本身。根據使用的方法不同,這個函式執行後的返回值可能會也可能不會影響訪問的返回值。以下是這5個迭代方法的作用,這些方法都不會修改陣列中的包含的值
    • every():對陣列中的每一項執行給定函式,如果該函式對每一項都返回true,則返回true
    • filter():對陣列中的每一項執行給定函式,返回該函式會返回true的項組成的陣列
    • forEach():對陣列中的每一項執行給定函式,這個方法沒有返回值
    • map():對陣列中的每一項執行給定函式,返回每次函式呼叫的結果組成的陣列
    • some():對陣列中的每一項執行給定函式,如果該函式對任一項返回true,則返回true
var numbers = [0,1,2,3];  
var everyResult = numbers.every(function(item , index , array){  
    return (item > 2);  
});  
alert(everyResult);//false  
var someResult = numbers.some(function(item , index , array){  
    return (item > 2);  
});  
alert(someResult);//true 
  • 縮小方法:reduce()和reduceRight()方法。這兩個方法都會迭代陣列的所有項,然後構建一個最終返回的值。其中,reduce()方法從陣列的第一項開始,逐個遍歷到最後。而reduceRight()則從陣列的最後一項開始,向前遍歷到第一項。這兩個方法都接收兩個引數:一個在每一項上呼叫的函式和(可選的)作為縮小基礎的初始值。傳給reduce()和reduceRight()的函式接收4個引數:前一個值、當前值、項的索引和陣列物件。這個函式返回的任何值都會作為第一個引數自動傳給下一項。第一次迭代發生在陣列的第二項上,因此第一個引數是陣列的第一項,第二個引數就是陣列的第二項。均不改變原陣列的值。
var nums = [1,2,3,4,5,6];  
var sum = nums.reduce(function(prev, cur , index , array){  
    return prev + cur;  
});  
alert(sum);//21 
alert(nums);//1,2,3,4,5,6

3、Date型別:ECMAScript中的Date型別是在早期Java中的java.util.Date類基礎上構建的。為此,Date型別使用自UTC(CoordinatedUniversal Time,國際協調時間)1970年1月1日午夜(零時)開始經過的毫秒數來儲存日期。在使用這種資料儲存格式的條件下,Date型別儲存的日期能夠精確到1970年1月1日之前或之後的285616年。

  • 要建立一個日期物件,使用new操作符和Date建構函式即可,  返回當前日期和時間。如果想根據特定的日期和時間建立日期物件,必須傳入表示該日期的毫秒數(即從1970年1月1日午夜起至該日期經過的毫秒數)。為了簡化這一計算過程,ECMAScript提供了兩個方法:Date.parse()Date.UTC()。 其中Date.parse()方法接收一個表示日期的字串引數,然後嘗試根據這個字串返回相應日期的毫秒數。Date.UTC()方法同樣也返回表示日期的毫秒數,但它與Date.parse()在構建時使用不同的資訊。Date.UTC()的引數分別是年份、基於0的月份(一月是0,二月是1,以此類推)、月中的哪一天(1到31)、小時數(0到23)、分鐘、秒以及毫秒數。在這些引數中,只有前兩個引數(年和月)是必需的。如果沒有提供月中的天數,則假設天數為1;如果省略其他引數,則統統假設為0。
//GMT 時間2000年1月1日午夜零時
var y2k = new Date(Date.UTC(2000 , 0));

//GMT時間2005年5月5日下午5:55:55
var allFives = new Date(Date.UTC(2005 , 4 ,5 , 17 , 55 , 55));
  • ECMAScript5添加了Date.now()方法,返回表示呼叫這個方法時的日期和時間的毫秒數。這個方法簡化了使用Date物件分析程式碼的工作。
//取得開始時間
var start = Date.now();

//執行某些操作

……

//取得停止時間
var stop = Date.now();

var result = stop – start;
  • 與其他引用型別一樣,Date型別也重寫了toLocalString()、toString()和valueOf()方法;但這些方法返回的值與其他型別中的方法不同。
    • toLocalString()方法會按照與瀏覽器設定的地區相適應的格式返回日期和時間。這大致意味著時間格式中會包含AM或PM,但不會包含時區資訊(當然,具體的格式會因瀏覽器而異)。
    • toString()方法則通常返回帶有時區資訊的日期和時間,其中時間一般以軍用時間(即小時的範圍是0到23)表示。
    • valueOf()方法則根本不返回字串,而是返回日期的毫秒錶示。因此,可以方便使用比較操作符來比較日期值。
  • 日期的格式化方法有多種,與toLocaleSTring()和toString()方法一樣,這些字串格式方法的輸出也是因瀏覽器而異的,因此沒有哪一個方法能夠用來在使用者頁面中顯示一致的日期資訊。
    • toDateString():以特定於實現的格式顯示星期幾、月、日和年;
    • toTimeString():以特定於實現的格式顯示時、分、秒和時區;
    • toLocaleDateString():以特定於地區的格式顯示星期幾、月、日和年;
    • toLocaleTimeString():以特定於實現的格式顯示時、分、秒;
    • toUTCString():以特定於實現的格式完整的UTC日期。
  • 日期/時間元件方法
    • 直接取得和設定日期值的方法 方法 說明 getTime() 返回表示日期的毫秒數;與valueOf()方法返回的值相同 setTime(毫秒) 以毫秒數設定日期,會改變整個日期 getFullYear() 取得4位數的年份(如2016而非僅16) getUTCFullYear() 返回UTC日期的4位數年份 setFullYear(年) 設定日期的年份。傳入的年份值必須是4位數字 setUTCFullYear(年) 設定UTC日期的年份。傳入的年份值必須是4位數字 getMonth() 返回日期中的月份,其中0表示一月,11表示十二月 getUTCMonth() 返回UTC日期中的月份,其中0表示一月,11表示十二月 setMonth(月) 設定日期中的月份。傳入的月份值必須大於0,超過11則增加年份 setUTCMonth(月) 設定UTC日期中的月份。傳入的月份必須大於0,超過11則增加年份 getDate() 返回日期月份中的天數(1到31) getUTCDate() 返回UTC日期月份中的天數(1到31) setDate(日) 設定日期月份中的天數。如果傳入的值超過了該月中應有的天數,則增加月份 setUTCDate(日) 設定UTC日期月份中的天數。如果傳入的值超過了該月中應有的天數,則增加月份 getDay() 返回日期中星期的星期幾(其中0表示星期日,6表示星期六) getUTCDay() 返回UTC日期中星期的星期幾(其中0表示星期日,6表示星期六) getHours() 返回日期中的小時數(0到23) getUTCHours() 返回UTC日期中的小時數(0到23) setHours(時) 設定日期中的小時數,傳入的值超過了23則增加月份中的天數。傳入的值為負數,則實際值為前一天的24減引數的絕對值小時。 setUTCHours(時) 設定UTC日期中的小時數,傳入的值超過了23則增加月份中的天數。傳入的值為負數,則實際值為前一天的24減引數的絕對值小時。 getMinutes() 返回日期中的分鐘數(0到59)。 getUTCMinutes() 返回UTC日期中的分鐘數(0到59)。 setMibutes(分) 設定日期中的分鐘數,傳入的值超過59則增加小時數 setUTCMinutes(分) 設定UTC日期中的分鐘數,傳入的值超過59則增加小時數 getSeconds() 返回日期中的秒數(0到59) getUTCSeconds() 返回UTC日期中的秒數(0到59) setSeconds(秒) 設定日期中的秒數,傳入的值超過59則增加分鐘數 setUTCSeconds(秒) 設定UTC日期中的秒數,傳入的值超過59則增加分鐘數 getMilliseconds() 返回日期中的毫秒數 getUTCMilliseconds() 返回UTC日期中的毫秒數 setMilliseconds(毫秒) 設定日期中的毫秒數 setUTCMilliseconds(毫秒) 設定UTC日期中的毫秒數 getTimezoneOffset() 返回本地時間與UTC時間相差的分鐘數。

4、RegExp型別:ECMAScript通過RegExp型別來支援正則表示式。使用下面類似Perl的語法,就可以建立一個正則表示式。 var expression =/pattern/flags; 其中的模式(pattern)部分可以是任何簡單或複雜的正則表示式,可以包含字元類、限定符、分組、向前查詢以及反向引用。每個正則表示式都可以有一或多個標誌(flags),用以標明正則表示式的行為。正則表示式的匹配模式支援下列3個標誌:

  1. g:表示全域性(global)模式,即模式將被應用於所有字串,而非在發現第一個匹配項時立即停止;
  2. i:表示不區分大小寫模式(case-insensitive)模式,即在確定匹配時忽略模式與字串的大小寫;
  3. m:表示多行(multiline)模式,即在到達一行文字末尾時還會繼續查詢系一行中是否存在與模式匹配的項。
//匹配第一個“bat”或“cat”,不區分大小寫
var pattern2 = /[bc]at/i;
  • 與其他語言中的正則表示式類似,模式中使用的所有元字元都必須轉義。正則表示式中的元字元包括(  [  {    ^  $  |  ) ?  *  + .  ]  },這些元字元在正則表示式中都有一或多種特殊用途,因此想如果想要匹配字串中包含的這些字元就必須對它們進行轉義。
  • RegExp的每個例項都具有下列屬性,通過這些屬性可以取得有關模式的各種資訊。通過這些屬性可以獲知一個正則表示式的各方面資訊,但卻沒有多大用處,因為這些資訊全部包含在模式宣告中。
    • global:布林值,表示是否設定了g標誌。
    • ignoreCase:布林值,表示是否設定了i標誌。
    • lastIndex:整數,表示開始搜尋下一個匹配項的字元位置,從0算起。
    • multiline:布林值,表示是否設定了m標誌。
    • source:正則表示式的字串表示,按照字面量形式而非傳入建構函式中的字串模式返回。
  • RegExp物件的主要方法是exec(),該方法是專門為捕獲組而設計的。exec()接受一個引數,即要應用模式的字串然後返回包含第一個匹配項資訊的陣列;或者在沒有匹配項的情況下返回null。返回的陣列雖然是Array的例項,但包含兩個額外的屬性:index和Input。其中,index表示匹配項在字串中的位置,而input表示應用正則表示式的字串。在陣列中,第一項是與整個模式匹配的字串,其他項是與模式中捕獲組匹配的字串(如果模式中沒有捕獲組,則該陣列只包含一項)。對於exec()方法而言,即使在模式中設定了全域性標誌(g),它每次也只返回一個匹配項。在不設定全域性標誌的情況下,在同一個字串上多次呼叫exec()將始終返回第一個匹配項的資訊。而在設定全域性標誌的情況下,每次呼叫exec()則都會在字串中繼續查詢新匹配項。
  • 正則表示式的第二個方法是test(),它接收一個字串引數。在模式與該引數匹配的情況下返回true;否則,返回false。在只想知道目標字串與某個模式是否匹配,但不要知道其文字內容的情況下,使用這個方法非常方便。因此,test()方法經常被用在if語句中。
  • RegExp例項繼承的toLocaleString()toString()方法都會返回正則表示式的字面量,與建立正則表示式的方式無關。
  • 正則表示式的valueOf()方法返回正則表示式本身。
  • 正則表示式的各種侷限性的詳細內容參見http://blog.csdn.net/goskalrie/article/details/51517913

5、Function型別:在ECMAScript中函式實際上是物件。每個函式都是Function型別的例項,而且都與其他引用型別一樣具有屬性和方法。由於函式是物件,因此函式名實際上也是一個指向函式物件的指標,不會與某個函式繫結。函式通常是使用函式宣告語法定義的。函式是物件,函式名是指標

function sum(num1 , num2){
         returnnum1 + num2;
}

//這與下面使用函式表示式定義函式的方式幾乎相差無幾
var sum = function(num1 , num2){
         returnnum1 + num2;
}; //注意末尾有分號

alert(sum(10,15)) ; //25
var sum2 = sum ;
alert(sum2(10,15)) ; //25
sum = null ;
alert(sum2(10,15)) ; //25
  •  ECMAScript中沒有函式過載的概念,宣告多個同名的函式,即使傳入的引數的個數不一樣,該名字也只屬於最後一個被解析的函式
function sum(num1){
  return num1 + 10;
}

function sum(num1 , num2){
  return num1 + num2;
}

alert(sum(10)) ; //NaN
alert(sum(10,30)); //40
  • 解析器在向執行環境中載入資料時,會率先讀取函式宣告,並使其在執行任何程式碼之前可用(可以訪問);至於函式表示式,則必須等到解析器執行到它所在的程式碼行,才會真正被解釋執行。
alert(sum(10 , 20));//30
function sum(num1 , num2){
    return num1 + num2;
}

//alert(add(10 , 20)); //報錯,停止向下解析執行
var add = function(sum1 , sum2){
    return sum1 + sum2;
};
alert(sum(10 , 20)); //30
  • 因為ECMAScript中的函式名本身就是變數,所以函式也可以作為值來使用。也就是說,不僅可以像傳遞引數一樣把一個函式傳遞給另一個函式,而且可以將一個函式作為另一個函式的結果返回將函式作為返回值返回是一種極為有用的技術,例如在陣列排序時需要項sort()方法中傳入一個比較函式,如果想在傳入的函式中指定排序的方式,則可以如下進行操作:
function createComparisonFunction(propertyName){
    return function(object1,object2){
        var value1 = object1[propertyName] ;
        var value2 = object2[propertyName] ;  

        if(value1 < value2){
            return -1 ;
        }else if(value1 > value2){
            return 1 ;
        }else{
            return 0 ;
        } 
    }   
}

var data = [{name:"Zachary", age:"23"}, {name:"Nicholas", age:"26"}] ;
data.sort(createComparisonFunction("name")) ;
alert(data[0].name) ; //Nicholas
data.sort(createComparisonFunction("age")) ;
alert(data[0].name) ; //Zachary
  • 在函式內部,有兩個特殊的物件:argumentsthis。其中arguments是一個類陣列物件,包含著函式中的所有引數。雖然arguments的主要用途是儲存函式引數,但這個物件還有一個名叫callee的屬性,該屬性是一個指標,指向擁有這個arguments物件的函式,看下面的經典的階乘函式:  函式內部的另一個特殊物件是this,其行為與Java和C#中的this大致類似。換句話說,this引用的是函式執行的環境物件——或者也可以說是this值(當在網頁的全域性作用域中呼叫函式時this物件引用的就是winsow)。
function factorial(num){
    if(num <=1){
        return 1;
    }else{
        return num*factorial(num-1);
    }
}
alert(factorial(5)); //120

//利用arguments的callee的屬性
function factorial(num){
    if(num <=1){
        return 1;
    }else{
        return num*arguments.callee(num-1);
    }
}
alert(factorial(5));//120
  • ECMAScript 5 也規範化了另一個函式物件的屬性:caller。除了Opera的早期版本不支援,其他瀏覽器都支援這個ECMAScript3並沒有定義的屬性。這個屬性中儲存著呼叫當前函式的函式的引用,如果是在全域性作用域中呼叫當前函式,它的值為null
function outer(){
    inner();
}
function inner(){
    alert(inner.caller);
    //程式碼會導致警告框中顯示outer()函式的原始碼。
    //因為outer()呼叫了inner(),所以inner.caller就指向outer()。
}
    outer();
  • ECMAScript中的函式是物件,因此函式也有屬性和方法。每個函式都包含兩個屬性lengthprototype。其中length屬性表示函式希望接收的命名引數的個數。對於ECMAScript中的引用型別而言,proptotype是儲存它們所有例項方法的真正所在。換句話說,諸如toString()和valueOf()等方法實際上都儲存在prototype名下,只不過是通過各自物件的例項訪問罷了。在建立自定義引用型別即實現繼承時,prototype屬性的作用是極為重要的。在ECMAScript5中,prototype屬性是不可列舉的,因此使用for-in無法發現
  • 沒個函式都包含兩個非繼承而來的方法:apply()和call(),這兩個方法的用途都是在特定的作用域中呼叫函式,實際上等於設定函式體內this物件的值。首先,apply()方法接收兩個引數:一個是在其中執行函式的作用域,另一個是引數陣列。call()方法與apply()方法的作用相同,它們的區別僅在於接收引數的方式不同。對於call()方法而言,第一個引數是this值沒有變化,變化的是其餘引數都是直接傳遞給函式。換句話說,在使用call()方法時,傳遞給函式的引數必須逐個列舉出來。事實上,傳遞引數並非apply()和call()真正的用武之地;它們真正強大的地方是能夠擴充函式賴以執行的作用域。使用call()或apply()來擴充作用域的最大好處就是物件不需要與方法有任何耦合關係
  • ECMAScript5還定義了一個方法bind()。這個方法會建立一個函式的例項,其this值會被繫結到傳給bind()函式的值。
  • 每個函式繼承的toLocaleString()和toString()方法始終都返回函式的程式碼。返回程式碼的格式因瀏覽器而異。

 6、基本包裝型別:為了便於操作基本型別值,ECMAScript還提供了3個特殊的引用型別:BooleanNumberString。這些型別與其它引用型別相似,但同時也具有與各自的基本型別相應的特殊行為。實際上,每當讀取一個基本型別值的時候,後臺就會建立一個對應的基本包裝型別的物件,從而讓我們能夠呼叫一些方法來操作這些資料。對於每個不同的包裝型別都有很多對應的操作方法,我們可以通過一些API文件進行深入的學習和掌握。特別是Number和String型別的很多方法,我們會經常用到的。

7、單體內建型別:ECMA-262對內建物件的定義是“由ECMAScript實現提供的、不依賴於宿主環境的物件,這些物件在ECMAScript程式執行之前就已經存在了。”意思就是說,開發人員不必顯式地例項化內建物件,因為它們已經例項化了。前面已經介紹了大多數內建物件,如Object、Array和String。ECMA-262還定義了兩個單體內建物件GlobalMath

  • Global(全域性)物件可以說是ECMAScript中最特別的一個物件了,因為不管從什麼角度上看,這個物件都是不存在的。ECMAScript中的Global物件在某種意義上是作為一個終極的“兜底物件”來定義的。換句話說,不屬於任何其他物件的屬性和方法,最終都是它的屬性和方法。試試上,沒有全域性變數和全域性函式;所有在全域性作用域中定義的屬性和函式,都是Global物件的屬性。前面介紹過的那些函式,諸如isNaN()、isFinite()、parseInt()以及parseFloat(),實際上全都是Global物件的方法。除此之外,Global物件還包含其它一些方法。
  • ECMAScript還為儲存數學公式和資訊提供了一個公共位置,即Math物件。與JavaScript直接編寫的計算功能相比,Math物件提供的計算功能執行起來要快得多。Math物件中還提供了輔助完成這些計算的屬性和方法。