首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有'fromCharCode‘(字符长度)的Javascript映射数组

带有'fromCharCode‘(字符长度)的Javascript映射数组
EN

Stack Overflow用户
提问于 2011-04-06 21:13:44
回答 3查看 3.5K关注 0票数 9

以下内容来自Chrome控制台中的一个交互式会话:

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-06 21:32:00

非常有趣的问题。

答案是:您在最后得到3的原因是,fromCharCode返回的字符串的字符数与对它的调用中的参数数量一样多,map使用三个参数调用回调函数:元素的值、元素的索引和被遍历的对象。因此,一个具有三个字符的字符串,而不是三个易于显示的字符。很棘手。

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

所以,举个例子:

代码语言:javascript
复制
> String.fromCharCode(67, 0, [67, 65, 84]).length
3

与来自map的调用一样,使用...just。

为了清楚起见:

代码语言:javascript
复制
> 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

如果我们确保一次只传递一个参数,我们看不到意想不到的效果,所以直接使用它会给我们带来一个我认为大多数人都没有预料到的结果:

代码语言:javascript
复制
> [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给了我们一个更容易理解的结果:

代码语言:javascript
复制
> [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
票数 17
EN

Stack Overflow用户

发布于 2011-04-06 23:16:50

我不能对T.J.Crowder的很好的答案进行太多的扩展,但我可以为这个特定的问题提供一个变通方法。

而不是

代码语言:javascript
复制
myarray.map(String.fromCharCode);

使用

代码语言:javascript
复制
String.fromCharCode.apply(String, myarray).split("");

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

票数 4
EN

Stack Overflow用户

发布于 2016-04-21 06:16:21

遇到了同样的问题,找到了这个帖子。如果你对ES6感兴趣,我提出这个解决方案:

代码语言:javascript
复制
arr.map((c)=>String.fromCharCode(c));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5566937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档