JavaScript 中参数传递问题?

2020-02-06 14:07:11 +08:00
 Pichai

廖雪峰 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

所以后两个只能报错了。
2581 次点击
所在节点    JavaScript
13 条回复
chuangy
2020-02-06 14:16:48 +08:00
arr.map(parseInt) 等于 arr.map((value, index) => parseInt(value, index)) ,这样明白吗?
ayase252
2020-02-06 14:17:58 +08:00
map 中回调函数的签名是(currentValue, index, array),当前值,索引号和数组本身,返回值就是结果中对应位置的值。

如果你使用 parseInt 作为 map 的回调函数,其实是不符合约定的,因为 parseInt 的签名是(string, radix),分别是字符串和基数。这相当于把 index 作为基数来解析字符串,稍微想想也应该觉得不合理。
lovedebug
2020-02-06 14:18:04 +08:00
你看一下 MDN 对于 map 模拟源码就明白了。 建议直接看一下 map 的实现
Ruohua3kou
2020-02-06 14:19:03 +08:00
tuobaye0711
2020-02-06 14:19:23 +08:00
传入数组的下标对应着 parseInt 的进制的参数
Pichai
2020-02-06 14:32:07 +08:00
谢谢大家,明白了。map 源码哪里没有理解清楚,现在搞清楚了。
otakustay
2020-02-06 15:25:45 +08:00
转数字用.map(Number)
optional
2020-02-06 15:32:06 +08:00
用 .map(Math.floor) .map(Math.ceil)
Mutoo
2020-02-06 15:35:14 +08:00
分享一篇 N 年前的 map 源码分析
https://blog.mutoo.im/2013/12/array-map-with-parseint/
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.
learnshare
2020-02-06 15:53:50 +08:00
@learnshare 只用作挨个处理元素 *并返回新数组* 即可
welling
2020-02-07 00:35:29 +08:00
这种简写,老司机都会翻车
Pichai
2020-02-07 05:01:52 +08:00
@welling 这个是廖雪峰的教程,为了避免翻车的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/642512

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX