在 javascript 中 ["1","2","3"].map(parseInt) 为何返回不是 [1,2,3] 却是 [1,NaN,NaN]

我们首先回顾一下 parseInt() 个 map() 两个函数的用法:

parseInt() 函数

定义和用法

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

语法

parseInt(string, radix)
参数 描述
string 必需。要被解析的字符串。
radix

可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。

如果省略该参数或其值为 ‘0‘,则数字将以 10 为基础来解析。如果它以 ‘”0x”‘ 或 ‘”0X”‘ 开头,将以 16 为基数。

如果该参数小于 2 或者大于 36,则 ‘parseInt()‘ 将返回 ‘NaN‘。

返回值

返回解析后的数字。

说明

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

举例:

  1. 如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。

  2. 如果 string 以 0 开头,那么
    ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。

  3. 如果 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 方法

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

array1.map(callbackfn[, thisArg])
参数 定义
array1 必需。一个数组对象。
callbackfn 必需。一个接受**最多**三个参数的函数。对于数组中的每个元素,‘map‘ 方法都会调用 ‘callbackfn‘ 函数一次。
thisArg 可选。可在 ‘callbackfn‘ 函数中为其引用 ‘this‘ 关键字的对象。如果省略 ‘thisArg‘,则 ‘undefined‘ 将用作 ‘this‘ 值。

返回值

其中的每个元素均为关联的原始数组元素的回调函数返回值的新数组。

异常

如果 callbackfn 参数不是函数对象,则将引发 TypeError 异常。

备注

对于数组中的每个元素,map 方法都会调用 callbackfn 函数一次(采用升序索引顺序)。
不为数组中缺少的元素调用该回调函数。

除了数组对象之外,map 方法可由具有 length 属性且具有已按数字编制索引的属性名的任何对象使用。

回调函数语法

回调函数的语法如下所示:

function callbackfn(value, index, array1)

可使用最多三个参数来声明回调函数。

下表列出了回调函数参数。

回调参数 定义
value 数组元素的值。
index 数组元素的数字索引。
array1 包含该元素的数组对象。

修改数组对象

数组对象可由回调函数修改。

下表描述了在 map 方法启动后修改数组对象所获得的结果。

‘map‘ 方法启动后的条件 元素是否传递给回调函数
在数组的原始长度之外添加元素。 否。
添加元素以填充数组中缺少的元素。 是,如果该索引尚未传递给回调函数。
元素被更改。 是,如果该元素尚未传递给回调函数。
从数组中删除元素。 否,除非该元素已传递给回调函数。

示例

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

// 定义回调函数
// 计算圆的面积
function AreaOfCircle(radius) {
var area = Math.PI * (radius * radius);
return area.toFixed(0);
} // 定义一个数组,保护三个元素
var radii = [10, 20, 30]; // 计算 radii 的面积.
var areas = radii.map(AreaOfCircle); document.write(areas); // 输出:
// 314,1257,2827

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

// 定义一个对象 object,保护 divisor 属性和 remainder 方法
// remainder 函数求每个传入的值的个位数。(即除以 10 取余数)
var obj = {
divisor: 10,
remainder: function (value) {
return value % this.divisor;
}
} // 定义一个包含 4 个元素的数组
var numbers = [6, 12, 25, 30]; // 对 numbers 数组的每个元素调用 obj 对象的 remainder 函数。
// map 函数的第 2 个参数传入 ogj。
var result = numbers.map(obj.remainder, obj);
document.write(result); // 输出:
// 6,2,5,0

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

// 对数组中的每个元素调用 Math.sqrt(value) (求平方根)
var numbers = [9, 16];
var result = numbers.map(Math.sqrt); document.write(result);
// 输出: 3,4

[9,16].map(Math.sqrt) 回调函数,输出的结果是 [3,4]
但是为什么 ["1","2","3"].map(parseInt) 却返回 [1,NaN,NaN]

网站给出的提示是:

what you actually get is [1,NaN,NaN] because parseInt takes
two parameters (val,
radix)
 and map passes
(element,
index, array)

简单翻译一下就是

parseInt 需要
2 个参数 (val,
radix)
, 而 map 传递了
3 个参数 (element,
index, array)
」。


通过上面的解释,我们可以看出,如果想让 parseInt(string,
radix)
 返回 NaN,有两种情况:

  1. 第一个参数不能转换成数字。

  2. 第二个参数不在 2 到 36 之间。

我们传入的参数都能转换成数字,所以只能是第二种可能。

到底是不是呢?我们重新定义 parseInt(string,
radix)
 函数:

var parseInt = function(string, radix) {
return string + "-" + radix;
}; ["1", "2", "3"].map(parseInt);

输出结果为:

["1-0", "2-1", "3-2"]

看见,map 函数将数组的值 value 传递给了 parseInt 的第一个参数,将数组的索引传递给了第二个参数。
第三个参数呢?我们再加一个参数

var parseInt = function(string, radix, obj) {
return string + "-" + radix + "-" + obj;
}; ["1", "2", "3"].map(parseInt);

输出结果:

["1-0-1,2,3", "2-1-1,2,3", "3-2-1,2,3"]

我们再继续增加参数:

var parseInt = function(string, radix, obj, other) {
return string + "-" + radix + "-" + obj + "-" + other;
}; ["1", "2", "3"].map(parseInt);

