['1','2','3'].map(parseInt)
对于每个迭代map,parseInt()传递两个参数:字符串和基数。
实际执行的代码是:
['1','2','3'].map((item,index)=>{
return parseInt(item,index)
})
即返回的值分别为:
parseInt('1',0) // 1
parseInt('2',1) // NaN
parseInt('3',2) // NaN, 3不是二进制
所以:
['1','2','3'].map(parseInt)
// 1, NaN, NaN
了解parseInt
定义和用法
parseInt() 函数可解析一个字符串,并返回一个整数。
当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。
当忽略参数 radix , JavaScript 默认数字的基数如下:
- 如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。
- 如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。
- 如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。
语法
parseInt(string, radix)
| 参数 | 描述 |
|---|---|
| string | 必需。要被解析的字符串。 |
| radix | 可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。 如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。 |
这个基数也就是进制,进制:
- 2进制,基数只能为0,1
- 3进制,基数只能为0,1,2
- 4进制,基数只能为0,1,2,3
- 5进制,基数只能为0,1,2,3,4 ...
- 8进制,基数只能为0,1,2,3,4,5,6,7
- 10进制,基数只能为0,1,2,3,4,5,6,7,8,9
- 16进制,基数只能为0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f 有个规律就是基数们都小于进制数
parseInt(str,radix)
str:字符串
radix:几进制
当radix>0 && ( radix>36 || radix < 2) 返回NaN
当radx=0或没传即(radix=undefined) 返回十进制
如parseInt('4215213',5) // 1*5^0 + 2*5^1 + 4*5^2=111
理解map
1.map概念
map()方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。 ‘map’即‘映射’,也就是原数组被映射成对应新数组。 新建一个数组,需要有承载对象,也意味着原始数组在调用它后不会发生变化; 该数组中的每个元素都调用一个提供的函数后返回结果。
var array1 = [1,4,9,16];
const map1 = array1.map(x=>x*2);
console.log(map1); // 输出:Array[2,8,18,32]
2.用JavaScript实现map
if(!Array.prototype.map){
Array.prototype.map = function(callback,thisArg){
var T,A,K;
if (this == null) {
throw new TypeError('this is null or not defined');
}
// 1. 将O赋值为调用map方法的数组
var O = Object(this);
// 2.将len赋值为数组O的长度
var len = O.length >>>0;
// 3.如果callback不是函数,则抛出TypeError异常
if (Object.prototype.toString.call(callback) !='[object Function]') {
throw new TypeError(callback + 'is not a function');
}
// 4.如果参数thisArg有值,则将T赋值为thisArg;否则T为undefined
if (thisArg) {
T = thisArg;
}
// 5.创建数组A,长度为原数组O长度len
A = new Array(len);
// 6.将K赋值为0
K = 0;
// 7.当K < len 时,执行循环
while (K < len) {
var kValue,mappedValue;
// 遍历O,K为原数组索引
if (K in O) {
// kValue为索引K对应的值
kValue = O[K];
// 执行callback,this指向T,参数有三个,分别是kValue:值,K:索引,O:原数组
mappedValue = callback.call(T,kValue,K, O);
// 返回值添加到新数组A中
A[K]=mappedValue;
}
// K自增1
K++;
}
// 8.返回数组A
return A;
}
}