javascript - JS : For loop continues to iterate after condition is false

标签 javascript angularjs for-loop conditional-statements

有谁知道什么会导致我的 for 循环在满足条件后继续?我会发布整个文件,但它很大。以下是循环:

for (var j = 0; j < depKeyArr.length; j++) {
    var directory = angular.copy(dependencies[depKeyArr[j]]),
        keyArr = angular.copy(Object.keys(directory));
    for (var i = 0; i < keyArr.length; i++) {
        var next = i + 1;       

        if (keyArr[i] && !keyArr[i].includes('Params')) {
            if (keyArr[next] && keyArr[next].includes('Params')) {
                directory[keyArr[next]] = directory[keyArr[next]].split(', ') !== [''] ? directory[keyArr[next]].split(', ') : undefined
                directory[keyArr[next]].push(directory[keyArr[i]])
            }
            var paramArr = directory[keyArr[next]] ? directory[keyArr[next]] : directory[keyArr[i]]
            switch (depKeyArr[j]) {
                case 'controller':
                    angular.module('app').controller(keyArr[i], paramArr)
                    break
                case 'directive':
                    angular.module('app').directive(keyArr[i], paramArr)
                    break
                case 'factory':
                    angular.module('app').factory(keyArr[i], paramArr)
                    break
                case 'filter':
                    angular.module('app').filter(keyArr[i], paramArr)
                    break
                case 'service':
                    angular.module('app').service(keyArr[i], paramArr)
                    break

            }
        }
    }
}

因此,在此特定实例中,depKeyArr.length 等于 5,而 keyArr.length 等于 42。尽管如此,当满足这些条件时,两个 for 循环都会继续执行事实上,我预计它们会在 4 点和 41 点停止。如果您能提供任何帮助,以便我能找出原因,那就太好了。

上面更新了代码片段!

另外 - 你们都提到 i 和 j 发生变化,但是当我在调试器中查看它时,它们没有变化。我现在正在查看它 - j = 5 且 depKeyArr.length 为 5。同样,i = 42 且 keyArr.length 为 42...但我' m 在两个循环内,特别是在 switch 语句中的最后一个情况。当 keyArr[i] 未定义时,它会失败。

为了响应 OBDM 提供的答案,我添加了 angular.copy() 以防止从循环内部更新数组。当 bool 条件满足时,它仍然单步进入循环。更令人困惑的是,即使是 if 条件也无法阻止它执行 switch。它应该无法输入以下if:

if (!keyArr[i].includes('Params'))

因为到那时keyArr[i]尚未定义。

最新更新 -

看来我已经使用最新的更改成功地打破了内部循环,但它仍然继续到 switch 语句并在 keyArr[i] 上中断,即使该 switch 位于两个循环内以及一个计算结果为 false 的 if 条件。

最佳答案

一般来说,使用“动态值”设置循环的停止条件是一种不好的做法,即在循环迭代时可以更改的值。

以下代码生成无限循环:

for (var j = 0; j < depKeyArr.length; j++) {
   depKeyArr.push("whatever");
}

而不是在变量中设置停止条件来防止不明确的行为:

var depKeyArrLen = depKeyArr.length;

for (var j = 0; j < depKeyArrLen; j++) {
   depKeyArr.push("whatever");
}

关于javascript - JS : For loop continues to iterate after condition is false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39637975/

相关文章:

javascript - GreaseMonkey @include 约 :newtab

javascript - 如何使用 AngularJS 上传 FormData 对象

c - 为什么这个 C 程序打印输出 "10"而不管 for 循环?

javascript - ES6 const 赋值中的意外行为

Javascript 替换 <br> html 元素的 %0A

javascript - Angular 用户界面 Bootstrap : Set timepicker to be empty by default

javascript - 仅在单击按钮时使用 Angular 过滤器

c - 使用多个进程读取文件并通过pipe()发送数字

javascript - 在某个字符之后向数组添加元素 javascript

javascript - 选择选择选项时将数据加载到 div