面试题:arr.map(parseInt);

面试题:arr.map(parseInt)

解题步骤

  • 需要了解Array.prototype.map()的参数是一个回调函数
  • 回调函数调用时会传递两参数
  • 返回值是一个新的数组
  • 参数一:数组元素,参数二:数组元素对应的下标
  • 了解parseInt()在传递两个参数情况下,是如何运算的

Array.prototype.map()

Array.prototype.map = function (callback){
    
    
	//callback是一个函数
	let arr = [],i = 0
	for (;i<this.length;i++){
    
    
		arr.push(callback(this[i],i));
	}
	return arr;
}

这差不多就是Array.prototyp.map的实现原理

所以题目:arr.map(parseInt)是怎么样理解的;

Array.prototype.map = function (parseInt){
    
    
	//callback是一个函数
	let arr = [],i = 0
	for (;i<this.length;i++){
    
    
		arr.push(parseInt(this[i],i));//这是重点
	}
	return arr;
}

所以现在重点是:parseInt(this[i],i)是怎么样的返回值

  • parseInt的第二个参数是,进制值,就是在第一个参数中找到符合第二个参数的数据,然后将其转换为10进制
  • 第二个参数的范围是2~36之间
  • 0 是相当于 10 的

parseInt的第二个参数是,进制值,就是在第一个参数中找到符合第二个参数

parseInt(102563,8);//8进制,那么每一位数都不能大于等于8----- 102563
2.8进制数转换为10进制数
1*8**5+0*8**4+2*8**3+5*8**2+6*8**1+3*8**0 = 32768+0+1024+320+48+3 = 34163
console.log(parseInt(102563,8));//34163


parseInt(125623,3);//3进制,那么每一位都不能大于等于3---->12
2.再将3进制的12,转换为10进制
1*3**1 + 2*3**0 = 3 + 2 = 5
console.log(parseInt(125623,3)); // 5

第二个参数的范围是2~36之间,超出就返回NaN

parseInt(55,87);//NaN --->87 > 36
parseInt(88,2);//NaN ,没有一个是满足二进制的
parseInt(5,36);//5, 36不大于36 5*36**0 = 5
parseInt(10,1);//NaN
 

第二个参数如果是0,那么相当于10

parseInt(20,0); //20   2*10**1+0*2*10**0 = 20 + 0
parseInt(50,0); //50

解题

let arr = [10,5,9,6,3,8,20,56];
arr.map(parseInt);
第一次:parseInt(10,0); 1*10**1 + 0**10*0 = 10+0=10  ---->[10]
第二次:parseInt(5,1); NaN --->[10,NaN]
第三次:parseInt(9,2); NaN ---->[10,NaN,NaN]
第四次:parseInt(6,3); NaN ---->[10,NaN,NaN,NaN]
第五次:parseInt(3,4); 3*4**0 = 3 ----->[10,NaN,NaN,NaN,3]
第六次:parseInt(8,5); NaN------>[10,NaN,NaN,NaN,3,NaN]
第七次:parseInt(20,6); 2*6**1+0*6**0 = 12 + 0 = 12 ---->[10,NaN,NaN,NaN,3,NaN,12]
第八次:parseInt(56,7);5*7**1 + 6*7**0 = 35 +6 = 41;
------>[10,NaN,NaN,NaN,3,NaN,12,41]

最终输出:[10,NaN,NaN,NaN,3,NaN,12,41];


猜你喜欢

转载自blog.csdn.net/webMinStudent/article/details/109176455