JS 中为啥 [‘1‘, ‘7’,‘11’ ].map(parseInt) 返回 [1, NaN, 3]

在 JavaScript 中,truthy指的是在布尔值上下文中,转变后的值为真正值。全数值都以真值,除非它们被定义为 假值。

map是 Es6 中新出的八个数组方法,它是八个高阶函数,通过传播四个函数进行逻辑操作,并再次来到一个数组, 举个例子,以下代码将数组中的每一种元素乘以3:

例子:使用 parseInt

以下例子均再次回到15

1
2
3
4
5
6
7
8
parseInt("F", 16);
parseInt("17", 8);
parseInt("15", 10);
parseInt(15.99, 10);
parseInt("FXX123", 16);
parseInt("1111", 2);
parseInt("15*3", 10);
parseInt("12", 13);

 

以下例子均重临 NaN:

1
2
parseInt("Hello", 8); // Not a number at all
parseInt("546", 2);   // Digits are not valid for binary representations

 

 

以下例子均重回 -15:

1
2
3
4
5
6
7
8
9
parseInt("-F", 16);
parseInt("-0F", 16);
parseInt("-0XF", 16);
parseInt(-15.1, 10);
parseInt(" -17", 8);
parseInt(" -15", 10);
parseInt("-1111", 2);
parseInt("-15e1", 10);
parseInt("-12", 13);

 

下例中也整整赶回 17,因为输入的 string 参数以 "0x" 起头时作为十八进制数字表明,而第三个参数倘使经过 Number 函数调换后为 0 或 NaN,则将会忽略。

1
2
3
parseInt("0x11", 16);
parseInt("0x11", 0);
parseInt("0x11");

 

下边包车型客车例证再次来到 224

1
parseInt("0e0",16);

 

 

未有一点名 radix 参数时的八进制分析

即使 ECMAScript 3 已经区别情这种做法,且 ECMAScript 5 已经禁绝了这种做法,可是仍有许多达成情形照旧把以 0 初始的数值字符串(numeric string)解释为四个八进制数。下边包车型地铁例子也许回到八进制的结果,也说不佳回到十进制的结果。连接钦赐三个基数(radix)可防止止这种不可信赖的一坐一起。

1
2
parseInt("0e0"); // 0
parseInt("08"); // 0, '8' is not an octal digit.

 

ECMAScript 5 移除了八进制解析

ECMAScript 5 标准不再允许parseInt函数的完成遭受把以0字符早先的字符串作为八进制数值。ECMAScript 5 陈诉如下:

The parseInt function produces an integer value dictated by interpretation of the contents of the string argument according to the specified radix. Leading white space in string is ignored. If radix is undefined or 0, it is assumed to be 10 except when the number begins with the character pairs 0x or 0X, in which case a radix of 16 is assumed. If radix is 16, number may also optionally begin with the character pairs 0x or 0X.

那与ECMAScript 3判若鸿沟,ECMAScript 3仅仅是不提倡这种做法但并未禁止这种做法。

以致2011年,相当多得以完结碰着并从未选用新的正式所鲜明的做法, 而且由于必得同盟旧版的浏览器,所以千古都要简明给出radix参数的值.

基数,是八个进制系统下,能运用仅仅超越八个标志表示的数字的细微值,不一致的计数进制有例外的基数,所以,同多少个数字在不相同的计数体系下,表示的实在数据或然并分歧等,我们来看一下下边那张在十进制、二进制甚至十二进制分歧值在具体表示方法:

map()

四个更严酷的分析函数

有时候利用二个更严酷的点子来分析整型值很有用。那时候能够使用正则表明式:

