假设我有一个for
循环,并且在某些条件下我想增加我的控制变量(i
)的值,以便跳过下一个元素循环,例如:
for (var i = 0; i < arr.length; i++) {
if (someCondition) {
// Call a function and increment i in order to skip the next item
callFunction(arr[i], arr[++i]);
} else {
// Do something else
}
}
虽然这种方法很好,但是我很关心做这样的事情是多么好的做法:
提前致谢。
答案 0 :(得分:2)
您可以存储一个布尔值,指示它是否应该跳过下一个项目:
var skip = false;
for (var i = 0; i < arr.length; i++) {
if (skip == true) {
skip = false;
continue;
}
if (someCondition) {
skip = true;
callFunction(arr[i], arr[i + 1]);
} else {
// Do something else
}
}
答案 1 :(得分:1)
除了增加代码和if语句
之外,您甚至可以使用continue关键字跳过所需的迭代您的代码看起来像
for (var i = 0; i < arr.length; i++) {
if (someCondition)
continue;
callFunction(arr[i], arr[++i]);
}
答案 2 :(得分:1)
- 第一眼就清楚了解到了什么?
或多或少。
乍一看,读者可以认为循环运行length
次,而实际上它可以运行一半时间。
无论如何,通过查看代码,即使没有经验丰富的开发人员,也很清楚会发生什么。
问题必须是:它易于阅读吗?
至少对我来说并非如此。我更倾向于使用对对象,因为它更容易理解,但它也有其缺点(创建对意味着拥有更多对象周围,需要去除它们等等。)
- 这是一种不好的做法吗?
不,它不是。
通常使用连续内存来分配向量,所以作为一个例子,在某些情况下,从你的CPU缓存中获得最佳效果是值得的(在这里有一对可能或不会导致derefer东西,从而使你的努力无效 - 尝试考虑如何在JavaScript中实现对。
当然,这只是一个例子,但它应该提出这样的想法,即实践也取决于预期的目标。
甚至几乎所有人的goto
都是在内核中发现它的用法,但你有没有听过有人称之为好习惯?
- 我可以有意想不到的副作用吗?
嗯,在这种情况下,一旦输入if
,就不会严格检查数组的长度。由于这一点以及JavaScript的工作方式,您必须准备好至少看到此循环中推送的undefined
值。
正如有人在评论中所说的那样,这种方法是一种很好的方法来掩盖代码中的错误,因为你假设调用者已经为你正确构建了数组。迟早,有人会犯错误,你可能会驱逐那个从你的团队那里编写代码的人。
注意强>
这个评论是最糟糕的部分,的确如此:
//调用一个函数并递增i以跳过下一个项目
这里你不是简单地试图跳过一个元素,而是将它作为参数传递给被调用的函数。如果您还接收该函数作为参数(例如,该排序算法并且该函数是您的 less 运算符),这样您就会介绍一个冒险的调用,可能会导致异常抛出。
不太好。 : - )
答案 3 :(得分:0)
为什么要跳过循环中的元素?
无论如何我应该使用一个特定的变量来避免强制增量,这可能会产生一些问题。
我会这样写:
var skip = false;
for (var i = 0; i < arr.length; i++) {
if(skip == false) {
if (someCondition) {
// change skip value
skip = true;
} else {
// Do something else
}
}
else {
//reset skip value to false in order to go on with your loop and do nothing else
skip = false;
}
}