var array1 = [1, 4, 9, 16];
map1=array1.map(Function.call,Number);
为什么map1的输出是[0,1,2,3],这个map函数是干什么的?
最佳答案
Array.prototype.map
调用为数组的每个成员提供的函数,并返回一个由它们的返回值组成的新数组。
在这种情况下,提供的函数是 Function.call
.
Array.prototype.map
的第二个参数指定所提供的函数应该运行的上下文。
在这种情况下,上下文是 Number
.
Array.prototype.map
的简单实现可能类似于:
function map(callback, thisArg) {
const ret = []
for (let index = 0; index < this.length; index++) {
const value = this[index]
ret.push(callback.call(thisArg, value, index, this))
}
return ret
}
现在,这个特殊情况使用了很多间接寻址,所以不容易理解为什么传递 Function.call
和 Number
应该返回 [0, 1, 2, 3]
,让我们看一下那部分。
当回调
(Function.call
)在thisArg
(Number
)的上下文中调用时该代码将执行以下内容:
(Function.call).call((Number), (1), (0), ([1, 4, 9, 16]))
// ^-- callback ^-- value ^-- array
// ^-- thisArg ^-- index
评估 Function.call.call(...)
有点费脑筋,但它相当于在第一个参数,应该是一个函数。在我们的例子中,它是。这是 Number
函数。
然后我们可以将此语句简化为:
Number.call(1, 0, [1, 4, 9, 16])
Number
函数将第一个参数转换为数字。其他参数与函数上下文一起被忽略。这意味着整个表达式可以简化为:
Number(0)
0
是索引
。
这就是返回值为 [0, 1, 2, 3]
的原因,因为这些是原始数组的索引。
不用说,原始代码示例不应该在日常编程中使用。整个系统使用起来会更简单:
[1, 4, 9, 16].map((value, index) => index)
即便如此,也应该注意原始值被无用地丢弃了。此类代码示例仅在探索特定语言行为的学术意义上有用,或者当您想在编码挑战中故意混淆您的 friend 时。
关于javascript - 什么是 Array.map(Function.call,Number),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50478967/