Javascript映射数组'fromCharCode'(字符)

Javascript map array with 'fromCharCode' (character length)

本文关键字:字符 fromCharCode Javascript 映射 数组      更新时间:2023-09-26

以下是来自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 ?

非常有趣的问题。

和答案是:你得到3的原因是,fromCharCode返回一个字符串与一样多的字符,因为在调用它的参数,和map调用回调函数有三个参数:元素的值,元素的索引,和对象被遍历。因此,一个包含三个字符的字符串,但不是三个易于显示的字符。棘手。

具体来说,第一个参数是"C";第二个参数的字符0(因为我们正在看[0];对于[1]等,它将是1),以及基于将数组强制转换为数字的字符(使用fromCharCode使用的任何规则;Šime Vidas在下面说,它将对它执行ToUInt16,这将导致0)。

例如:

> String.fromCharCode(67, 0, [67, 65, 84]).length
3

…就像map的调用。

清晰的

:

> 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

…这给了我们一个更容易理解的结果:

> [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

我无法详细阐述T.J. Crowder的答案,但我可以为这个特定问题提供一个解决方案。

而不是

myarray.map(String.fromCharCode);
使用

String.fromCharCode.apply(String, myarray).split("");

除了返回预期结果的好处之外,这也可以在不依赖ECMAScript第5版方法Array.prototype.map的情况下工作,从而使其更具兼容性。

遇到了同样的问题,发现了这个线程。如果你正在使用ES6,我建议这样做:

arr.map((c)=>String.fromCharCode(c));