带有'fromCharCode'的Javascript地图数组(字符长度)

Dav*_*lis 8 javascript

以下内容来自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
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么上次操作返回3

T.J*_*der 16

非常有趣的问题.

答案是:你3最终得到的原因是fromCharCode返回一个字符串,其字符数与调用中的参数一样多,并map使用三个参数调用回调函数:元素的值,索引元素和被遍历的对象.因此,一个字符串有三个字符,但不是三个容易显示的字符.棘手.

具体来说,我们得到"C"第一个论点; 第二个参数的字符0(因为我们正在查看[0];它将是1 [1],等等),以及基于将数组强制转换为数字的字符(使用任何规则fromCharCode用于此;ŠimeVidas在下面说它'我ToUInt16会做的,这将导致0).

所以,例如:

> String.fromCharCode(67, 0, [67, 65, 84]).length
3
Run Code Online (Sandbox Code Playgroud)

......就像来自的电话一样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
Run Code Online (Sandbox Code Playgroud)

如果我们确保我们一次只传递一个参数,我们看不到意想不到的效果,所以直接使用它会给我们一个结果,我想我们大多数人都不会期望:

> [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
Run Code Online (Sandbox Code Playgroud)

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

> [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
Run Code Online (Sandbox Code Playgroud)