JavaScript模运算符理解及运用实战
本文深入解析JavaScript中模运算符(%)的工作原理,通过改进除法心理模型解释余数概念,并展示如何利用模运算实现数组的无限循环访问,提供实用的前端开发技巧。
引言
本文翻译自 Understanding the JavaScript Modulo Operator,作者:joshwcomeau, 略有删改。
当我初次接触编程时,模运算符(%)曾让我感到十分困惑。😬
如果不理解其背后的逻辑,它生成的数值往往显得毫无规律:
const what = 10 % 4; // 2
const the = 10 % 10; // 0
const heck = 4 % 10; // 4本文将通过优化对除法的理解方式,来阐明模运算符的工作机制,并在最后分享一个日常开发中的实用技巧。
受众群体:
本文面向初级至中级JavaScript开发者。预设读者具备基础JS知识,但核心内容对所有人均有价值!
重新思考
假设我们要进行如下计算:
12 ÷ 4
除法往往给人抽象或理论化的印象,但我们可以采用一种更实用的思考方式:将一个数字分割成大小相等的组。

12 ÷ 4的计算结果为3,因为每个组恰好包含3个项目。本质上,我们在计算每个组中应包含的项目数量。
在上述示例中,被除数是12。使用除法时,这个数字可以被分割成多种不同的方式。
假设我们有以下等式:
11 ÷ 4
该方程的结果为2.75。这意味着每组有2个完整的项目,再加上另一个项目的3/4。
如果我们在分配披萨或蛋糕,这种分割方式是可行的。但如果这些物品是不可分割的呢?如果我们不能将每一项分解成更小的部分呢?
在这种情况下,我们可以将2个项目放入每个组,然后剩下3个额外的项目放入一个组:

这被称为余数。这也是模运算符所产生的结果。
当这些数字可以被平均分为几组时(例如,12 ÷ 4),没有余数:
12 % 4; // 0当被除数(要被除的数)无法平均分成几组时,模运算符会告诉我们还剩下多少:
11 % 4; // 3一个真实的使用案例
我不是数学家,而是Web开发人员。所有这些数学内容虽然有趣,但接下来让我们谈谈模运算符如何在前端页面上派上用场。
具体来说,有一种问题我似乎经常遇到,模运算符提供了完美的解决方案:循环数组。
假设我们有一个包含三种颜色的数组。我们希望每秒切换到列表中的下一个颜色。当我们到达列表末尾时,就继续回到第一项:

这是一个比较棘手的问题。假设我们有一个名为timeElapsed的变量,它从0开始,每秒递增1。我们必须以某种方式将这个不断增加的值最终映射到一个只有3项的数组。
基于以上我们可以编写一个函数,它会产生以下结果:
const COLORS = ['red', 'yellow', 'blue'];
getColor({ timeElapsed: 0 }); // 'red'
getColor({ timeElapsed: 1 }); // 'yellow'
getColor({ timeElapsed: 2 }); // 'blue'
getColor({ timeElapsed: 3 }); // 'red'
getColor({ timeElapsed: 4 }); // 'yellow'
getColor({ timeElapsed: 5 }); // 'blue'
getColor({ timeElapsed: 6 }); // 'red'
getColor({ timeElapsed: 7 }); // 'yellow'
getColor({ timeElapsed: 8 }); // 'blue'让我们看看模运算符如何帮助我们解决这个问题:
const COLORS = ['red', 'yellow', 'blue'];
function getColor({ timeElapsed }) {
const colorIndex = timeElapsed % COLORS.length;
return COLORS[colorIndex];
}奇迹般地这正是我们所需要的结果!只要timeElapsed是一个整数,这个方法总是返回三种颜色中的一种。它会随着timeElapsed的增加而循环通过3种颜色。
COLORS.length等于3,因为我们的数组中有3种颜色。因此随着timeElapsed从0递增到8,该函数最终执行以下计算序列:
const colorIndex = 0 % 3; // 0
const colorIndex = 1 % 3; // 1
const colorIndex = 2 % 3; // 2
const colorIndex = 3 % 3; // 0
const colorIndex = 4 % 3; // 1
const colorIndex = 5 % 3; // 2
const colorIndex = 6 % 3; // 0
const colorIndex = 7 % 3; // 1
const colorIndex = 8 % 3; // 2然后我们可以使用这个colorIndex从COLORS数组中查找颜色。它保证总是在该数组的可用索引范围内循环。
要理解为什么这样做,值得记住我们的新除法模型:我们试图将timeElapsed分成3个大小相等的组,没有任何分数或小数值。余数总是0、1或2。它永远不会是3+,因为如果还有3个,我们可以在每组中再放1个!
从本质上讲,这就好像我们有能力创建一个“圆形”数组。无论底层的timeElapsed值增长到多大,我们都可以让它在COLORS数组中无限循环。

在我看来,仅凭这个小技巧,模运算符就值得学习!这些年来,我已经多次使用这种循环数组技巧,这只是模运算符的几个实际用例之一。
最后
本文通过改进除法的心理模型来学习模运算是如何工作的,并介绍了一个很实用的日常实践,希望对你有所帮助。
更多关于JavaScript模运算符的资料请关注本站其它相关文章!
JS语法错误会阻止加载吗?区分SyntaxError与资源加载失败
2026-11-05 16:08:46
JavaScript常见SyntaxError语法错误排查与修复方法
2026-11-05 13:58:44
JS中slice、substring和substr截取字符串的区别
2026-11-05 13:43:47
JS 转 TS 手动迁移最佳实践:从配置 tsconfig 到消除 any 类型
2026-11-05 11:53:32
为什么JS数组push后得到的是数字而不是数组?
2026-11-05 09:59:18
