我在浏览器上得到了令人惊讶的(对我而言)结果:
> [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"]
这是一个实施错误吗?另外,您能指出我解释这种行为的相关文档吗?
答案 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个参数传递给回调currentValue
,index
和array
。如果您的实际回调只接受一个参数(例如将其包装在匿名函数中),这不是问题,因为其他两个将被忽略。但是fromCharCode实际上需要一系列数字,所以它会尝试用额外的两个参数做一些导致混乱行为的事情。
简而言之,.map
的回调应该只接受1个参数。或者它更好地知道如何处理其他两个。