標籤:
大多數方法的第一個參數接收一個函數,並且對數組的每個元素調用一次該函數。如果是稀疏數組,對不存在的元素不調用傳遞的函數。在大多數情況下,調用提供的函數使用三個參數:數組元素,元素的索引,數組本身,通常情況只提供第一個參數,忽略後兩個參數。
第二個參數是可選的,如果有第二個參數,則調用的函數被看做是第二個參數的方法,即在調用函數內使用this代表的是第二個參數。
數組方法是不會修改它們調用的原數組。當然,傳遞給這些方法的函數可以修改這些數組。
forEach():
方法從頭至尾遍曆數組,為每個元素調用指定的函數。
注意:無法在所有元素都傳遞給調用的函數之前終止遍曆(就是不能break or return)。
map():
數組的每一個元素傳遞給指定的函數,並返回一個數組,它包含該函數的傳回值。
filter():
方法返回的數組元素是調用的數組的一個子集。傳遞函數是用來邏輯判定的即該函數返回true或false。filter會跳過稀疏數組中缺少的元素,它的返回數組總是稠密的,即壓縮稀疏數組的空缺:
var dense = sparse.filter(function(){return false});
壓縮空缺並刪除undefined和null元素,可以這樣使用filter():
a = a.filter(function(x){ return x!=undefined && x!=null});
every()和some():
是數組的邏輯判定:它們對數組元素應用指定的函數判定,返回true或false
every()方法就像數學中的“針對所有”:若且唯若對數組中的所有元素調用判定函數都返回true。
some()方法就像數學中的“存在”量詞,當數組中至少有一個元素調用判定函數返回true。則判定函數返回true。並且僅當數值中的所有元素都返回false,它才返回false。
reduce()和reduceRight():
使用指定的函數將數組元素進行組合,產生單個值。這在函數式編程中是常見的操作,也可以稱為“注入”和“摺疊”如下:
var a = [1,2,3,4,5];var sum = a.reduce(function(x,y){return x+y},0); //數組求和var product = a.reduce(function(x,y){return x*y},1); //數組求積var max = a.reduce(function(x,y){return x>y?x:y;}); //求最大值
reduce()需要兩個參數。第一個是執行簡化操作的函數。化簡函數的任務就是用某種方法把兩個值組合或化簡為一個值,並返回化簡後的值。第二個選擇性參數是一個傳遞給函數的初始值。簡化操作函數,與上面提到的forEach和map使用的函數不同,比較熟悉的“數組元素”,“元素的索引”,“數組本身”將作為第2~4個參數傳遞給函數。第一個參數是到目前為止的化簡操作累積的結果。第一次調用函數時,第一個參數是一個初始值即傳遞給reduce()的第二個參數。如上面描述,求max時沒有使用第二個參數(即沒有指定初始值)。當不指定初始值調用reduce()時,它將使用數組的第一個元素作為初始值。這意味著第一次調用簡化函數就使用了第一個和第二個數組元素作為其第一個參數和第二個參數。
如果不帶初始值參數調用reduce()將導致類型錯誤異常;
如果調用時只有一個值,數組只有一個元素並且沒有指定初始值,或有一個空數組並指定一個初始值。reduce()只是簡單地返回那個值而不會調用簡化函數。
值得注意的是:every()和some()方法是一種類型的數組化簡操作。但是不同的是,它們會儘早終止遍曆而不總是訪問每一個數組元素。
注意:數學計算不是reduce()和reduceRight()的唯一意圖。參考前面提到的屬性枚舉時看到的一個例子
/*返回一個新對象,這個對象同時擁有o的屬性和p的屬性,如果o和p中有重名屬性,使用p中的屬性*/
function union(o,p){ return extend(extend({},o),p);} function extend(o,p){ for(prop in p){ o[prop] = p[prop];}return o;}var objects = [{x:1},{y:2},{z:3}];var mered = objects.reduce(union); //=>{x:1,y:2,z:3}
reduceRight工作原理與 reduce()一樣,不同的是它按照數組索引從高到低處理數組
ECMAScript5提供了9個新數組方法:遍曆、映射、過濾、檢測、簡化、和搜尋數組