这很好用:
["655971", "2343", "343"].map(function(x) { return parseInt(x) }) // [655971, 2343, 343]
Run Code Online (Sandbox Code Playgroud)
但这并不是:
["655971", "2343", "343"].map(parseInt) // [655971, NaN, NaN]
Run Code Online (Sandbox Code Playgroud)
Array.filter()也是如此
我在这里错过了什么?
bob*_*nce 22
这是因为map
将更多参数传递给回调函数而不仅仅是数组项.你得到:
callback(item, index, array)
Run Code Online (Sandbox Code Playgroud)
通常你的函数会忽略它不需要的参数.但parseInt
接受可选的第二个参数:
parseInt(string, base)
Run Code Online (Sandbox Code Playgroud)
对于第一个电话,base
是index
0
.这没关系,因为ECMAScript定义base=0
了与省略参数相同,因此允许十进制,八进制或十六进制(在这种情况下使用十进制).
对于第二和第三项,base
是1
或2
.它尝试将数字解析为base-1(不存在)或base-2(binary).由于字符串中的第一个数字是这些基数中不存在的数字,因此您得到一个数字NaN
.
一般来说,parseInt
没有基础是非常值得怀疑的,所以你可能想要:
["655971", "2343", "343"].map(function(x) { return parseInt(x, 10) })
Run Code Online (Sandbox Code Playgroud)
问题是map
期望回调应该是一个接受三个参数的函数,callbackfn(value, index, array)
.
第二个参数与函数的radix
参数冲突parseInt(string, radix)
.
映射为每个元素调用parseInt:
parseInt("655971",0); // 655971
parseInt("2343", 1); // NaN
parseInt("343", 2); // NaN
Run Code Online (Sandbox Code Playgroud)
第一个是有效的,因为如果radix未定义或为0,则假定为10.