array.fill()和array.apply()之间有什么区别

时间:2018-03-15 09:50:53

标签: javascript arrays

Array.fill()

Array(10).fill(0);

Array.Apply()

Array.apply(0, new Array(10));

两者的做法同样相似。那么它们之间有什么区别,哪个最适合性能?

我得到了很多回答。但

更新

Array.fill()

console.log(Array(10).fill(undefined));

Array.Apply()

console.log(Array.apply(undefined, new Array(10)));

  

现在两者的做法同样相似。那么它们之间有什么区别,哪个最适合性能?

2 个答案:

答案 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执行就像尾递归方法一样。相反,填充是迭代的。