从['1','2','3'].map(parseInt) 了解parseInt()和map

648 阅读2分钟

['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;
  }
}