# Array 对象 ## æé 彿° `Array`æ¯ JavaScript çåç对象ï¼åæ¶ä¹æ¯ä¸ä¸ªæé 彿°ï¼å¯ä»¥ç¨å®çææ°çæ°ç»ã ```javascript var arr = new Array(2); arr.length // 2 arr // [ empty x 2 ] ``` ä¸é¢ä»£ç ä¸ï¼`Array()`æé 彿°çåæ°`2`ï¼è¡¨ç¤ºçæä¸ä¸ªä¸¤ä¸ªæåçæ°ç»ï¼æ¯ä¸ªä½ç½®é½æ¯ç©ºå¼ã å¦ææ²¡æä½¿ç¨`new`å ³é®åï¼è¿è¡ç»æä¹æ¯ä¸æ ·çã ```javascript var arr = Array(2); // çåäº var arr = new Array(2); ``` èèå°è¯ä¹æ§ï¼ä»¥åä¸å ¶ä»æé 彿°ç¨æ³ä¿æä¸è´ï¼å»ºè®®æ»æ¯å ä¸`new`ã `Array()`æé 彿°æä¸ä¸ªå¾å¤§ç缺é·ï¼ä¸åçåæ°ä¸ªæ°ä¼å¯¼è´ä¸ä¸è´çè¡ä¸ºã ```javascript // æ åæ°æ¶ï¼è¿åä¸ä¸ªç©ºæ°ç» new Array() // [] // åä¸ªæ£æ´æ°åæ°ï¼è¡¨ç¤ºè¿åçæ°æ°ç»çé¿åº¦ new Array(1) // [ empty ] new Array(2) // [ empty x 2 ] // éæ£æ´æ°çæ°å¼ä½ä¸ºåæ°ï¼ä¼æ¥é new Array(3.2) // RangeError: Invalid array length new Array(-3) // RangeError: Invalid array length // åä¸ªéæ°å¼ï¼æ¯å¦å符串ãå¸å°å¼ã对象çï¼ä½ä¸ºåæ°ï¼ // åè¯¥åæ°æ¯è¿åçæ°æ°ç»çæå new Array('abc') // ['abc'] new Array([1]) // [Array[1]] // å¤åæ°æ¶ï¼ææåæ°é½æ¯è¿åçæ°æ°ç»çæå new Array(1, 2) // [1, 2] new Array('a', 'b', 'c') // ['a', 'b', 'c'] ``` å¯ä»¥çå°ï¼`Array()`ä½ä¸ºæé 彿°ï¼è¡ä¸ºå¾ä¸ä¸è´ãå æ¤ï¼ä¸å»ºè®®ä½¿ç¨å®çææ°æ°ç»ï¼ç´æ¥ä½¿ç¨æ°ç»åé¢éæ¯æ´å¥½çåæ³ã ```javascript // bad var arr = new Array(1, 2); // good var arr = [1, 2]; ``` 注æï¼å¦æåæ°æ¯ä¸ä¸ªæ£æ´æ°ï¼è¿åæ°ç»çæå齿¯ç©ºä½ãè½ç¶è¯»åçæ¶åè¿å`undefined`ï¼ä½å®é ä¸è¯¥ä½ç½®æ²¡æä»»ä½å¼ãè½ç¶è¿æ¶å¯ä»¥è¯»åå°`length`屿§ï¼ä½æ¯åä¸å°é®åã ```javascript var a = new Array(3); var b = [undefined, undefined, undefined]; a.length // 3 b.length // 3 a[0] // undefined b[0] // undefined 0 in a // false 0 in b // true ``` ä¸é¢ä»£ç ä¸ï¼`a`æ¯`Array()`çæçä¸ä¸ªé¿åº¦ä¸º3ç空æ°ç»ï¼`b`æ¯ä¸ä¸ªä¸ä¸ªæå齿¯`undefined`çæ°ç»ï¼è¿ä¸¤ä¸ªæ°ç»æ¯ä¸ä¸æ ·çã读åé®å¼çæ¶åï¼`a`å`b`é½è¿å`undefined`ï¼ä½æ¯`a`çé®åï¼æåçåºå·ï¼é½æ¯ç©ºçï¼`b`çé®åæ¯æå¼çã ## éææ¹æ³ ### Array.isArray() `Array.isArray`æ¹æ³è¿åä¸ä¸ªå¸å°å¼ï¼è¡¨ç¤ºåæ°æ¯å¦ä¸ºæ°ç»ãå®å¯ä»¥å¼¥è¡¥`typeof`è¿ç®ç¬¦çä¸è¶³ã ```javascript var arr = [1, 2, 3]; typeof arr // "object" Array.isArray(arr) // true ``` ä¸é¢ä»£ç ä¸ï¼`typeof`è¿ç®ç¬¦åªè½æ¾ç¤ºæ°ç»çç±»åæ¯`Object`ï¼è`Array.isArray`æ¹æ³å¯ä»¥è¯å«æ°ç»ã ## å®ä¾æ¹æ³ ### valueOf()ï¼toString() `valueOf`æ¹æ³æ¯ä¸ä¸ªææå¯¹è±¡é½æ¥æçæ¹æ³ï¼è¡¨ç¤ºå¯¹è¯¥å¯¹è±¡æ±å¼ãä¸å对象ç`valueOf`æ¹æ³ä¸å°½ä¸è´ï¼æ°ç»ç`valueOf`æ¹æ³è¿åæ°ç»æ¬èº«ã ```javascript var arr = [1, 2, 3]; arr.valueOf() // [1, 2, 3] ``` `toString`æ¹æ³ä¹æ¯å¯¹è±¡çéç¨æ¹æ³ï¼æ°ç»ç`toString`æ¹æ³è¿åæ°ç»çå符串形å¼ã ```javascript var arr = [1, 2, 3]; arr.toString() // "1,2,3" var arr = [1, 2, 3, [4, 5, 6]]; arr.toString() // "1,2,3,4,5,6" ``` ### push()ï¼pop() `push`æ¹æ³ç¨äºå¨æ°ç»çæ«ç«¯æ·»å ä¸ä¸ªæå¤ä¸ªå ç´ ï¼å¹¶è¿åæ·»å æ°å ç´ åçæ°ç»é¿åº¦ã注æï¼è¯¥æ¹æ³ä¼æ¹ååæ°ç»ã ```javascript var arr = []; arr.push(1) // 1 arr.push('a') // 2 arr.push(true, {}) // 4 arr // [1, 'a', true, {}] ``` ä¸é¢ä»£ç 使ç¨`push`æ¹æ³ï¼å¾æ°ç»ä¸æ·»å äºå个æåã `pop`æ¹æ³ç¨äºå 餿°ç»çæåä¸ä¸ªå ç´ ï¼å¹¶è¿å该å ç´ ãæ³¨æï¼è¯¥æ¹æ³ä¼æ¹ååæ°ç»ã ```javascript var arr = ['a', 'b', 'c']; arr.pop() // 'c' arr // ['a', 'b'] ``` 对空æ°ç»ä½¿ç¨`pop`æ¹æ³ï¼ä¸ä¼æ¥éï¼èæ¯è¿å`undefined`ã ```javascript [].pop() // undefined ``` `push`å`pop`ç»å使ç¨ï¼å°±ææäºâåè¿å åºâçæ ç»æï¼stackï¼ã ```javascript var arr = []; arr.push(1, 2); arr.push(3); arr.pop(); arr // [1, 2] ``` ä¸é¢ä»£ç ä¸ï¼`3`æ¯æåè¿å ¥æ°ç»çï¼ä½æ¯ææ©ç¦»å¼æ°ç»ã ### shift()ï¼unshift() `shift()`æ¹æ³ç¨äºå 餿°ç»ç第ä¸ä¸ªå ç´ ï¼å¹¶è¿å该å ç´ ãæ³¨æï¼è¯¥æ¹æ³ä¼æ¹ååæ°ç»ã ```javascript var a = ['a', 'b', 'c']; a.shift() // 'a' a // ['b', 'c'] ``` ä¸é¢ä»£ç ä¸ï¼ä½¿ç¨`shift()`æ¹æ³ä»¥åï¼åæ°ç»å°±åäºã `shift()`æ¹æ³å¯ä»¥éåå¹¶æ¸ ç©ºä¸ä¸ªæ°ç»ã ```javascript var list = [1, 2, 3, 4]; var item; while (item = list.shift()) { console.log(item); } list // [] ``` ä¸é¢ä»£ç éè¿`list.shift()`æ¹æ³æ¯æ¬¡ååºä¸ä¸ªå ç´ ï¼ä»èéåæ°ç»ãå®çåææ¯æ°ç»å ç´ ä¸è½æ¯`0`æä»»ä½å¸å°å¼çäº`false`çå ç´ ï¼å æ¤è¿æ ·çéå䏿¯å¾å¯é ã `push()`å`shift()`ç»å使ç¨ï¼å°±ææäºâå è¿å åºâçéåç»æï¼queueï¼ã `unshift()`æ¹æ³ç¨äºå¨æ°ç»ç第ä¸ä¸ªä½ç½®æ·»å å ç´ ï¼å¹¶è¿åæ·»å æ°å ç´ åçæ°ç»é¿åº¦ã注æï¼è¯¥æ¹æ³ä¼æ¹ååæ°ç»ã ```javascript var a = ['a', 'b', 'c']; a.unshift('x'); // 4 a // ['x', 'a', 'b', 'c'] ``` `unshift()`æ¹æ³å¯ä»¥æ¥åå¤ä¸ªåæ°ï¼è¿äºåæ°é½ä¼æ·»å å°ç®æ æ°ç»å¤´é¨ã ```javascript var arr = [ 'c', 'd' ]; arr.unshift('a', 'b') // 4 arr // [ 'a', 'b', 'c', 'd' ] ``` ### join() `join()`æ¹æ³ä»¥æå®åæ°ä½ä¸ºåé符ï¼å°æææ°ç»æåè¿æ¥ä¸ºä¸ä¸ªå符串è¿åã妿䏿ä¾åæ°ï¼é»è®¤ç¨éå·åéã ```javascript var a = [1, 2, 3, 4]; a.join(' ') // '1 2 3 4' a.join(' | ') // "1 | 2 | 3 | 4" a.join() // "1,2,3,4" ``` 妿æ°ç»æåæ¯`undefined`æ`null`æç©ºä½ï¼ä¼è¢«è½¬æç©ºå符串ã ```javascript [undefined, null].join('#') // '#' ['a',, 'b'].join('-') // 'a--b' ``` éè¿`call`æ¹æ³ï¼è¿ä¸ªæ¹æ³ä¹å¯ä»¥ç¨äºå符串æç±»ä¼¼æ°ç»ç对象ã ```javascript Array.prototype.join.call('hello', '-') // "h-e-l-l-o" var obj = { 0: 'a', 1: 'b', length: 2 }; Array.prototype.join.call(obj, '-') // 'a-b' ``` ### concat() `concat`æ¹æ³ç¨äºå¤ä¸ªæ°ç»çåå¹¶ãå®å°æ°æ°ç»çæåï¼æ·»å å°åæ°ç»æåçåé¨ï¼ç¶åè¿åä¸ä¸ªæ°æ°ç»ï¼åæ°ç»ä¸åã ```javascript ['hello'].concat(['world']) // ["hello", "world"] ['hello'].concat(['world'], ['!']) // ["hello", "world", "!"] [].concat({a: 1}, {b: 2}) // [{ a: 1 }, { b: 2 }] [2].concat({a: 1}) // [2, {a: 1}] ``` é¤äºæ°ç»ä½ä¸ºåæ°ï¼`concat`乿¥åå ¶ä»ç±»åçå¼ä½ä¸ºåæ°ï¼æ·»å å°ç®æ æ°ç»å°¾é¨ã ```javascript [1, 2, 3].concat(4, 5, 6) // [1, 2, 3, 4, 5, 6] ``` 妿æ°ç»æåå æ¬å¯¹è±¡ï¼`concat`æ¹æ³è¿åå½åæ°ç»çä¸ä¸ªæµ æ·è´ãæè°âæµ æ·è´âï¼æçæ¯æ°æ°ç»æ·è´çæ¯å¯¹è±¡çå¼ç¨ã ```javascript var obj = { a: 1 }; var oldArray = [obj]; var newArray = oldArray.concat(); obj.a = 2; newArray[0].a // 2 ``` ä¸é¢ä»£ç ä¸ï¼åæ°ç»å å«ä¸ä¸ªå¯¹è±¡ï¼`concat`æ¹æ³çæçæ°æ°ç»å å«è¿ä¸ªå¯¹è±¡çå¼ç¨ãæä»¥ï¼æ¹åå对象以åï¼æ°æ°ç»è·çæ¹åã ### reverse() `reverse`æ¹æ³ç¨äºé¢ åæåæ°ç»å ç´ ï¼è¿åæ¹ååçæ°ç»ã注æï¼è¯¥æ¹æ³å°æ¹ååæ°ç»ã ```javascript var a = ['a', 'b', 'c']; a.reverse() // ["c", "b", "a"] a // ["c", "b", "a"] ``` ### slice() `slice()`æ¹æ³ç¨äºæåç®æ æ°ç»çä¸é¨åï¼è¿åä¸ä¸ªæ°æ°ç»ï¼åæ°ç»ä¸åã ```javascript arr.slice(start, end); ``` å®ç第ä¸ä¸ªåæ°ä¸ºèµ·å§ä½ç½®ï¼ä»0å¼å§ï¼ä¼å æ¬å¨è¿åçæ°æ°ç»ä¹ä¸ï¼ï¼ç¬¬äºä¸ªåæ°ä¸ºç»æ¢ä½ç½®ï¼ä½è¯¥ä½ç½®çå ç´ æ¬èº«ä¸å æ¬å¨å ï¼ã妿çç¥ç¬¬äºä¸ªåæ°ï¼åä¸ç´è¿åå°åæ°ç»çæåä¸ä¸ªæåã ```javascript var a = ['a', 'b', 'c']; a.slice(0) // ["a", "b", "c"] a.slice(1) // ["b", "c"] a.slice(1, 2) // ["b"] a.slice(2, 6) // ["c"] a.slice() // ["a", "b", "c"] ``` ä¸é¢ä»£ç ä¸ï¼æåä¸ä¸ªä¾å`slice()`没æåæ°ï¼å®é ä¸çäºè¿åä¸ä¸ªåæ°ç»çæ·è´ã 妿`slice()`æ¹æ³çåæ°æ¯è´æ°ï¼åè¡¨ç¤ºåæ°è®¡ç®çä½ç½®ã ```javascript var a = ['a', 'b', 'c']; a.slice(-2) // ["b", "c"] a.slice(-2, -1) // ["b"] ``` ä¸é¢ä»£ç ä¸ï¼`-2`è¡¨ç¤ºåæ°è®¡ç®ç第äºä¸ªä½ç½®ï¼`-1`è¡¨ç¤ºåæ°è®¡ç®ç第ä¸ä¸ªä½ç½®ã å¦æç¬¬ä¸ä¸ªåæ°å¤§äºçäºæ°ç»é¿åº¦ï¼æè 第äºä¸ªåæ°å°äºç¬¬ä¸ä¸ªåæ°ï¼åè¿å空æ°ç»ã ```javascript var a = ['a', 'b', 'c']; a.slice(4) // [] a.slice(2, 1) // [] ``` `slice()`æ¹æ³çä¸ä¸ªéè¦åºç¨ï¼æ¯å°ç±»ä¼¼æ°ç»çå¯¹è±¡è½¬ä¸ºçæ£çæ°ç»ã ```javascript Array.prototype.slice.call({ 0: 'a', 1: 'b', length: 2 }) // ['a', 'b'] Array.prototype.slice.call(document.querySelectorAll("div")); Array.prototype.slice.call(arguments); ``` ä¸é¢ä»£ç çåæ°é½ä¸æ¯æ°ç»ï¼ä½æ¯éè¿`call`æ¹æ³ï¼å¨å®ä»¬ä¸é¢è°ç¨`slice()`æ¹æ³ï¼å°±å¯ä»¥æå®ä»¬è½¬ä¸ºçæ£çæ°ç»ã ### splice() `splice()`æ¹æ³ç¨äºå é¤åæ°ç»çä¸é¨åæåï¼å¹¶å¯ä»¥å¨å é¤çä½ç½®æ·»å æ°çæ°ç»æåï¼è¿å弿¯è¢«å é¤çå ç´ ãæ³¨æï¼è¯¥æ¹æ³ä¼æ¹ååæ°ç»ã ```javascript arr.splice(start, count, addElement1, addElement2, ...); ``` `splice`ç第ä¸ä¸ªåæ°æ¯å é¤çèµ·å§ä½ç½®ï¼ä»0å¼å§ï¼ï¼ç¬¬äºä¸ªåæ°æ¯è¢«å é¤çå ç´ ä¸ªæ°ã妿åé¢è¿ææ´å¤çåæ°ï¼å表示è¿äºå°±æ¯è¦è¢«æå ¥æ°ç»çæ°å ç´ ã ```javascript var a = ['a', 'b', 'c', 'd', 'e', 'f']; a.splice(4, 2) // ["e", "f"] a // ["a", "b", "c", "d"] ``` ä¸é¢ä»£ç ä»åæ°ç»4å·ä½ç½®ï¼å é¤äºä¸¤ä¸ªæ°ç»æåã ```javascript var a = ['a', 'b', 'c', 'd', 'e', 'f']; a.splice(4, 2, 1, 2) // ["e", "f"] a // ["a", "b", "c", "d", 1, 2] ``` ä¸é¢ä»£ç é¤äºå 餿åï¼è¿æå ¥äºä¸¤ä¸ªæ°æåã èµ·å§ä½ç½®å¦ææ¯è´æ°ï¼å°±è¡¨ç¤ºä»åæ°ä½ç½®å¼å§å é¤ã ```javascript var a = ['a', 'b', 'c', 'd', 'e', 'f']; a.splice(-4, 2) // ["c", "d"] ``` ä¸é¢ä»£ç 表示ï¼ä»åæ°ç¬¬å个ä½ç½®`c`å¼å§å é¤ä¸¤ä¸ªæåã å¦æåªæ¯åçº¯å°æå ¥å ç´ ï¼`splice`æ¹æ³ç第äºä¸ªåæ°å¯ä»¥è®¾ä¸º`0`ã ```javascript var a = [1, 1, 1]; a.splice(1, 0, 2) // [] a // [1, 2, 1, 1] ``` å¦æåªæä¾ç¬¬ä¸ä¸ªåæ°ï¼çåäºå°åæ°ç»å¨æå®ä½ç½®æåæä¸¤ä¸ªæ°ç»ã ```javascript var a = [1, 2, 3, 4]; a.splice(2) // [3, 4] a // [1, 2] ``` ### sort() `sort`æ¹æ³å¯¹æ°ç»æåè¿è¡æåºï¼é»è®¤æ¯æç §åå ¸é¡ºåºæåºãæåºåï¼åæ°ç»å°è¢«æ¹åã ```javascript ['d', 'c', 'b', 'a'].sort() // ['a', 'b', 'c', 'd'] [4, 3, 2, 1].sort() // [1, 2, 3, 4] [11, 101].sort() // [101, 11] [10111, 1101, 111].sort() // [10111, 1101, 111] ``` ä¸é¢ä»£ç çæå两个ä¾åï¼éè¦ç¹æ®æ³¨æã`sort()`æ¹æ³ä¸æ¯æç §å¤§å°æåºï¼èæ¯æç §åå ¸é¡ºåºãä¹å°±æ¯è¯´ï¼æ°å¼ä¼è¢«å 转æå符串ï¼åæç §åå ¸é¡ºåºè¿è¡æ¯è¾ï¼æä»¥`101`æå¨`11`çåé¢ã 妿æ³è®©`sort`æ¹æ³æç §èªå®ä¹æ¹å¼æåºï¼å¯ä»¥ä¼ å ¥ä¸ä¸ªå½æ°ä½ä¸ºåæ°ã ```javascript [10111, 1101, 111].sort(function (a, b) { return a - b; }) // [111, 1101, 10111] ``` ä¸é¢ä»£ç ä¸ï¼`sort`ç忰彿°æ¬èº«æ¥åä¸¤ä¸ªåæ°ï¼è¡¨ç¤ºè¿è¡æ¯è¾ç两个æ°ç»æåãå¦æè¯¥å½æ°çè¿åå¼å¤§äº`0`ï¼è¡¨ç¤ºç¬¬ä¸ä¸ªæåæå¨ç¬¬äºä¸ªæååé¢ï¼å ¶ä»æ åµä¸ï¼é½æ¯ç¬¬ä¸ä¸ªå ç´ æå¨ç¬¬äºä¸ªå ç´ åé¢ã ```javascript [ { name: "å¼ ä¸", age: 30 }, { name: "æå", age: 24 }, { name: "çäº", age: 28 } ].sort(function (o1, o2) { return o1.age - o2.age; }) // [ // { name: "æå", age: 24 }, // { name: "çäº", age: 28 }, // { name: "å¼ ä¸", age: 30 } // ] ``` 注æï¼èªå®ä¹çæåºå½æ°åºè¯¥è¿åæ°å¼ï¼å¦åä¸åçæµè§å¨å¯è½æä¸åçå®ç°ï¼ä¸è½ä¿è¯ç»æé½ä¸è´ã ```javascript // bad [1, 4, 2, 6, 0, 6, 2, 6].sort((a, b) => a > b) // good [1, 4, 2, 6, 0, 6, 2, 6].sort((a, b) => a - b) ``` ä¸é¢ä»£ç ä¸ï¼åä¸ç§æåºç®æ³è¿åçæ¯å¸å°å¼ï¼è¿æ¯ä¸æ¨è使ç¨çãåä¸ç§æ¯æ°å¼ï¼ææ¯æ´å¥½çåæ³ã ### map() `map()`æ¹æ³å°æ°ç»çæææå便¬¡ä¼ å ¥åæ°å½æ°ï¼ç¶åææ¯ä¸æ¬¡çæ§è¡ç»æç»æä¸ä¸ªæ°æ°ç»è¿åã ```javascript var numbers = [1, 2, 3]; numbers.map(function (n) { return n + 1; }); // [2, 3, 4] numbers // [1, 2, 3] ``` ä¸é¢ä»£ç ä¸ï¼`numbers`æ°ç»çæææå便¬¡æ§è¡åæ°å½æ°ï¼è¿è¡ç»æç»æä¸ä¸ªæ°æ°ç»è¿åï¼åæ°ç»æ²¡æååã `map()`æ¹æ³æ¥åä¸ä¸ªå½æ°ä½ä¸ºåæ°ãè¯¥å½æ°è°ç¨æ¶ï¼`map()`æ¹æ³åå®ä¼ å ¥ä¸ä¸ªåæ°ï¼å½åæåãå½åä½ç½®åæ°ç»æ¬èº«ã ```javascript [1, 2, 3].map(function(elem, index, arr) { return elem * index; }); // [0, 2, 6] ``` ä¸é¢ä»£ç ä¸ï¼`map()`æ¹æ³çåè°å½æ°æä¸ä¸ªåæ°ï¼`elem`为å½åæåçå¼ï¼`index`为å½åæåçä½ç½®ï¼`arr`ä¸ºåæ°ç»ï¼`[1, 2, 3]`ï¼ã `map()`æ¹æ³è¿å¯ä»¥æ¥å第äºä¸ªåæ°ï¼ç¨æ¥ç»å®åè°å½æ°å é¨ç`this`åéï¼è¯¦è§ãthis åéãä¸ç« ï¼ã ```javascript var arr = ['a', 'b', 'c']; [1, 2].map(function (e) { return this[e]; }, arr) // ['b', 'c'] ``` ä¸é¢ä»£ç éè¿`map()`æ¹æ³ç第äºä¸ªåæ°ï¼å°åè°å½æ°å é¨ç`this`å¯¹è±¡ï¼æå`arr`æ°ç»ã 妿æ°ç»æç©ºä½ï¼`map()`æ¹æ³çåè°å½æ°å¨è¿ä¸ªä½ç½®ä¸ä¼æ§è¡ï¼ä¼è·³è¿æ°ç»ç空ä½ã ```javascript var f = function (n) { return 'a' }; [1, undefined, 2].map(f) // ["a", "a", "a"] [1, null, 2].map(f) // ["a", "a", "a"] [1, , 2].map(f) // ["a", , "a"] ``` ä¸é¢ä»£ç ä¸ï¼`map()`æ¹æ³ä¸ä¼è·³è¿`undefined`å`null`ï¼ä½æ¯ä¼è·³è¿ç©ºä½ã ### forEach() `forEach()`æ¹æ³ä¸`map()`æ¹æ³å¾ç¸ä¼¼ï¼ä¹æ¯å¯¹æ°ç»çæææå便¬¡æ§è¡åæ°å½æ°ã使¯ï¼`forEach()`æ¹æ³ä¸è¿åå¼ï¼åªç¨æ¥æä½æ°æ®ãè¿å°±æ¯è¯´ï¼å¦ææ°ç»éåçç®çæ¯ä¸ºäºå¾å°è¿åå¼ï¼é£ä¹ä½¿ç¨`map()`æ¹æ³ï¼å¦å使ç¨`forEach()`æ¹æ³ã `forEach()`çç¨æ³ä¸`map()`æ¹æ³ä¸è´ï¼åæ°æ¯ä¸ä¸ªå½æ°ï¼è¯¥å½æ°åæ ·æ¥åä¸ä¸ªåæ°ï¼å½åå¼ãå½åä½ç½®ãæ´ä¸ªæ°ç»ã ```javascript function log(element, index, array) { console.log('[' + index + '] = ' + element); } [2, 5, 9].forEach(log); // [0] = 2 // [1] = 5 // [2] = 9 ``` ä¸é¢ä»£ç ä¸ï¼`forEach()`éåæ°ç»ä¸æ¯ä¸ºäºå¾å°è¿åå¼ï¼èæ¯ä¸ºäºå¨å±å¹è¾åºå å®¹ï¼æä»¥ä¸å¿ 使ç¨`map()`æ¹æ³ã `forEach()`æ¹æ³ä¹å¯ä»¥æ¥å第äºä¸ªåæ°ï¼ç»å®åæ°å½æ°ç`this`åéã ```javascript var out = []; [1, 2, 3].forEach(function(elem) { this.push(elem * elem); }, out); out // [1, 4, 9] ``` ä¸é¢ä»£ç ä¸ï¼ç©ºæ°ç»`out`æ¯`forEach()`æ¹æ³ç第äºä¸ªåæ°ï¼ç»æï¼åè°å½æ°å é¨ç`this`å ³é®åå°±æå`out`ã æ³¨æï¼`forEach()`æ¹æ³æ æ³ä¸ææ§è¡ï¼æ»æ¯ä¼å°æææåéåå®ãå¦æå¸æç¬¦åæç§æ¡ä»¶æ¶ï¼å°±ä¸æéåï¼è¦ä½¿ç¨`for`循ç¯ã ```javascript var arr = [1, 2, 3]; for (var i = 0; i < arr.length; i++) { if (arr[i] === 2) break; console.log(arr[i]); } // 1 ``` ä¸é¢ä»£ç ä¸ï¼æ§è¡å°æ°ç»ç第äºä¸ªæåæ¶ï¼å°±ä¼ä¸ææ§è¡ã`forEach()`æ¹æ³åä¸å°è¿ä¸ç¹ã `forEach()`æ¹æ³ä¹ä¼è·³è¿æ°ç»ç空ä½ã ```javascript var log = function (n) { console.log(n + 1); }; [1, undefined, 2].forEach(log) // 2 // NaN // 3 [1, null, 2].forEach(log) // 2 // 1 // 3 [1, , 2].forEach(log) // 2 // 3 ``` ä¸é¢ä»£ç ä¸ï¼`forEach()`æ¹æ³ä¸ä¼è·³è¿`undefined`å`null`ï¼ä½ä¼è·³è¿ç©ºä½ã ### filter() `filter()`æ¹æ³ç¨äºè¿æ»¤æ°ç»æåï¼æ»¡è¶³æ¡ä»¶çæåç»æä¸ä¸ªæ°æ°ç»è¿åã å®çåæ°æ¯ä¸ä¸ªå½æ°ï¼æææ°ç»æå便¬¡æ§è¡è¯¥å½æ°ï¼è¿åç»æä¸º`true`çæåç»æä¸ä¸ªæ°æ°ç»è¿åãè¯¥æ¹æ³ä¸ä¼æ¹ååæ°ç»ã ```javascript [1, 2, 3, 4, 5].filter(function (elem) { return (elem > 3); }) // [4, 5] ``` ä¸é¢ä»£ç å°å¤§äº`3`çæ°ç»æåï¼ä½ä¸ºä¸ä¸ªæ°æ°ç»è¿åã ```javascript var arr = [0, 1, 'a', false]; arr.filter(Boolean) // [1, "a"] ``` ä¸é¢ä»£ç ä¸ï¼`filter()`æ¹æ³è¿åæ°ç»`arr`é颿æå¸å°å¼ä¸º`true`çæåã `filter()`æ¹æ³ç忰彿°å¯ä»¥æ¥åä¸ä¸ªåæ°ï¼å½åæåï¼å½åä½ç½®åæ´ä¸ªæ°ç»ã ```javascript [1, 2, 3, 4, 5].filter(function (elem, index, arr) { return index % 2 === 0; }); // [1, 3, 5] ``` ä¸é¢ä»£ç è¿åå¶æ°ä½ç½®çæåç»æçæ°æ°ç»ã `filter()`æ¹æ³è¿å¯ä»¥æ¥å第äºä¸ªåæ°ï¼ç¨æ¥ç»å®åæ°å½æ°å é¨ç`this`åéã ```javascript var obj = { MAX: 3 }; var myFilter = function (item) { if (item > this.MAX) return true; }; var arr = [2, 8, 3, 4, 1, 3, 2, 9]; arr.filter(myFilter, obj) // [8, 4, 9] ``` ä¸é¢ä»£ç ä¸ï¼è¿æ»¤å¨`myFilter()`å 鍿`this`åéï¼å®å¯ä»¥è¢«`filter()`æ¹æ³ç第äºä¸ªåæ°`obj`ç»å®ï¼è¿å大äº`3`çæåã ### some()ï¼every() è¿ä¸¤ä¸ªæ¹æ³ç±»ä¼¼âæè¨âï¼assertï¼ï¼è¿åä¸ä¸ªå¸å°å¼ï¼è¡¨ç¤ºå¤ææ°ç»æåæ¯å¦ç¬¦åæç§æ¡ä»¶ã å®ä»¬æ¥åä¸ä¸ªå½æ°ä½ä¸ºåæ°ï¼æææ°ç»æå便¬¡æ§è¡è¯¥å½æ°ãè¯¥å½æ°æ¥åä¸ä¸ªåæ°ï¼å½åæåãå½åä½ç½®åæ´ä¸ªæ°ç»ï¼ç¶åè¿åä¸ä¸ªå¸å°å¼ã `some`æ¹æ³æ¯åªè¦ä¸ä¸ªæåçè¿å弿¯`true`ï¼åæ´ä¸ª`some`æ¹æ³çè¿åå¼å°±æ¯`true`ï¼å¦åè¿å`false`ã ```javascript var arr = [1, 2, 3, 4, 5]; arr.some(function (elem, index, arr) { return elem >= 3; }); // true ``` ä¸é¢ä»£ç ä¸ï¼å¦ææ°ç»`arr`æä¸ä¸ªæå大äºçäº3ï¼`some`æ¹æ³å°±è¿å`true`ã `every`æ¹æ³æ¯æææåçè¿åå¼é½æ¯`true`ï¼æ´ä¸ª`every`æ¹æ³æè¿å`true`ï¼å¦åè¿å`false`ã ```javascript var arr = [1, 2, 3, 4, 5]; arr.every(function (elem, index, arr) { return elem >= 3; }); // false ``` ä¸é¢ä»£ç ä¸ï¼æ°ç»`arr`å¹¶éæææå大äºçäº`3`ï¼æä»¥è¿å`false`ã æ³¨æï¼å¯¹äºç©ºæ°ç»ï¼`some`æ¹æ³è¿å`false`ï¼`every`æ¹æ³è¿å`true`ï¼åè°å½æ°é½ä¸ä¼æ§è¡ã ```javascript function isEven(x) { return x % 2 === 0 } [].some(isEven) // false [].every(isEven) // true ``` `some`å`every`æ¹æ³è¿å¯ä»¥æ¥å第äºä¸ªåæ°ï¼ç¨æ¥ç»å®åæ°å½æ°å é¨ç`this`åéã ### reduce()ï¼reduceRight() `reduce()`æ¹æ³å`reduceRight()`æ¹æ³ä¾æ¬¡å¤çæ°ç»çæ¯ä¸ªæåï¼æç»ç´¯è®¡ä¸ºä¸ä¸ªå¼ãå®ä»¬ç差嫿¯ï¼`reduce()`æ¯ä»å·¦å°å³å¤çï¼ä»ç¬¬ä¸ä¸ªæåå°æåä¸ä¸ªæåï¼ï¼`reduceRight()`忝ä»å³å°å·¦ï¼ä»æåä¸ä¸ªæåå°ç¬¬ä¸ä¸ªæåï¼ï¼å ¶ä»å®å ¨ä¸æ ·ã ```javascript [1, 2, 3, 4, 5].reduce(function (a, b) { console.log(a, b); return a + b; }) // 1 2 // 3 3 // 6 4 // 10 5 //æåç»æï¼15 ``` ä¸é¢ä»£ç ä¸ï¼`reduce()`æ¹æ³ç¨æ¥æ±åºæ°ç»æææåçåã`reduce()`çåæ°æ¯ä¸ä¸ªå½æ°ï¼æ°ç»æ¯ä¸ªæåé½ä¼ä¾æ¬¡æ§è¡è¿ä¸ªå½æ°ã妿æ°ç»æ n 个æåï¼è¿ä¸ªåæ°å½æ°å°±ä¼æ§è¡ n - 1 次ã - ç¬¬ä¸æ¬¡æ§è¡ï¼`a`æ¯æ°ç»ç第ä¸ä¸ªæå`1`ï¼`b`æ¯æ°ç»ç第äºä¸ªæå`2`ã - ç¬¬äºæ¬¡æ§è¡ï¼`a`为ä¸ä¸è½®çè¿åå¼`3`ï¼`b`为第ä¸ä¸ªæå`3`ã - ç¬¬ä¸æ¬¡æ§è¡ï¼`a`为ä¸ä¸è½®çè¿åå¼`6`ï¼`b`为第å个æå`4`ã - ç¬¬åæ¬¡æ§è¡ï¼`a`为ä¸ä¸è½®è¿åå¼`10`ï¼`b`为第äºä¸ªæå`5`ãè³æ¤æææåéåå®æï¼æ´ä¸ªæ¹æ³çè¿åå¼å°±æ¯æåä¸è½®çè¿åå¼`15`ã `reduce()`æ¹æ³å`reduceRight()`æ¹æ³ç第ä¸ä¸ªåæ°é½æ¯ä¸ä¸ªå½æ°ãè¯¥å½æ°æ¥å以ä¸åä¸ªåæ°ã 1. 累积åéãç¬¬ä¸æ¬¡æ§è¡æ¶ï¼é»è®¤ä¸ºæ°ç»ç第ä¸ä¸ªæåï¼ä»¥åæ¯æ¬¡æ§è¡æ¶ï¼é½æ¯ä¸ä¸è½®çè¿åå¼ã 2. å½ååéãç¬¬ä¸æ¬¡æ§è¡æ¶ï¼é»è®¤ä¸ºæ°ç»ç第äºä¸ªæåï¼ä»¥åæ¯æ¬¡æ§è¡æ¶ï¼é½æ¯ä¸ä¸ä¸ªæåã 3. å½åä½ç½®ãä¸ä¸ªæ´æ°ï¼è¡¨ç¤ºç¬¬äºä¸ªåæ°ï¼å½ååéï¼çä½ç½®ï¼é»è®¤ä¸º`1`ã 4. åæ°ç»ã è¿åä¸ªåæ°ä¹ä¸ï¼åªæå两个æ¯å¿ é¡»çï¼åä¸¤ä¸ªåæ¯å¯éçã ```javascript [1, 2, 3, 4, 5].reduce(function ( a, // 累积åéï¼å¿ é¡» b, // å½ååéï¼å¿ é¡» i, // å½åä½ç½®ï¼å¯é arr // åæ°ç»ï¼å¯é ) { // ... ... ``` 妿è¦å¯¹ç´¯ç§¯åéæå®åå¼ï¼å¯ä»¥æå®æ¾å¨`reduce()`æ¹æ³å`reduceRight()`æ¹æ³ç第äºä¸ªåæ°ã ```javascript [1, 2, 3, 4, 5].reduce(function (a, b) { return a + b; }, 10); // 25 ``` ä¸é¢ä»£ç æå®åæ°`a`çåå¼ä¸º10ï¼æä»¥æ°ç»ä»10å¼å§ç´¯å ï¼æç»ç»æä¸º25ãæ³¨æï¼è¿æ¶`b`æ¯ä»æ°ç»ç第ä¸ä¸ªæåå¼å§éåï¼åæ°å½æ°ä¼æ§è¡5次ã å»ºè®®æ»æ¯å ä¸ç¬¬äºä¸ªåæ°ï¼è¿æ ·æ¯è¾ç¬¦åç´è§ï¼æ¯ä¸ªæ°ç»æåé½ä¼ä¾æ¬¡æ§è¡`reduce()`æ¹æ³ç忰彿°ãå¦å¤ï¼ç¬¬äºä¸ªåæ°å¯ä»¥é²æ¢ç©ºæ°ç»æ¥éã ```javascript function add(prev, cur) { return prev + cur; } [].reduce(add) // TypeError: Reduce of empty array with no initial value [].reduce(add, 1) // 1 ``` ä¸é¢ä»£ç ä¸ï¼ç±äºç©ºæ°ç»åä¸å°ç´¯ç§¯åéçåå§å¼ï¼`reduce()`æ¹æ³ä¼æ¥éãè¿æ¶ï¼å ä¸ç¬¬äºä¸ªåæ°ï¼å°±è½ä¿è¯æ»æ¯ä¼è¿åä¸ä¸ªå¼ã ä¸é¢æ¯ä¸ä¸ª`reduceRight()`æ¹æ³çä¾åã ```javascript function subtract(prev, cur) { return prev - cur; } [3, 2, 1].reduce(subtract) // 0 [3, 2, 1].reduceRight(subtract) // -4 ``` ä¸é¢ä»£ç ä¸ï¼`reduce()`æ¹æ³ç¸å½äº`3`åå»`2`ååå»`1`ï¼`reduceRight`æ¹æ³ç¸å½äº`1`åå»`2`ååå»`3`ã ç±äºè¿ä¸¤ä¸ªæ¹æ³ä¼éåæ°ç»ï¼æä»¥å®é ä¸å¯ä»¥ç¨æ¥åä¸äºéåç¸å ³çæä½ãæ¯å¦ï¼æ¾åºå符é¿åº¦æé¿çæ°ç»æåã ```javascript function findLongest(entries) { return entries.reduce(function (longest, entry) { return entry.length > longest.length ? entry : longest; }, ''); } findLongest(['aaa', 'bb', 'c']) // "aaa" ``` ä¸é¢ä»£ç ä¸ï¼`reduce()`ç忰彿°ä¼å°å符é¿åº¦è¾é¿çé£ä¸ªæ°ç»æåï¼ä½ä¸ºç´¯ç§¯å¼ãè¿å¯¼è´éåæææåä¹åï¼ç´¯ç§¯å¼å°±æ¯å符é¿åº¦æé¿çé£ä¸ªæåã ### indexOf()ï¼lastIndexOf() `indexOf`æ¹æ³è¿åç»å®å ç´ å¨æ°ç»ä¸ç¬¬ä¸æ¬¡åºç°çä½ç½®ï¼å¦ææ²¡æåºç°åè¿å`-1`ã ```javascript var a = ['a', 'b', 'c']; a.indexOf('b') // 1 a.indexOf('y') // -1 ``` `indexOf`æ¹æ³è¿å¯ä»¥æ¥å第äºä¸ªåæ°ï¼è¡¨ç¤ºæç´¢çå¼å§ä½ç½®ã ```javascript ['a', 'b', 'c'].indexOf('a', 1) // -1 ``` ä¸é¢ä»£ç ä»1å·ä½ç½®å¼å§æç´¢å符`a`ï¼ç»æä¸º`-1`ï¼è¡¨ç¤ºæ²¡ææç´¢å°ã `lastIndexOf`æ¹æ³è¿åç»å®å ç´ å¨æ°ç»ä¸æå䏿¬¡åºç°çä½ç½®ï¼å¦ææ²¡æåºç°åè¿å`-1`ã ```javascript var a = [2, 5, 9, 2]; a.lastIndexOf(2) // 3 a.lastIndexOf(7) // -1 ``` 注æï¼è¿ä¸¤ä¸ªæ¹æ³ä¸è½ç¨æ¥æç´¢`NaN`çä½ç½®ï¼å³å®ä»¬æ æ³ç¡®å®æ°ç»æåæ¯å¦å å«`NaN`ã ```javascript [NaN].indexOf(NaN) // -1 [NaN].lastIndexOf(NaN) // -1 ``` è¿æ¯å 为è¿ä¸¤ä¸ªæ¹æ³å é¨ï¼ä½¿ç¨ä¸¥æ ¼ç¸çè¿ç®ç¬¦ï¼`===`ï¼è¿è¡æ¯è¾ï¼è`NaN`æ¯å¯ä¸ä¸ä¸ªä¸çäºèªèº«çå¼ã ### é¾å¼ä½¿ç¨ ä¸é¢è¿äºæ°ç»æ¹æ³ä¹ä¸ï¼æä¸å°è¿åçè¿æ¯æ°ç»ï¼æä»¥å¯ä»¥é¾å¼ä½¿ç¨ã ```javascript var users = [ {name: 'tom', email: '[email protected]'}, {name: 'peter', email: '[email protected]'} ]; users .map(function (user) { return user.email; }) .filter(function (email) { return /^t/.test(email); }) .forEach(function (email) { console.log(email); }); // "[email protected]" ``` ä¸é¢ä»£ç ä¸ï¼å 产çä¸ä¸ªææ Email å°åç»æçæ°ç»ï¼ç¶ååè¿æ»¤åºä»¥`t`å¼å¤´ç Email å°åï¼æåå°å®æå°åºæ¥ã ## åè龿¥ - Nicolas Bevacqua, [Fun with JavaScript Native Array Functions](http://flippinawesome.org/2013/11/25/fun-with-javascript-native-array-functions/)