天天看點

JavaScript之Array對象

    一、概述

         array是javascript的内置對象,同時也是一個構造函數,可以用它生成新的數組。

        作為構造函數時,array可以接收參數,但是不同的參數,會是array産生不同的行為。

    1、無參數時,傳回一個空數組。

    2、單個參數時,如果該參數時正整數,則這個正整數表示新數組的長度;如果該參數是非正整數(比如,字元串,布爾,對象等),則該值是新數組的成員。

    3、多個參數時,這些參數都是新數組的成員。

    可以看到array的構造函數行為很不一緻,是以,不建議使用它生成新的數組,直接使用數組的字面量是更好地方法。

    二、array對象的靜态方法

        2.1、isarray方法

            array.isarray()方法用來判斷一個值是否是數組。他可以彌補typeof運算符的不足。

    上面代碼表示,typeof運算符隻能顯示數組的類型是object,而array.isarray方法可以對數組傳回true。

    三、array對象執行個體的方法

        以下這些array對象執行個體的方法,都是數組執行個體才能使用,如果不想出建立執行個體,隻是想單純的調用這些方法,可以寫成 [].method.call(調用對象,參數) 的形式,或者array.prototype.method.call(調用對象,參數) 的形式。

    3.1、valueof方法,tostring方法

        valueof方法,傳回數組本身。

    tostring 方法傳回數組的字元串形式。

    3.2、 push方法   pop方法

        push方法用于在數組的末端添加一個或者多個元素,并傳回添加後數組的長度。

        如果需要合并兩個數組,可以這樣寫。

    上面兩種寫法等于  a1.push(4,5,6);

    pop方法用于删除數組的最後一個元素,并傳回該元素。

    對于空數組使用pop方法,不會報錯,而是會傳回undefined

    3.3、join方法   concat方法

        join方法以參數作為分隔符,将所有的數組成員組成一個字元串傳回。如果不提供參數,預設使用逗号作為分隔符。

    通過函數的call方法,join方法(array.prototype.join)也可以用于字元串。

    concat方法将新數組的成員,添加到原數組的尾部,然後傳回一個新數組,常用于連結多個數組。

    上面代碼表明,concat方法的參數可以是一個或者多個數組,以及原始類型的值。

