构造函数是map()的有效函数

时间:2014-06-18 14:25:47

标签: javascript

我在浏览器上得到了令人惊讶的(对我而言)结果:

> [104, 105, 115, 32, 105, 115, 32, 97, 32].map(String.fromCharCode);
["h", "i", "s", " ", "i", "s", " ", "a", " "]
> [104, 105, 115, 32, 105, 115, 32, 97, 32, 115].map(String.fromCharCode);
["h", "i", "s", " ", "i", "s", " ", "a", " ", "s    "]

(115给出" s"对于前两次出现,但第三次给出其他东西)

如果我将它包装在另一个函数中似乎有效:

> [104, 105, 115, 32, 105, 115, 32, 97, 32, 115].map(function(x) { return String.fromCharCode(x);});
["h", "i", "s", " ", "i", "s", " ", "a", " ", "s"]

这是一个实施错误吗?另外,您能指出我解释这种行为的相关文档吗?

2 个答案:

答案 0 :(得分:3)

您无法将String.fromCharCode()直接传递给map(),因为map()会使用三个参数(当前元素,其索引和数组本身)调用它

换句话说,代码:

[42].map(String.fromCharCode);

fromCharCode()调用为:

String.fromCharCode(42, 0, [42]);

由于fromCharCode()处理其所有参数,因此无法提供您正在寻找的结果。

答案 1 :(得分:0)

你的问题与你做这样的事情非常相似:

["1", "2", "3"].map(parseInt);

请参阅有关mdn主题棘手用例和链接blog post的讨论。

问题是array.map函数会将3个参数传递给回调currentValueindexarray。如果您的实际回调只接受一个参数(例如将其包装在匿名函数中),这不是问题,因为其他两个将被忽略。但是fromCharCode实际上需要一系列数字,所以它会尝试用额外的两个参数做一些导致混乱行为的事情。

简而言之,.map的回调应该只接受1个参数。或者它更好地知道如何处理其他两个。