与模运算符混淆

Confusion with modulo operator

我最近要求一个脚本的快速解决方案,该脚本会在每次点击时更改背景颜色。颜色来自数组。在第一个解决方案中,我必须在第一个循环后单击两次才能再次重新启动它。在第二个解决方案中,它最终通过一次单击工作,大概是因为模运算符在起作用。即使在彻底检查之后,我也无法让自己理解它是如何工作的。这是下面的代码:-

//SCRIPT

 let backgrounds = ['red', 'royalblue', 'green', 'purple', 'yellow'], i = 0
    document.querySelector('button').addEventListener('click', () => {
    document.body.style.backgroundColor = backgrounds[i%backgrounds.length];
    i++;
    })
       

a % ba 除以 b 并取余数作为结果。例如,0 % 50,因为 0 / 50 余数 01 % 51 因为 1 / 5 的整数除法是 0 余数 1。最终我们得到 5 % 5,这给了我们 1 余数 0。这就是为什么当 i0510、[= 时 i % backgrounds.length 产生 0(回到数组的开头) 35=],依此类推。

此图可能有所帮助:

let backgrounds = ['red', 'royalblue', 'green', 'purple', 'yellow'];
let i = 0;

for (let counter = 0; counter < 10; ++counter) {
    console.log(i, backgrounds[i % backgrounds.length]);
    ++i;
}
.as-console- wrapper {
    max-height: 100% !important;
}

当我这样做时,我通常在增量上执行 % 而不是使用:

console.log(i, backgrounds[i]);
i = (i + 1) % backgrounds.length;

当它达到 5 时将 i 设置回 0

但这两种方法都有效(好吧...如果 i 变得非常大,第一种方法会失败,但这很少成为问题)。

模数最常用的属性是它是循环的。这意味着它将从 0 到 x (y%x) 然后跳回零。当需要设置一些边界时,或者在您的情况下,从具有恒定长度的数组中获取有效值时,我不是一个好习惯。