两段实现string2int功能的JavaScript代码为何运行结果不一致?
问题解答
1. 为什么执行map后数组arr的元素还是字符串类型?
JavaScript的map()方法不会修改原数组,它的作用是生成一个新数组,新数组的元素是原数组每个元素经过回调函数处理后的结果。第一段代码里只是调用了arr.map(...),但没有把返回的新数组赋值给arr,所以原数组arr完全没变化,依然是最初的字符串数组。
举个简单例子验证:
let arr = ['1','2']; let newArr = arr.map(x => x*1); console.log(arr); // 输出 ['1','2'],原数组未变 console.log(newArr); // 输出 [1,2],新数组才是转换后的结果
2. 结果10203040506是如何得到的?
因为arr里的元素还是字符串,reduce()执行时会混合字符串拼接和数字运算,步骤如下:
- 初始阶段,reduce的第一个参数
x是第一个元素'1',第二个参数y是第二个元素'2' - 第一次计算:
'1' * 10 + '2'→ 字符串'1'乘10会被转为数字10,再和字符串'2'相加,结果是字符串'102' - 第二次计算:
'102' * 10 + '3'→'102'转数字1020,加字符串'3',得到'10203' - 第三次计算:
'10203' * 10 + '4'→ 102030 +'4'→'1020304' - 第四次计算:
'1020304' * 10 + '5'→ 10203040 +'5'→'102030405' - 第五次计算:
'102030405' * 10 + '6'→ 1020304050 +'6'→'10203040506'
最终alert输出的就是这个字符串,显示出来就是数字形式的10203040506。
如果要修复第一段代码,只需要把map的返回值赋值给arr即可:
arr = arr.map(function (x) {return x*1;});
内容的提问来源于stack exchange,提问作者rawFriedFish
相关产品推荐
相关产品推荐

