2017-09-15 158 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" 
相关问题