乐趣区

关于javascript:123mapparseInt-的结果及原因parseInt参数详解

后果为:[1,NaN,NaN], 起因如下

['1','2','3'].map(parseInt) 理论执行的代码是:

['1','2','3'].map((item,index)=>{return parseInt(item,index)
})

即返回的值别离为:

parseInt('1',0)   //1
parseInt('2',1)   //NaN
parseInt('3',2)   //NaN

先理解 map 办法

map() 办法创立了一个新数组,其后果是该数组的每个元素都调用一个提供的函数后返回的后果。 并且不会扭转原数组

var new_array = arr.map(function callback(currentValue,index,array){// 可用箭头函数 arr.map((currentValue,index,array)=>{})
  //currentValue: 是 callback 数组中正在解决的以后元素,index 可选,以后元素的索引,array 可选,是 callback 办法被调用的数组,另外,thisAry 可选,执行 callback 函数时应用的 this 值
},thisArg)

parseInt(string,radix) 函数可解析一个字符串,并返回一个整数。

先看 demo , 此处看似 radix 为进制。但官网文档解释为基数

var num1 = parseInt("10",2);          //2 (按二进制解析)
var num2 = parseInt("10",8);          //8 (按八进制解析)
var num3 = parseInt("10",10);        //10 (按十进制解析)
var num4 = parseInt("10",16);         //16 (按十六进制解析)

var num5 = parseInt("45",5)     //4(当解析 45 时,4 属于范畴内,所以失去 4,然而 5 不属于,所以走到这里间接把前面摈弃掉,相当于 parseInt("4",5)

var num6 = parseInt("445",5)    //24 (当解析 445 时,4 属于范畴内,然而在前面的 5 不属于,相当于 parseInt("44",5);,依据进制算法,最终算出,从右往左 4*5^0+4*5^1 = 24)

当 radix 为 0,小于 2,或者大于 36

parseInt('1',0);       // 1  (radix 是 0 的时候,按 16/ 8 进制解析,然而如果结尾是 1 - 9 就按 10 进制解析,所以是 1)

parseInt('2',1);       // NaN  (radix 参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。)

parseInt('3',2);      // NaN   (radix 的参数是 2,所以按二进制解析,而二进制最大为 1,只能为 0,1, 3 显然超了,转换不了,所以是 NaN)
  • string:须要被解析的字符串,必传
  • 当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会依据 string 来判断数字的基数。当疏忽参数 radix , JavaScript 默认数字的基数如下:

    • 如果 string 以 “0x” 结尾,parseInt() 会把 string 的其余部分解析为十六进制的整数。
    • 如果 string 以 0 结尾,那么 ECMAScript v3 容许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。
    • 如果 string 以 1 ~ 9 的数字结尾,parseInt() 将把它解析为十进制的整数。
退出移动版