输出结果:

["1-0-1,2,3-undefined", "2-1-1,2,3-undefined", "3-2-1,2,3-undefined"]

第四个参数为 undefined,看见 map 确实为 parseInt 传递了三个参数。就像作者写道的:

(element, index, array)
  1. 数组的值

  2. 数组的索引

  3. 数组

(全文完)

为什么 ["1", "2", "3"].map(parseInt) 返回 [1,NaN,NaN]?的更多相关文章

  1. ["1", "2", "3"].map(parseInt)`返回的结果是[1,2,3]?

    今天刷到一道面试题,["1", "2", "3"].map(parseInt)返回的结果是什么呢?可能大家第一个想到的是 [1,2,3],但 ...

  2. ['1','2','3'].map(parseInt) 返回的是什么?

    返回的是:[1,NaN,NaN] 首先我们先分析一下  parseInt  函数: parseInt()函数解析一个字符串参数,并返回指定基数的整数(数学系统中的基数). 它可以有两个参数,用法:pa ...

  3. 解惑 ["1", "2", "3"].map(parseInt) 为何返回[1,NaN,NaN]

    javascript中的parseInt与map函数都是常用的函数,可是 ["1", "2", "3"].map(parseInt) 为何返 ...

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

    转载自:http://blog.csdn.net/freshlover/article/details/19034079 这涉及到是否深入理解两个函数的格式与参数含义. 首先根据我对两个函数用法的了解 ...

  5. 通过 ['1', '2', '3'].map(parseInt) 学习 map 和 parseInt 函数

    看到一道笔试题: ['1', '2', '3'].map(parseInt) 这道题目中涉及到 map 和 parseInt 函数的运用,如果对这两个函数的理解不充分的话,是很难思考出正确的结果的. ...

  6. map.(parseInt)方法详解

    偶然间碰到这样一个问题: ["1","2", "3"].map(parseInt) //[ 1, NaN, NaN ] 运行结果 [ 1, ...

  7. ["1", "2", "3"].map(parseInt)?

    ["1", "2", "3"].map(parseInt)得到什么? 答案是:[1, NaN, NaN]. 原因:parseInt接收的是两 ...

  8. JavaScript:['1','2','3'].map(parseInt)问题解析

    最近碰到了['1','2','3'].map(parseInt)这种看似不起眼陷阱却极大的问题. 这乍一看,感觉应该会输出[1,2,3].但是,实际上并不是我们想的这样.你可以现在打开console, ...

  9. ["1", "2", "3"].map(parseInt) 结果

    // 下面的语句返回什么呢: ["1", "2", "3"].map(parseInt); // 你可能觉的会是[1, 2, 3] // 但 ...

随机推荐

  1. php设置http请求头信息和响应头信息

    php设置http请求头信息和响应头信息 设置请求服务器的头信息可以用fsockopen,curl组件,header函数只能用来设置客户端响应的头信息,不能设置服务器的头信息. 例子;  一.head ...

  2. JS截取字符串 charAt(),slice(),substring(),substr()

    1. charAt(i)输出指定下标的字母,长度为1,适用于把字符串切割成单个字符串. 2. slice() 和 substring() 都支持1-2个参数,第一个参数是开始位置,第二个参数是结束位置 ...

  3. menuconfig_kconfig

    这一节的主要内容: Menuconfig的操作 Kconfig和.config文件 Linux内核配置裁剪实验 linux编译器通过.config文件确认哪些代码编译进内核,哪些被裁减掉 menuco ...

  4. .net core 修改网站启动端口

    原文:.net core 修改网站启动端口 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yenange/article/details/81675 ...

  5. 将Maven的Java Project转换或修改为Web Project

    将Maven的Java  Project转换为Web Project关键是需要了解Eclipse和MyEclipse的工程中如下文件.classpath..project. .mymetadata和s ...

  6. 洛谷 P2368 EXCEEDED WARNING B

    P2368 EXCEEDED WARNING B 题目背景 SGU 107 题目描述 求有多少个平方后末尾为987654321的n位数 输入输出格式 输入格式: 整数n 输出格式: 答案,即[b]“平 ...

  7. oled stm32的spi

    其实各种协议是很重要的,这篇文章就当做我对spi协议的一个整理吧. 必要的spi简介: https://www.cnblogs.com/zengsf/p/7221207.html?utm_source ...

  8. 逻辑与和逻辑或:&& 、||

    逻辑或:首先看左边是真还是假(除了那5个都是真),如果为真,返回左边值,如果为假,返回右边的值 逻辑与:和逻辑或相同,先看左边的值是真是假,如果左边为真返回右边的值,左边为假返回左边的值 在两者同时出 ...

  9. PythonNET网络编程1

    # PythonNET 网络编程 ISO(国际标准化组织) 制定了 OSI(Open System Interconnectio),意为开放式系统互联.国际标准化组织(ISO)制定了OSI模型,该模型 ...

  10. Storm新特性之Flux

    Storm新特性之Flux Flux是Storm版本号0.10.0中的新组件,主要目的是为了方便拓扑的开发与部署.原先在开发Storm拓扑的时候整个拓扑的结构都是硬编码写在代码中的,当要对其进行改动时 ...