Array(10).fill(0);
Array.apply(0, new Array(10));
两者的做法同样相似。那么它们之间有什么区别,哪个最适合性能?
我得到了很多回答。但
Array.fill()
console.log(Array(10).fill(undefined));
Array.Apply()
console.log(Array.apply(undefined, new Array(10)));
现在两者的做法同样相似。那么它们之间有什么区别,哪个最适合性能?
答案 0 :(得分:5)
两者的做法同样相似。
不,他们不是。第一个用值0
填充数组。第二个用undefined
填充它。请注意,您在第二个示例中传递的0
完全被忽略; Function#apply
的第一个参数设置了this
在调用期间的内容,Array
with multiple arguments根本不使用this
,因此您可以在那里传递任何内容。
示例:
var first = Array(10).fill(0);
console.log(first);
var second = Array.apply(0, new Array(10));
console.log(second);
.as-console-wrapper {
max-height: 100% !important;
}
那么它们之间的区别是什么......
见上文。 :-)另外,请参阅下面关于后续问题的说明。
主观上:Array.fill
更清楚(对我而言)。 : - )
......哪一个最适合表现?
这无关紧要。使用那个你需要做的事情。
在后续行动中,您已经问过
之间的区别Array(10).fill(undefined)
和
Array.apply(undefined, new Array(10))
它们的最终结果是相同的:具有值为undefined
的条目的数组。 (条目确实在那里,例如.hasOwnProperty(0)
将返回true
。与new Array(10)
相反,它创建了一个稀疏数组length == 10
,其中没有条目。 )
就性能而言,重要性极低。要么足够快,要么足够快。写出最清晰且适用于目标环境的内容(ES2015中添加了Array.fill
,因此在较旧的环境中不存在,尽管它可以轻松地进行多边形填充)。如果您真的担心性能上的差异,请双向编写实际代码并对其进行分析。
最后:据我所知,对Array.fill
可以使用的数组大小没有特别的限制,但Function#apply
受函数调用的最大参数个数和JavaScript平台中的最大堆栈大小(可能大或小;规范没有设置要求)。有关限制的详情,请参阅MDN page,但例如{8}在V8(Chrome,Chromium和Node.js中的引擎)上失败并显示“超出最大调用堆栈大小”错误。
答案 1 :(得分:1)
我做了一个测试:
const calculateApply = function(items){
console.time('calculateApply');
Array.apply(undefined, new Array(items));
console.timeEnd('calculateApply');
}
const calculateFill = function(items){
console.time('calculateFill');
Array(items).fill(undefined);
console.timeEnd('calculateFill');
}
const getTime = function(items){
console.log(`for ${items} items the time of fill is: `)
calculateFill(items)
console.log(`for ${items} items the time of apply is:`)
calculateApply(items)
}
getTime(10)
getTime(100000)
getTime(100000000)
以下是结果:
for 10 items the time of fill is:
calculateFill: 0.481ms
for 10 items the time of apply is:
calculateApply: 0.016ms
for 100000 items the time of fill is:
calculateFill: 2.905ms
for 100000 items the time of apply is:
calculateApply: 1.942ms
for 100000000 items the time of fill is:
calculateFill: 6157.238ms
for 100000000 items the time of apply is:
/Users/n128852/Projects/pruebas/index.js:3
Array.apply(0, new Array(items));
^
RangeError: Maximum call stack size exceeded
https://www.ecma-international.org/ecma-262/6.0/#sec-function.prototype.apply
https://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.fill
在这里,您可以获得信息,就像您可以阅读的那样,应用函数准备params执行就像尾递归方法一样。相反,填充是迭代的。