使用Chrome的控制檯,這是我的輸入和輸出:.map()在這種情況下做什麼?
[0].map(Array);
[[0, 0, [0]]]; // output
發生了什麼事嗎?
編輯
這讓我好奇的原因是因爲像
[0].map(String);
將返回
["0"];
而且不
["0", "0", "String"]
使用Chrome的控制檯,這是我的輸入和輸出:.map()在這種情況下做什麼?
[0].map(Array);
[[0, 0, [0]]]; // output
發生了什麼事嗎?
編輯
這讓我好奇的原因是因爲像
[0].map(String);
將返回
["0"];
而且不
["0", "0", "String"]
.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()
使用所有提供的參數。
首先,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])
你更新的問題後。其他答案提供信息關於map
要回答爲什麼數組和字符串的不同期待建設者
String構造接受1個參數String(thing)而陣列new Array(element0, element1[, ...[, elementN]])
這與爲什麼'.map(Number)'將每個項目轉換爲數字而不是爲每個項目返回類似'[3,2,[4,1,3]]''是一樣的原因。 – Xufox
@Xufox是的答案是在構造函數:) –
此調用
[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"
我假設,因爲他總是需要一些JavaScript WTFs中感受快樂 – npst
哦,這只是一個不太WTF-Y變種'[」 10','10','10']。map(parseInt)' – gronostaj
另一個奇怪的'.map()'行爲:https://stackoverflow.com/questions/14528397/strange-behavior-for-map-parseint在一般來說,當使用帶有多個參數的函數的'.map()'時,你必須小心。 – Barmar