廖雪峰 JavaScript 教程,把数组中的字符型转换为数值型。
var arr=['1','2','3',];
var r=arr.map(parseInt);
console.log(r); // 此处打印的是 1,NaN,NaN
别人给出的解释,这个解释没有看太明白。请从参数传递的角度详细解释一下。谢谢大家。
因为 map()实际上会传入三个参数:(currentValue, index, callingArray)。parseInt 接受两个参数(string, radix),第二个参数声明底数(即指定被转换的“数字”多少进制)。
有关 parseInt 的 radix,当遇到 0、undefined 或未被指定时,parseInt 有如下行为:
1.被转换的字符串起于"0x"/"0X" --> 十六进制转为十进制;
2.被转换的字符串起于"0" --> 八进制或十进制(由解释器决定)转为十进制;
3.被转换字符串起于其他值 --> 十进制转为十进制。
当 arr = [1,2,3]时,arr.map(parseInt)实际为:
parseInt('1', 0); // 按十进制转换'1'
parseInt('2', 1); // 按一进制转换'2',但一进制中只有 0 没有 1
parseInt('3', 2); // 按二进制转换 3,但二进制中只有 0 和 1 没有 2
所以后两个只能报错了。
1
chuangy 2020-02-06 14:16:48 +08:00 2
arr.map(parseInt) 等于 arr.map((value, index) => parseInt(value, index)) ,这样明白吗?
|
2
ayase252 2020-02-06 14:17:58 +08:00 1
map 中回调函数的签名是(currentValue, index, array),当前值,索引号和数组本身,返回值就是结果中对应位置的值。
如果你使用 parseInt 作为 map 的回调函数,其实是不符合约定的,因为 parseInt 的签名是(string, radix),分别是字符串和基数。这相当于把 index 作为基数来解析字符串,稍微想想也应该觉得不合理。 |
3
lovedebug 2020-02-06 14:18:04 +08:00
你看一下 MDN 对于 map 模拟源码就明白了。 建议直接看一下 map 的实现
|
4
Ruohua3kou 2020-02-06 14:19:03 +08:00
|
5
tuobaye0711 2020-02-06 14:19:23 +08:00 via Android 1
传入数组的下标对应着 parseInt 的进制的参数
|
6
Pichai OP 谢谢大家,明白了。map 源码哪里没有理解清楚,现在搞清楚了。
|
7
otakustay 2020-02-06 15:25:45 +08:00
转数字用.map(Number)
|
8
optional 2020-02-06 15:32:06 +08:00
用 .map(Math.floor) .map(Math.ceil)
|
9
Mutoo 2020-02-06 15:35:14 +08:00
分享一篇 N 年前的 map 源码分析
https://blog.mutoo.im/2013/12/array-map-with-parseint/ |
10
learnshare 2020-02-06 15:52:57 +08:00
map 不建议用来遍历数组,只用作挨个处理元素即可
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map#When_not_to_use_map >Since map builds a new array, using it when you aren't using the returned array is an anti-pattern; use forEach or for-of instead. |
11
learnshare 2020-02-06 15:53:50 +08:00
@learnshare 只用作挨个处理元素 *并返回新数组* 即可
|
12
welling 2020-02-07 00:35:29 +08:00
这种简写,老司机都会翻车
|