使用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