JavaScript数组如何通过索引获取元素

3

我试图理解JavaScript数组中获取索引项的工作原理。

例如,假设我有一个for循环遍历具有成千上万(或数百万)项的数组。哪种方法(性能最佳)可以打印出这些项呢?

// Option 1
for (int i = 0; i < array.length; i++) {
    var data = array[i];
    console.log( data.ID, data.name, data.date, data.description );
}

// Option 2
for (int i = 0; i < array.length; i++) {
    console.log( array[i].ID, array[i].name, array[i].date, array[i].description );
}

是选项1还是选项2?使用第一个选项或第二个选项是否是同一件事情?或者有更好的方法来做这件事吗?

例如,我知道在Java ArrayList中get()的工作方式是这样的,因此最好的方法显然是选项1,因为每次调用get()方法时都会检查范围。

public E get(int index) {
    rangeCheck(index);

    return elementData(index);
}

private void rangeCheck(int index) {
    if (index >= size)
        throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

JavaScript是否以类似的方式工作?

这里的“大问题”实际上是JavaScript数组如何按索引获取元素

注意:我已经尝试搜索获取数组中元素的最佳方法,但我只能找到迭代数组的最佳方法。 这不是我想从这个问题中得到的东西!


这取决于你所说的“print”的含义。如果它指的是console.log,那么最好的方法是将console.log应用于整个数组:console.log(array),或者 console.log(JSON.stringify(array)) - hindmost
1
由于有几个引擎可以执行JS,所以你的问题无法完全回答。答案是这完全不相关。然而,在现实世界的情况下,哪个更好 - 为什么不自己测量一下呢?只需选择3个最受欢迎的浏览器并分析哪个执行速度最快即可。我认为你甚至不应该浪费时间在这种优化上,这完全没有意义。 - Mjh
测试的方法是创建一个计时器,尝试使用动态生成的数组,并将结果时间输出到控制台。 - Sean Kendle
1个回答

3

编辑

请忘记我之前说的话。那只对于非常老的浏览器有效。对于新的浏览器(已测试Chrome、Firefox、IE11和Edge),这些例子几乎没有任何区别。

我已经用一个包含1亿条记录的数组进行了测试,差异小于1毫秒。

选项2似乎略微更快,但并不会真正有所影响。


3
浏览器会对数组中的for循环进行优化。你可能不会发现缓存长度会有任何性能差异。 - Felix Kling
你的第二个例子将在元素为false、0或空字符串时停止循环。 - user663031
@torazaburo 没问题,它会在任何假值处停止。这就是为什么我说他必须确保对象不为null/未定义(因为他正在使用对象,而不是字符串、布尔值或数字)。 - Buzinas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接