javascript - 与模运算符混淆
问题描述
我最近要求快速解决每次单击时更改背景颜色的脚本。颜色来自数组。在第一个解决方案中,我必须在第一个循环之后单击两次才能再次重新启动它。在第二个解决方案中,它最终只需单击一下,大概是因为模运算符在起作用。即使经过彻底检查,我也无法让自己理解它是如何工作的。这是下面的代码: -
//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 % b
进行整数除法并a
取b
余数作为结果。例如,0 % 5
是0
因为0 / 5
是0
余数0
。1 % 5
是1
因为整数除法1 / 5
是0
余数1
。最终我们得到了5 % 5
which 给了我们1
余数0
。这就是为什么在is 、、、等时i % backgrounds.length
产生0
(回到数组的开头)的原因。i
0
5
10
15
此插图可能会有所帮助:
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;
回到i
到达0
时5
。
i
但两种方式都有效(嗯......如果变得非常大,第一种方式会失败,但这很少是问题)。
推荐阅读
- python - 为什么我的 SVR 模型给出的 r2_score 为 0,而线性回归和 xgboost 在相同数据上给出 0.7 和 0.8
- .net-core - 如何从 Azure 构建管道(经典版)中的 dotnet 核心发布任务中排除文件夹/项目?
- python - 如何使用 docker-compose 将 selenium webdriver 中的文件保存在容器中?
- java - 在詹金斯声明性管道中包含空格的 Maven 参数
- python - Python dictionary['key'] = .. 在某些情况下会产生元组而不是字符串
- node.js - @hapi/boom 没有返回正确的错误,而是“500:内部服务器错误”
- powershell - 如何在 PowerShell 中转义可能包含需要转义的字符(例如 $)的字符串变量
- python-3.x - 从不遵循表达式的数组中删除元素的最简单方法
- css - 如何将 CodePen.io 中的代码应用到我的 Divi WP 网站?
- r - 在 purrr 和 makeDataReport() 中使用 map() 重命名多个 R Markdowns