记一次js的坑

题目:
把一个['1', '2', '3']的数组转换成[1,2,3]

很天然的, 我们会这么写:


['1','2', '3'].map(parseInt);

但这却得不到我们想要的效果, 会变成

[1, NaN, NaN]

但假如我们给parseInt这个函数包一下,


['1','2', '3'].map(function(n){ return parseInt(n)});

获得的倒是准确的效果。

下面就是要讲一下为何?

事实上, 第一种写法, 放了2个毛病:

  • 在js中, map实际上挪用的函数是一个多参数函数, 即function(value, index, array), 更细致的申明是MDN的申明:
    > callback is invoked with three arguments: the value of the element, the index of the element, and the Array object being traversed.

也就是说, 第一种写法实际上是如许的:


['1','2','3'].map(function(value,index,array){ return parseInt(value, index, arrary); });

然后这里涉及到第二个毛病了。

  • parseInt也是一个多参数函数;详细定义是parseInt(string, radix);, radix就是进制, MSD还强调Always specify this parameter to eliminate reader confusion and to guarantee predictable behavior.

依据上面睁开的函数, 在对’1’实行的是parseInt('1', 0);, 这里要注意, js中会把过剩的参数给疏忽了~

但radix参数是零的时刻, 他会依据第一个string来做推断, 这里是当十进制了。 所以实行胜利。

接下的’2’一定就错啦, radix不能是1进制。

parseInt('3', 2);为何错, 不是有2进制么? 你见过2进制中有3的么。。。

所以, 第一种写法效果是相符js的预期的, 虽然他不相符我们的预期。

    原文作者:Yang_Zhang
    原文地址: https://segmentfault.com/a/1190000000517086
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