技术解析

JavaScript 中参数传递问题?
0
2021-08-20 07:23:56
idczone

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

所以后两个只能报错了。

arr.map(parseInt) 等于 arr.map((value, index) => parseInt(value, index)) ,这样明白吗?

map 中回调函数的签名是(currentValue, index, array),当前值,索引号和数组本身,返回值就是结果中对应位置的值。
如果你使用 parseInt 作为 map 的回调函数,其实是不符合约定的,因为 parseInt 的签名是(string, radix),分别是字符串和基数。这相当于把 index 作为基数来解析字符串,稍微想想也应该觉得不合理。

你看一下 MDN 对于 map 模拟源码就明白了。 建议直接看一下 map 的实现

http://es5.github.io/#x15.4.4.19

传入数组的下标对应着 parseInt 的进制的参数

谢谢大家,明白了。map 源码哪里没有理解清楚,现在搞清楚了。

转数字用.map(Number)

用 .map(Math.floor) .map(Math.ceil)

分享一篇 N 年前的 map 源码分析
https://blog.mutoo.im/2013/12/array-map-with-parseint/

map 不建议用来遍历数组,只用作挨个处理元素即可
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/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.

只用作挨个处理元素 *并返回新数组* 即可

这种简写,老司机都会翻车

这个是廖雪峰的教程,为了避免翻车的。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服