["1", "2", "3"].map(parseInt) 为什么返回[1,NaN,NaN]

原文链接: https://blog.csdn.net/freshlover/article/details/19034079

javascript中的parseInt与map函数都是常用的函数,可是 [“1”, “2”, “3”].map(parseInt) 为何返回不是[1,2,3]却是[1,NaN,NaN]?

这涉及到是否深入理解两个函数的格式与参数含义。

首先根据我对两个函数用法的了解,猜测是由于parseInt(string, radix) 的参数radix必须介于2~36之间,而且字符串string中的数字不能大于radix才能正确返回数字结果值。

我们通过以下javascript代码测试一下:

var a=["1", "2", "3", "4","5",6,7,8,9,10,11,12,13,14,15];
a.map(parseInt);
//返回结果为:[1,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,9,11,13,15,17,19]

正好印证了以上的猜测是正确的,因为:

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

正是由于map的回调函数的参数index索引值作了parseInt的基数radix,导致出现超范围的radix赋值和不合法的进制解析,才会返回NaN。

也许你还会怀疑索引值和基数radix对应关系的准确性,这时你可以重新定义parseInt函数,再来测试一下:

function parseInt(str, radix) { 
    return str+'-'+radix; 
};
var a=["1", "2", "3", "4","5",6,7,8,9,10,11,12,13,14,15];
a.map(parseInt);

//输出结果为:["1-0","2-1","3-2","4-3","5-4","6-5","7-6","8-7","9-8","10-9","11-10","12-11","13-12","14-13","15-14"]。

通过此例,再次证明,索引index的起始值从0开始,与radix的对应如前陈述一致,所以才会出现返回NaN的类型值。

这个实例提醒我们在使用两个函数parseInt和map时候要格外小心。同时对于IE6-7不支持map函数的情况也要谨慎或者通过prototype扩展处理。

最后再仔细回顾温习一下:

parseInt() 函数

定义和用法

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

语法

parseInt(string, radix)

参数 描述
string 必需。要被解析的字符串。
radix 可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。
如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。
如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。

返回值

返回解析后的数字。

说明

当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。

举例,如果 string 以 “0x” 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。如果string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。如果string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。

提示和注释

注释:只有字符串中的第一个数字会被返回。

注释:开头和结尾的空格是允许的。

提示:如果字符串的第一个字符不能被转换为数字,那么 parseInt() 会返回 NaN。

实例
在本例中,我们将使用 parseInt() 来解析不同的字符串:

parseInt("10");			//返回 10
parseInt("19",10);		//返回 19 (10+9)
parseInt("11",2);		//返回 3 (2+1)
parseInt("17",8);		//返回 15 (8+7)
parseInt("1f",16);		//返回 31 (16+15)
parseInt("010");		//未定:返回 10 或 8

map 方法

对数组的每个元素调用定义的回调函数并返回包含结果的数组。

var new_array = arr.map(function callback(currentValue[, index[, array]]) {
// Return element for new_array
}[, thisArg])

查看mdn说明

示例
下面的示例阐释了 map 方法的用法。

// Define the callback function. 
function AreaOfCircle(radius) { 
    var area = Math.PI * (radius * radius); 
    return area.toFixed(0); 
} 
 
// Create an array. 
var radii = [10, 20, 30]; 
 
// Get the areas from the radii. 
var areas = radii.map(AreaOfCircle); 
 
document.write(areas); 
 
// Output: 
// 314,1257,2827

下面的示例阐释 thisArg 参数的用法,该参数指定对其引用this 关键字的对象。

// Define an object that contains a divisor property and 
// a remainder function. 
var obj = { 
    divisor: 10, 
    remainder: function (value) { 
        return value % this.divisor; 
    } 
} 
 
// Create an array. 
var numbers = [6, 12, 25, 30]; 
 
// Get the remainders. 
// The obj argument specifies the this value in the callback function. 
var result = numbers.map(obj.remainder, obj); 
document.write(result); 
 
// Output: 
// 6,2,5,0

在下面的示例中,内置 JavaScript 方法用作回调函数。

// Apply Math.sqrt(value) to each element in an array. 
var numbers = [9, 16]; 
var result = numbers.map(Math.sqrt); 
 
document.write(result); 
// Output: 3,4

map 方法可应用于字符串。 下面的示例阐释了这一点。

// Define the callback function. 
function threeChars(value, index, str) { 
    // Create a string that contains the previous, current, 
    // and next character. 
    return str.substring(index - 1, index + 2); 
} 
 
// Create a string. 
var word = "Thursday"; 
 
// Apply the map method to the string. 
// Each array element in the result contains a string that 
// has the previous, current, and next character. 
// The commented out statement shows an alternative syntax. 
var result = [].map.call(word, threeChars); 
// var result = Array.prototype.map.call(word, threeChars); 
 
document.write(result); 
 
// Output: 
// Th,Thu,hur,urs,rsd,sda,day,ay 

原文链接:https://blog.csdn.net/freshlover/article/details/19034079

你可能感兴趣的:(JavaScript,map,parseInt,JavaScript)