我们先来看三个例子?
let arrayOne = [1,2,3].map(parseInt);
console.log(arrayOne);//Array(3) [ 1, NaN, NaN ]
let arrayTwo = [1, 2, 3];
let new_array = Array.from(arrayTwo,parseInt);
console.log(new_array);//Array(3) [ 1, NaN, NaN ]
let arrayThr = [1, 2, 3,5];
let new_array_b = Array.from(arrayThr,()=>'中国');
console.log(new_array_b);//Array(4) [ "中国", "中国", "中国", "中国" ]
先说说我的观点吧:Aarry.from( )如果有第二个参数也就是回调函数(这个参数可以直接增强新数组的值),那么数组或者新数组(由类数组结构转换为数组实例的新数组)会给这个回调函数默认传递两个参数:当前值和索引。这也是为什么第二个例子是 [ 1, NaN, NaN ]的原因,因为parseInt是可以接受两个参数的,第一个参数是要解析的字符串,第二个参数是要解析的数字的基数,介于2-36之间,省略或者为0按10为基数,0X或0x按16为基数。
换句话说,等同于下面的代码:
parseInt('1',0)=1,
parseInt('2',1)=NaN,
parseInt('3',2)=NaN,
同理,第一个例子也是一样的,不过是给回调函数传递了三个参数:当前值、索引、当前数组,而parseInt忽略了第三个参数,所以结果也是[ 1, NaN, NaN ]
现在谈一下为什么第三个例子可以直接更改数组的值,我的猜想是,这个回调函数的结果是直接放回原数组的,也就是说我的返回值无论是字符串还是数字或者是其它类型,这个返回值都会取代原数组对应位置的值的。
以上仅是个人结论和猜想,如有问题欢迎指出。