2017-09-15 160 views
93

使用Chrome的控制檯,這是我的輸入和輸出:.map()在這種情況下做什麼?

[0].map(Array); 

[[0, 0, [0]]]; // output 

發生了什麼事嗎?

編輯

這讓我好奇的原因是因爲像

[0].map(String); 

將返回

["0"]; 

而且不

["0", "0", "String"] 
+34

我假設,因爲他總是需要一些JavaScript WTFs中感受快樂 – npst

+12

哦,這只是一個不太WTF-Y變種'[」 10','10','10']。map(parseInt)' – gronostaj

+2

另一個奇怪的'.map()'行爲:https://stackoverflow.com/questions/14528397/strange-behavior-for-map-parseint在一般來說,當使用帶有多個參數的函數的'.map()'時,你必須小心。 – Barmar

回答

122

.map() function使用三個參數調用Array()函數,數組元素的值是0,該元素的索引也是0,並且是對整個數組的引用。

所以它就像這樣:

var a = [0]; 
var index = 0 
Array(a[index], index, a); // create array with three elements 

通過Array()返回的數組,然後成爲數組的第一個元素是.map()造成的,因此,在您的[[0, 0, [0]]]結果嵌套的額外水平。

關於您的編輯編輯:當你說[0].map(String);導致String()被稱爲用相同的三個參數一樣String(a[index], index, a),但String()函數忽略所有,但第一個參數,而Array()使用所有提供的參數。

38

首先Array可作爲一個函數來創建陣列:

var arr = Array(1, 2, "Hello"); 
 

 
console.log(arr); // [1, 2, "Hello"]

其次map傳遞三個參數到它的回調:元素,從它的索引數組和數組本身。

所以,因爲你的數組包含一個元素,該行:

[0].map(Array); 

等同於:

[Array(0, 0, [0])];  // the element 0 in the original array will be mapped into Array(0, 0, [0]) 
6

你更新的問題後。其他答案提供信息關於map

要回答爲什麼數組和字符串的不同期待建設者

String構造接受1個參數String(thing)而陣列new Array(element0, element1[, ...[, elementN]])

+2

這與爲什麼'.map(Number)'將每個項目轉換爲數字而不是爲每個項目返回類似'[3,2,[4,1,3]]''是一樣的原因。 – Xufox

+0

@Xufox是的答案是在構造函數:) –

3

此調用

[0].map(Array); 

給你相同的結果,如果你寫這樣的東西:

[0].map(function (value, index, array) { 
    return Array(value, index, array); 
}) 

Map功能調用Array函數有三個參數:元素的值,元素的索引和整個數組。對Array的這個調用將返回包含3個元素的數組:值(數字0),索引(數字0),整個數組([0])。

而這個新的陣列被包裹在原始數組,因爲你馬培德原始元素(數字0)新元素(3個元素的數組)

注意:您可能習慣於使用只喜歡第一個參數在

array.map(function (a) { return a * a; }); 

或僅使用兩個也讓指數

array.map(function (item, index) { return "index=" + index + ", value=" + item; }); 

但是,你要記住,map STIL l提供了3個參數,您只需在回調函數中忽略它們即可。這也是爲什麼這樣的代碼:

[0].map(String); 

回報

["0"] 

這是因爲String功能只關心第一個參數,而忽略其他傳遞的參數。 如果調用

String(11, "Some", "other", "ignored", "parameters") 

你仍然會得到

"11" 
相關問題