JavaScript 1.6 Array.map()和Array.filter()不使用内置函数作为参数

buc*_*bay 8 javascript arrays

这很好用:

["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)

对于第一个电话,baseindex 0.这没关系,因为ECMAScript定义base=0了与省略参数相同,因此允许十进制,八进制或十六进制(在这种情况下使用十进制).

对于第二和第三项,base12.它尝试将数字解析为base-1(不存在)或base-2(binary).由于字符串中的第一个数字是这些基数中不存在的数字,因此您得到一个数字NaN.

一般来说,parseInt没有基础是非常值得怀疑的,所以你可能想要:

["655971", "2343", "343"].map(function(x) { return parseInt(x, 10) })
Run Code Online (Sandbox Code Playgroud)

  • `.map(function(x){return + x;}`.您也可以使用`Number`作为简单的`.map(Number)`,因为`Number`函数不需要任何额外的参数`parseInt`确实.但是假设ECMAScript永远不会添加任何可选参数(这是一个安全的假设吗?嗯).顺便说一下,`Number`和`+`都会接受一个十六进制字符串(但不,谢天谢地,意外的八进制) . (2认同)

CMS*_*CMS 5

问题是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.