以下内容来自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)
| 归档时间: |
|
| 查看次数: |
2928 次 |
| 最近记录: |