题目:
把一个['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的预期的, 虽然他不相符我们的预期。