我试图理解这段代码。CCD_ 1。问题是,这种行为很难理解,因为没有办法看到数字的实现。如果你尝试.toString Number,它只会说"本地代码";。对内置函数使用绑定和调用也是如此。我怎么能知道这应该是怎么回事?
如果您想详细了解Number
是如何工作的,请查看其ECMAScript规范。
如果您想了解Number
的一般工作原理,请查看其MDN文档。
基本上,Number(value)
所做的就是将value
转换为数字类型。没有别的。
我相信,要理解这段代码,您需要了解的实际上是关于Function.prototype.call
而不是Number
。
当我们把上面的代码翻译成一个不那么花哨的代码时,我们得到的大致如下(这对下面的解释很重要(:
console.log(
Array(8).fill(0).map(Function.prototype.call, Number)
);
现在,在.map
中,它接收两个参数:
- 回调,有3个参数:
currentValue
、Array(8).fill(0).map(Number.call, Number)
0、originalArray
- 自定义
this
值
因此,上面的代码所做的是传递Number.call
作为回调,并传递Number
作为自定义此值。
如果您理解.call
方法,您就会知道它必须至少接收1个参数:
this
值- 。。。参数n
了解了所有这些,我们现在可以将上面的代码翻译成更不花哨的代码:
console.log(
Array(8).fill(0).map(function(currentValue, currentIndex, originalArray){
return this.call(currentValue, currentIndex);
}, Number)
);
这也可以翻译成更不花哨的:
console.log(
// Making `currentValue` into `_` because its existence does not matter in this case
Array(8).fill(0).map(function(_, currentIndex){
return Number.call(_, currentIndex);
})
);
现在,最后的翻译,这是最容易理解的一个:
console.log(
Array(8).fill(0).map((_, i) => Number(i))
);