使用 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++) {
我认为这个解决方案很有趣,因为这正是您在遍历数组时所需要的:当您尝试访问未定义的索引时,您不想得到 undefined
s。
我意识到,如果你计算字符数,它看起来会更长,而且你可能会遇到像这样的数组的一些问题:["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');
我知道遍历数组 arr
的经典方法是:
for(var i=0 ; i<arr.length ; i++) {
// code
}
但最近有人向我展示了一种在该循环内实现条件的不同方法,如下所示:
for(var i=0 ; arr[i] !== undefined ; i++) {
我认为这个解决方案很有趣,因为这正是您在遍历数组时所需要的:当您尝试访问未定义的索引时,您不想得到 undefined
s。
我意识到,如果你计算字符数,它看起来会更长,而且你可能会遇到像这样的数组的一些问题:["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');