.map(Number)所展开的

.map(Number)

字符数组转数字数组

1
['1','2','3'].map(Number)

上述代码等价于:

1
['1','2','3'].map((value, index, array) => Number(value, index, array))

尽管传递了额外的参数,但是Number忽略了除第一个参数之外的所有内容。

String与Boolean也是如此:

1
2
3
4
5
[1,2,3].map(String)
> ["1", "2", "3"]

['1','2','3'].map(Boolean)
> [true, true, true]

.map(Number.call, Number)

1
2
let array = Array.apply(null, {length: 10}).map(Number.call, Number)
> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

1. Array.apply(null, {length: 10})

Array.apply(null, {length: 10})创建了一个长度为10的数组。

func.apply(thisArg, [argsArray])

apply()方法接收两个参数,第一个为调用时指定的上下文(context),第二个为一个数组或者一个类数组对象。

{length: 10}是一个类数组对象,长度为10,每个元素值是undefined

所以Array.apply(null, {length: 10})等价于Array(undefined, undefined, ...)

2. .map(Number.call, Number)

Array.prototype.map(callback, thisArg)

Array.prototype.map第一个参数是回调函数,第二个参数是回调函数的this值。

.map(Number.call, Number)等价于:

1
2
3
.map((value, index, array) => {
return Number.call(value, index, array)
}, Number)

第一个参数value被当做this

1
2
3
.map((value, index, array) => {
return Number.call(Number, index, array)
})

最后得到:

1
.map((value, index) => Number(index))

.map(parseInt)

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

上述代码等价于

1
2
3
['1','2','3'].map((item, index)=> { 
return parseInt(item, index)
})

进一步:

1
[parseInt('1', 0), parseInt('2', 1), parseInt('3', 2)]

parseInt文档:mdn parseInt

parseInt(string, radix);

radix,一个介于2和36之间的整数

在基数为 undefined,或者基数为 0 或者没有指定的情况下,JavaScript 作如下处理:

  • 如果字符串 string 以”0x”或者”0X”开头, 则基数是16 (16进制).
  • 如果字符串 string 以”0”开头, 基数是8(八进制)或者10(十进制),那么具体是哪个基数由实现环境决定。ECMAScript 5 规定使用10,但是并不是所有的浏览器都遵循这个规定。因此,永远都要明确给出radix参数的值。
    如果字符串 string 以其它任何值开头,则基数是10 (十进制)。
  • 如果第一个字符不能被转换成数字,parseInt返回NaN。

parseInt('1', 0),相当于parseInt('1', 10),值为1;

parseInt('2', 1),基数1不合理,经测试值为NaN

parseInt('3', 2),基数2合理,但是3不是二进制,值为NaN

所以结果为[1, NaN, NaN]