以下内容来自Chrome控制台中的一个交互式会话:
myarray
//-> [67, 65, 84]
String.fromCharCode(67)
//-> "C"
String.fromCharCode(67).length
//-> 1
String.fromCharCode(myarray[0])
//-> "C"
String.fromCharCode(myarray[0]).length
//-> 1
myarray.map(String.fromCharCode)
//-> ["C", "A", "T"]
myarray.map(String.fromCharCode)[0]
//-> "C"
myarray.map(String.fromCharCode)[0].length
//-> 3谁能解释一下为什么最后一个操作返回3
发布于 2011-04-06 21:32:00
非常有趣的问题。
答案是:您在最后得到3的原因是,fromCharCode返回的字符串的字符数与对它的调用中的参数数量一样多,map使用三个参数调用回调函数:元素的值、元素的索引和被遍历的对象。因此,一个具有三个字符的字符串,而不是三个易于显示的字符。很棘手。
具体地说,我们为第一个参数获取"C";为第二个参数获取字符0(因为我们正在查看[0];对于[1],它应该是1,等等),以及一个基于强制将数组转换为数字的字符(使用fromCharCode使用的任何规则;Šime Vidas在下面表示它将对其执行ToUInt16,这将导致0)。
所以,举个例子:
> String.fromCharCode(67, 0, [67, 65, 84]).length
3与来自map的调用一样,使用...just。
为了清楚起见:
> String.fromCharCode(67, 0, [67, 65, 84]).length
3
> String.fromCharCode(67, 0, null).length
3
> String.fromCharCode(67, 0, 0, 0, 0, 0, 0).length
7如果我们确保一次只传递一个参数,我们看不到意想不到的效果,所以直接使用它会给我们带来一个我认为大多数人都没有预料到的结果:
> [67, 65, 84].map(String.fromCharCode)
["C", "A", "T"]
> [67, 65, 84].map(String.fromCharCode)[0]
"C"
> [67, 65, 84].map(String.fromCharCode)[0].length
3...this给了我们一个更容易理解的结果:
> [67, 65, 84].map(function(value) { return String.fromCharCode(value); })
["C", "A", "T"]
> [67, 65, 84].map(function(value) { return String.fromCharCode(value); })[0]
"C"
> [67, 65, 84].map(function(value) { return String.fromCharCode(value); })[0].length
1发布于 2011-04-06 23:16:50
我不能对T.J.Crowder的很好的答案进行太多的扩展,但我可以为这个特定的问题提供一个变通方法。
而不是
myarray.map(String.fromCharCode);使用
String.fromCharCode.apply(String, myarray).split("");除了返回预期结果的好处外,这也可以在不依赖ECMAScript第五版方法Array.prototype.map的情况下工作,从而使其更兼容。
发布于 2016-04-21 06:16:21
遇到了同样的问题,找到了这个帖子。如果你对ES6感兴趣,我提出这个解决方案:
arr.map((c)=>String.fromCharCode(c));https://stackoverflow.com/questions/5566937
复制相似问题