---
# System prepended metadata

title: Array.prototype.map()
tags: [java script, JS, array]

---

Array.prototype.map()
=====================

.map()會將陣列裡的所有元素element迭代呼叫一遍，並帶入callback function產生新值後，回傳至新的陣列 ( 所以假如沒有要產生新的陣列，就不應使用`.map()`改為`.each()`、`.forEach()` )


基本用法
--------
```
let new_array = arr.map(function callback( currentValue[, index[, array]]) {
    // return element for new_array
}[, thisArg])
```



### 參數
`callback`
呼叫 arr 所有元素的回呼函式。新數值會在每次執行 callback 時加到 new_array。

callback 函式可傳入以下三個參數：

`currentValue`
原陣列目前所迭代處理中的元素。

`index`(選擇性)
原陣列目前所迭代處理中的元素之索引。

`array`(選擇性)
呼叫 map 方法的陣列。

`thisArg`(選擇性)
選擇性的參數。執行 callback 回呼函式的 this 值。

什麼時候不要用 map()
-----------------
因為 map 會建立新的陣列，如果在不想建立新陣列時使用該方法，就會變成**反模式（anti-pattern）**：這種情況下，要使用 forEach (en-US) 或 for-of (en-US)。

以下情況不應該使用 map；

1. 不使用回傳的新陣列，
2. 或/且不需要回傳新陣列。

callback 函式於被調用時會傳入三個參數：元素值、元素之索引、以及被迭代的陣列物件。

若有提供 thisArg 參數予 map 方法，thisArg 將會被當作回呼函式的 this 值，否則 this 會是 undefined (en-US)。callback 的最終 this 值是依據函式的 this 規則來決定。

**map 不會修改呼叫它的原始陣列（雖然在 callback 執行時有可能會這麼做）。**

由 map 方法所回傳之新陣列的範圍，於 callback 函式第一次被調用之前就已經被設定。而在呼叫 map 之後才加至原始陣列中的元素，將不會傳入 callback 當中。假如原始陣列中元素的值改變了，則 callback 得到此元素的值將會是 map 傳入元素當下的值。而在呼叫 map 之後、且於被 map 傳入 callback 之前就被刪除的原始陣列元素，並不會被 map 迭代到。

依據規範中定義的演算法，若呼叫 map 方法的原始陣列為一稀疏（sparse）陣列，則回傳的新陣列也會是在同樣索引中留空的稀疏陣列。