如果不提供參數,concat方法傳回目前數組的一個淺拷貝。所謂“淺拷貝”,指的是如果數組成員包括複合類型的值(比如對象),則新數組拷貝的是該值的引用。

    上面代碼中,原數組包含一個對象,concat方法生成的新數組包含這個對象的引用。是以,改變原對象以後,新數組跟着改變。事實上,隻要原數組的成員中包含對象,concat方法不管有沒有參數,總是傳回該對象的引用。

    concat方法也可以用于将對象合并為數組,但是必須借助call方法。

    3.4、shift方法  unshift方法

    shift方法用于删除數組的第一個元素,并傳回該元素。

    shift方法可以周遊并清空一個數組。

    unshift方法用于在數組的第一個位置添加元素,并傳回添加新元素後的數組長度。

    3.5、reverse方法

    reverse方法用于颠倒數組中元素的順序,使用這個方法以後,傳回改變後的原數組。

    3.6、slice方法

    slice方法傳回指定位置的數組成員組成的新數組,原數組不變。它的第一個參數為起始位置(從0開始),第二個參數為終止位置(但該位置的元素本身不包括在内)。如果省略第二個參數,則一直傳回到原數組的最後一個成員。

    上面代碼表示,如果slice方法的參數是負數,則從尾部開始選擇的成員個數;如果參數值大于數組成員的個數,或者第二個參數小于第一個參數,則傳回空數組。

    slice方法的一個重要應用,是将類似數組的對象轉為真正的數組。

    上面代碼的參數都不是數組,但是通過call方法,在它們上面調用slice方法,就可以把它們轉為真正的數組。

    3.7、splice方法

    splice方法用于删除元素,并可以在被删除的位置添加入新的數組元素。它的傳回值是被删除的元素。需要特别注意的是,該方法會改變原數組。

    splice的第一個參數是删除的起始位置,第二個參數是被删除的元素個數。如果後面還有更多的參數,則表示這些就是要被插入數組的新元素。

    上面代碼從原數組位置4開始,删除了兩個數組成員。

    上面代碼除了删除成員,還插入了兩個新成員。

    如果隻是單純地插入元素,splice方法的第二個參數可以設為0。

    如果隻提供第一個參數,則實際上等同于将原數組在指定位置拆分成兩個數組。

    3.8、sort方法

    sort方法對數組元素進行排序,預設是按照字典順序排序。排序後,原數組将被改變。

    sort方法可以接受一個參數,表示按照自定義方法進行排序。該參數是一個函數,本身又接受兩個參數,表示進行比較的兩個元素。如果傳回值大于0,表示第一個元素排在第二個元素後面;其他情況下,都是第一個元素排在第二個元素前面。

    四、ecma script5新加入的的數組方法

        ecmascript 5新增了9個數組執行個體的方法,分别是map,foreach, filter,every,some,reduce,reduceright,indexof和lastindexof。其中前7個與函數式(functional)操作有關。

    這些方法也可以在數組上使用,也可以在字元串和類似數組的對象上使用,這是它們不同于傳統數組方法的一個地方。

    在用法上,這些方法的參數是一個函數,這個作為參數的函數本身又接受三個參數;數組的目前元素elem、該元素的位置index和整個數組arr(詳見下面的執行個體),另外,上下文對象(context)可以作為第二個參數,傳入foreach(),every(),some(),filter(),map()方法,用來綁定函數運作時的上下文。

    注意:ie8以下版本的浏覽器不支援這些方法。

    4.1、map方法、foreach方法

    map方法對所有元依次調用一個函數,根據函數結果傳回一個新數組。

    通過函數的call方法,map方法可以用于字元串。

    foreach方法對所有元素依次執行一個函數,它與map的差別在于不傳回新數組,而是對原數組的成員執行某種操作,甚至可能改變原數組的值。

    從上面代碼可以看到,map和foreach的參數格式是一樣的,都是一個函數。該函數接受三個參數,分别是目前元素、目前元素的位置(從0開始)、整個數組。

    這兩個方法都可以接受第二個參數,用來綁定函數中的this關鍵字。

    上面的兩行代碼是等價的。下面是一個執行個體;

    上面代碼表示,如果提供一個數組作為第二個參數,則函數内部的this關鍵字就指向這個數組。

    4.2、filter方法

        filter方法依次對所有數組成員調用一個測試函數,傳回結果為true的成員組成一個新數組傳回。

    上面代碼将大于3的原數組成員,作為一個新數組傳回。類似于一個篩選器。

    filter方法的參數必須是一個傳回布爾值的函數。該函數的第一個參數是目前數組成員的值,這是必需的,後兩個參數是可選的,分别是目前數組成員的位置和整個數組。

    4.3、some方法  every方法

    這兩個方法類似“斷言”(assert),用來判斷數組成員是否符合某種條件。

    some方法對所有元素調用一個測試函數,隻要有一個元素通過該測試,就傳回true,否則傳回false。

    上面代碼表示,如果存在大于等于3的數組成員,就傳回true。

    every方法對所有元素調用一個測試函數,隻有所有元素通過該測試,才傳回true,否則傳回false。

    上面代碼表示,隻有所有數組成員大于等于3,才傳回true。

    從上面的代碼可以看到,some和every的使用方法與map和foreach是一緻的,參數完全一模一樣。也就是說,它們也可以使用第二個參數,用來綁定函數中的this關鍵字。

    4.4、reduce方法、reduceright方法

        這兩個方法的作用,是依次處理數組中的每一個元素,最終累計為一個值。這兩個方法的差異在于,reduce對數組元素的處理順序是從左到右(從第一個成員到最後一個成員),reduceright則是從右到左(從最後一個成員到第一個成員),其它的地方也一樣。

    reduce方法的第一個參數是一個處理函數。該函數接受四個參數,分别是:

    1、用來累計的變量(即目前狀态),預設值為0.

    2、數組的目前元素

    3、目前元素在數組中的序号(從0開始)

    4、原數組

    這四個參數之中,隻有前兩個是必須的,後兩個則是可選的。

    上面代碼的參數sum表示累計變量,預設為0,elem則是數組的目前元素。reduce方法依次将每個數組元素加入sum,最終傳回它們的總和15。

    利用reduce方法,可以寫一個數組求和的sum方法。

    如果要對累計變量指定初值,可以把它放在reduce方法的第二個參數。

    上面代碼指定參數x的初值為10,是以數組元素從10開始累加,最終結果為25。

    4.5、indexof 和 lastindexof方法

        ecmascript 5新增的9個方法之中,有2個與函數式程式設計無關,分别是indexof和lastindexof。

indexof方法傳回給定元素在數組中第一次出現的位置,如果沒有出現則傳回-1。  

    indexof方法還可以接受第二個參數,表示搜尋的開始位置。

    上面代碼從位置1開始搜尋字元a,結果為-1,表示沒有搜尋到。

    lastindexof方法傳回給定元素在數組中最後一次出現的位置,如果沒有出現則傳回-1。

上面是因為沒有找到,是以反悔了 -1。

    注意,如果數組中包含nan,這兩個方法不适用。

 這是因為這兩個方法内部,使用嚴格相等運算符(===)進行比較,而nan是唯一一個不等于自身的值。

繼續閱讀