首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在为数组的索引赋值之前声明数组的长度是否更有效?

在为数组的索引赋值之前声明数组的长度是否更有效?
EN

Stack Overflow用户
提问于 2018-12-20 06:53:04
回答 1查看 90关注 0票数 5

在赋值之前设置数组的长度有什么好处吗?

例如,

代码语言:javascript
复制
let arr = [];
arr.length = 10;
arr[0] = 'a'; // arr.length === 10
...
arr[9] = 'i'; // arr.length === 10

甚至是

代码语言:javascript
复制
let arr = new Array(10);
arr[0] = 'a'; // arr.length === 10
...
arr[9] = 'i'; // arr.length === 10

对比

代码语言:javascript
复制
let arr = [];
arr[0] = 'a'; // arr.length === 1
arr[1] = 'b'; // arr.length === 2
...
arr[9] = 'i'; // arr.length === 10
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-20 07:01:30

至少在V8中,new Array(length)的速度似乎比替代品快得多,至少有一个数量级。包括push方法只是为了好玩:

(警告:运行以下代码会阻塞浏览器一段时间)

代码语言:javascript
复制
const t0 = performance.now();
for (let i = 0; i < 2e6; i++) {
  const arr = [];
  arr.length = 7;
  arr[0] = 'a';
  arr[1] = 'b';
  arr[2] = 'c'
  arr[3] = 'd'
  arr[4] = 'e'
  arr[5] = 'f';
  arr[6] = 'g';
}
const t1 = performance.now();
for (let i = 0; i < 2e6; i++) {
  const arr = new Array(7);
  arr[0] = 'a';
  arr[1] = 'b';
  arr[2] = 'c'
  arr[3] = 'd'
  arr[4] = 'e'
  arr[5] = 'f';
  arr[6] = 'g';
}
const t2 = performance.now();
for (let i = 0; i < 2e6; i++) {
  const arr = [];
  arr[0] = 'a';
  arr[1] = 'b';
  arr[2] = 'c'
  arr[3] = 'd'
  arr[4] = 'e'
  arr[5] = 'f';
  arr[6] = 'g';
}
const t3 = performance.now();
for (let i = 0; i < 2e6; i++) {
  const arr = [];
  arr.push('a');
  arr.push('b');
  arr.push('c');
  arr.push('d');
  arr.push('e');
  arr.push('f');
  arr.push('g');
}
const t4 = performance.now();

console.log('arr.length = length', t1 - t0);
console.log('new Array(length)', t2 - t1);
console.log('arr = [] only', t3 - t2);
console.log('push only', t4 - t3);

在火狐上,两者之间的差别不那么显著,但它仍然存在-- new Array(length)的速度似乎是其他可能性的两倍。你可能会认为

代码语言:javascript
复制
const arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];

效率会更高,在FF中是这样的(再增加几个数量级),但它似乎与new Array(length) in V8中的大致相同:

代码语言:javascript
复制
const t0 = performance.now();
for (let i = 0; i < 2e8; i++) {
  const arr = new Array(7);
  arr[0] = 'a';
  arr[1] = 'b';
  arr[2] = 'c'
  arr[3] = 'd'
  arr[4] = 'e'
  arr[5] = 'f';
  arr[6] = 'g';
}
const t1 = performance.now();
for (let i = 0; i < 2e8; i++) {
  const arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
}
const t2 = performance.now();

console.log('new Array(length)', t1 - t0);
console.log(`arr = ['a', 'b', ...]`, t2 - t1);

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53863753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档