使用 arr[i]!==undefined 遍历数组

Loop through arrays using arr[i]!==undefined

我知道遍历数组 arr 的经典方法是:

for(var i=0 ; i<arr.length ; i++) {
    // code
}

但最近有人向我展示了一种在该循环内实现条件的不同方法,如下所示:

for(var i=0 ; arr[i] !== undefined ; i++) {

我认为这个解决方案很有趣,因为这正是您在遍历数组时所需要的:当您尝试访问未定义的索引时,您不想得到 undefineds。

我意识到,如果你计算字符数,它看起来会更长,而且你可能会遇到像这样的数组的一些问题:["Hello", , "World"],但除此之外,还有什么我在这里遗漏的吗?为什么我们不应该改用这种技术?

Why shouldn't we be using this technique instead?

  • 它不适用于稀疏数组(如您所述)
  • 它不适用于包含 undefined 个值的数组
  • 它没有那么容易优化(假设 .length 在循环期间保持不变)
  • (在过去,the undefined identifier could be overwritten,你需要使用typeof

当然,它是否适合您 "works" 取决于用例,有时您可能想使用它。大多数时候,你根本就不知道。

即使这两种方法都适用于您的情况,最好还是使用标准方法 (i<arr.length),因为它的精神开销较低。每个人都认识到这种模式并知道它的作用,而 arr[i]!==undefined 则需要考虑为什么选择这种不常见的方法。

有时数组有空值,你的迭代方式会失败。

var arr = [];
arr[5] = 5;

for (var i = 0; arr[i] !== undefined; ++i) {
    console.log(arr[i]);
}

console.log('done');

如果你想迭代真正的数组值并跳过undefined,我建议你先过滤数组然后再进行迭代。所以你的代码会更容易理解。示例:

var arr = [];
arr[5] = 5;

arr.filter(Boolean).forEach(function (e) {
  console.log(e);
});

console.log('done');