1
2
3
4
5
6
7
8
9
10
11
12
13
filterInt = function (value) {
   if(/^(-|+)?([0-9]+|Infinity)$/.test(value))
       return Number(value);
   return NaN;
}
console.log(filterInt('421'));               // 421
console.log(filterInt('-421'));              // -421
console.log(filterInt('+421'));              // 421
console.log(filterInt('Infinity'));          // Infinity
console.log(filterInt('421e+0'));            // NaN
console.log(filterInt('421hop'));            // NaN
console.log(filterInt('hop1.61803398875'));  // NaN
console.log(filterInt('1.61803398875'));     // NaN

 

 


 好,看完上边的剧情超越十二分之第五小学同伙都以为了然了parseInt(卡塔尔(قطر‎,下边出风华正茂道考题考一下。

真钱捕鱼 1

 

 

What is the result of this expression? 

 

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

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

答案深入分析:

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

这道题的不错答案是[1,NaN,NaN],只要弄清楚数组的map方法传给回调函数parseInt的参数就超级轻易顿悟,map函数字传送递的两个参数,回调函数会动用前七个参数,第黄金时代项为某风度翩翩项因素,第二项为该因素下标索引。上述的表明式等价于

1
2
3
parseInt("1",0);//1,前面说过基数为0时的处理情况(请回头看)
parseInt("2",1);//NaN,在1进制里2不是有效数字,有效数字只有0
parseInt("3",2);//NaN,在二进制里3不是有效数字

 

 

故而你以为笔者是真的精通了parseInt(State of Qatar,看上边包车型大巴事例:

  1. console.log(parseInt(0.000001));
  2. console.log(parseInt(0.0000001));

之所以你以为输出会是如何啊:

            第一条语句输出 0, 第二条语句输出 1

精心的您有未有觉察此处传给parseInt的参数并非字符串而是贰个浮点数。

查看ECMA规范

真钱捕鱼 2

 

 标准中牵线了实行该函数的第一步是将参数转变到字符串,通过调用toString方法。

1
2
console.log(0.000001.toString());//0.000001
console.log(0.0000001.toString());//1e-7

 

对于小于 1e-6 的数值来讲,ToString 时会活动转变为科学计数法。以后你领悟地点结果是什么发生的了!


2016年6月19日续

真钱捕鱼 3

 

 

 

 兵贵神速,大家再看一个事例:

1
parseInt("010");

 

日前提到过ES5收回了八进制自动解析,全数其结果凭借浏览器版本会有分别:标准浏览器中(暗中同意帮助ES5卡塔尔(قطر‎,输出10,IE8和IE8以下是出口8;

上面大家不传播字符串而是传入8进制字面量

 

1
parseInt(010);//8

 

前方大家理解参数首先要调用toString(卡塔尔(قطر‎方法.

1
console.log(010.toString());//8

 

因而在装有的浏览器中上式都以8.

针对八进制的拆解解析小结:非严俊格局的下:
1.在IE9可能IE9以上还会有其余专门的学问浏览器中,假如参数是字符,并不会对其开展八进制转变,如若参数是八进制字面量,从最后结出看是信守八进制方式开展了改动。
2.在IE8和IE8以下浏览器中,无论传入的是字符串如故八进制字面量,都会据守八进制情势开展变换。

最近大家看下朝气蓬勃严苛情势下的情况:

1.假使参数是字符,严峻形式下和非严苛格局下是同等的,都以遵照相应的ES版本分析。

2.万一参数是八进制字面量

 

1
2
"use strict"
console.log(parseInt(010));//IE9及以下不支持严格模式,解析为8,IE10及以上解析会出错:strict 模式下不允许使用八进制数字参数和转义字符

 

 

 

源头为知笔记(Wiz卡塔尔

详情:_Objects/parseInt

parseInt(numStr));" title="" data-original-title="复制">

真钱捕鱼 4

0 1 2 3 4 5 6 7 8 910

展开调整台并运营上述代码,会打字与印刷Condition is truthy,表达条件"hello world"为真(true)值。

骨子里你连那一个功底都没理解

['1', '7', '11'].map(parseInt卡塔尔国的结果是[1, NaN, 3]的原由是因为,map(卡塔尔国方法是向传递给他的函数中传送七个参数,分别为近些日子值,当前目录以至整个数组,而parseInt函数选拔五个参数:必要转移的字符串,以致进制基数,所以,整个讲话能够编写:['1', '7', '11'].map((value, index, array卡塔尔 = parseInt(value, index, array卡塔尔国卡塔尔,array被parseInt放弃之后,获得的结果个别是:parseInt('1', 0卡塔尔国、parseInt('7', 1卡塔尔(قطر‎以致parseInt('11', 2State of Qatar,也正是上边看见的[1, NaN, 3]。

Javascript 一向是神奇的言语。 不相信赖笔者? 尝试利用map和parseInt将字符串数组调换为整数。张开 Chrome 的调整台(F12State of Qatar,粘贴以下内容,然后按回车,查看输出结果:

概述

parseInt(string, radix卡塔尔国将三个字符串string调换为radix进制的平头,radix为介于2-36中间的数。

原文:

以下节选自[parseInt

if (true) { // 这里将启动都会被执行} else { // 这里永远都不会被执行}

真值(truthy) 虚值(falsy)

  • JavaScript | MDN]()
function multiplyBy3 (number) { return number * 3;}const result = [1, 2, 3, 4, 5].map(multiplyBy3);console.log(result); // 输出:[3, 6, 9, 12, 15]

你恐怕早就注意到,在我们的演示中,当输入为11时,parseInt重临3,那对应于上表中的二进制列。

语法

1
parseInt(string, radix);

 

function sum(a, b) { console.log(a); console.log(b);}sum(1, 2); // 输出:1, 2sum(1); // 输出:1, undefinedsum(1, 2, 3); // 输出:1, 2

在数学上,基数是集结论中描写自便集结大小的一个定义。多少个能够成立成分间蓬蓬勃勃意气风发对应的聚合称为相互对等集结。比如3个人的晤面和3匹马的集聚能够创立梯次对应,是四个对等的集聚。

 

基于前面包车型客车学识,大家应该领会,parseInt(value, index, array卡塔尔(قطر‎中的array会被忽略

看上表,能够看见相通的数字11在分化的计数系统中得以表示分化的数字。就算基数是2,那么它意味着数字为3。如若基数是16,那么它指的是数字17。


if ("hello world") { // 这里会被执行吗? console.log("条件判断为真");} else { // 或者会执行这里吗? console.log("条件判断为假");}
十进制 二进制 十六进制RADIX=10 RADIX=2 RADIX=160 0 01 1 12 10 23 11 34 100 45 101 56 110 67 111 78 1000 89 1001 910 1010 A11 1011 B12 1100 C13 1101 D14 1110 E15 1111 F16 10000 1017 10001 11

 

您应该早已注意到了,11在上表中,总共现身了一次。

 // 第二次迭代: val = '7', index = 1, array = ['1', '7', '11']parseInt('7', 1, ['1', '7', '11']); = NaN

 

当今,让大家一步一步来看[真钱捕鱼 ,'1', '7', '11'].map(parseIntState of Qatar的漫天实践进程,首先,大家能够将这意气风发行代码,转变为完全的本子:

原因

 

parseInt('11'); // 输出:11parseInt('11', 2); // 输出:3parseInt('11', 16); // 输出:17parseInt('11', undefined); // 输出:11 parseInt('11', 0); // 输出:11 

基数是纤维的数字,只好由多少个暗号表示。 不一致的计数系统有着分歧的基数,因而,相像的数字在分歧的计数系统中得以表示分歧的数字。

参数

string
要被深入分析的值。假如参数不是一个字符串,则将其改换为字符串。字符串发轫的空白符将会被忽视。

radix
叁个2到36之内的卡尺头值,用于钦定转换中使用的基数。例如参数"10"表示使用大家经常接受的十进制数值系统。三回九转内定该参数可以去掉阅读该代码时的吸引并且保障转变结果可预测。当忽略该参数时,不一致的贯彻碰到也许产生不一样的结果。

此地还应该有一条供给介意的是,即便我们日常都以采纳parseInt('11'卡塔尔那样的调用格局,以为是将11按十进制转变到数字,可是,请在运用的时候,长久都增多radix参数,因为,radix为10并不保障永恒有效。

翻译来自:

第豆蔻梢头,请允许作者抄袭意气风发段你精晓的parseInt

map(卡塔尔国是一个设有于数组原型链上的章程,它将其数组实例中的每一个因素,传递给它的率先个参数,然后将每叁个重返值都保留到同多个新的数组中,遍历完全数因素之后,将新的隐含了具有结果的数组再次回到。

ParseInt有五个参数:string和radix。 即使提供的基数是虚值,则暗中认可情形下,基数设置为10。

 真钱捕鱼 5

十进制

为此 map 回调方法中会传入多个参数,分别是 当前遍历的项,当前目录,及遍历的整整数组。

示例

真值与假值

function multiplyBy3(x) { return x * 3;}const result = [1, 2, 3, 4, 5].map(multiplyBy3);console.log(result); // logs [3, 6, 9, 12, 15];

parseInt(State of Qatar 函数将加以的字符串以钦赐基数(radix/base)解析成为整数。

引用自:Mozilla Developer: Truthy

因为0是虚值,基数设置为暗中认可值10。parseInt(State of Qatar只采纳三个参数,由此忽略了第多少个参数['1'、'7'、'11']。以10为基数的字符串“1”表示数字1。

描述

parseInt 一流函数,没有与别的对象关联。

parseInt 函数将首先个参数(字符串)深入分析并试图重返八个整数依然NaN(Not a Number)。即使结果不是NaN,那么重回值是把第一个参数作为是radix参数钦赐的进制下的数,然后把它调换来十进制的子弹头。比方:radix参数为10 将会把第二个参数作为是八个数的十进制表示,8 对应八进制,16 对应十二进制,等等。基数大于 10 时,用字母表中的字母来代表大于 9 的数字。举例十一进制中,使用 A 到 F。

若是 parseInt 蒙受了不归属radix参数所钦点的基数中的字符那么该字符和之后的字符都将被忽视。接着再次回到已经拆解剖析的冬菇尾部分。parseInt 将截取整数局地。起头和末段的空白符允许存在,会被忽视。

在并未有一点名基数,或然基数为 0 的情况下,JavaScript 作如下管理:

  • 风流浪漫经字符串 string 以"0x"也许"0X"以前, 则基数是16 (16进制卡塔尔国.
  • 设若字符串 string 以"0"开首, 基数是8(八进制)恐怕10(十进制),那么具体是哪位基数由达成境遇调控。ECMAScript 5 规定接受10,然则并非持有的浏览器都依据那么些规定。由此,千古都要分明给出radix参数的值
  • 意气风发旦字符串 string 以任何任何值起头,则基数是10 (十进制卡塔尔国。

假使第一个字符无法被转变来数字,parseInt再次来到NaN。

算术上,NaN 不是别的八个进制下的数。你能够调用isNaN来判别parseInt 是不是重返 NaN。NaN 插足的数学运算其结果总是 NaN。

将整型数值以特定基数转变来它的字符串值可以动用 intValue.toString(radix卡塔尔国.

返回列表