理解JavaScript模运算符

news2024/12/23 4:48:35

本文翻译自 Understanding the JavaScript Modulo Operator,作者:joshwcomeau, 略有删改。

当我第一次学习编码时,我记得发现模运算符(%)非常令人困惑。😬

当你不明白它的原理的时候,它产生的值看起来完全是随机的:

const what = 10 % 4; // 2
const the = 10 % 10; // 0
const heck = 4 % 10; // 4

在这篇文章中,我们将通过改进除法的心理模型来学习这个运算符是如何工作的,文末还将介绍一个实用的日常实践。

受众群体:这篇博客文章是为初级到中级JavaScript开发人员所写。一些JavaScript知识是假设的,但核心内容应该对每个人都有用!

重新思考

假设我们有下面的计算:

12 ÷ 4

除法常常让人感觉非常抽象或理论化,但有一种实用的方法来思考它:我们可以把一个数字分成大小相等的组。

添加图片注释,不超过 140 字(可选)

12 ÷ 4的计算结果为3,因为每个组正好包含3个项目。从本质上讲我们正在计算每个组中将包含多少个项目。

在上面的示例中我们的被除数是12。使用除法时,它可以用很多不同的方式来分割。

假设我们有以下等式:

11 ÷ 4

这个方程式的值为2.75。每组有2个完整的项目,然后是另一个项目的3/4。

如果我们分披萨或蛋糕,这是可行的。但如果这些物品是不可摧毁的呢?如果我们不能把每一项分解成更小的部分呢?

在这种情况下,我们可以将2个项目放入每个组,然后剩下3个额外的项目放入一个组:

添加图片注释,不超过 140 字(可选)

这被称为余数。这是模运算符产生的结果。

在这些数字可以被平均分为几组的情况下(例如,12 ÷ 4),没有余数:

12 % 4; // 0

在被除数(要被除的数)不能平均分成几组的情况下,模运算符让我们知道还剩多少:

11 % 4; // 3

一个真实的使用案例

我不是一个数学家,我是一个Web开发人员。所有这些数学内容都很有趣,接下来让我们谈谈模运算符如何在前端页面上派上用场。

具体来说,有一种问题我似乎经常遇到,模运算符提供了完美的解决方案:循环数组。

假设我们有一个三种颜色的数组。每一秒都想切换到列表中的下一个颜色。当我们到达列表的末尾时,我们就继续回到第一项:

添加图片注释,不超过 140 字(可选)

这是一个比较棘手的问题。假设我们有一个名为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数组中无限循环。

添加图片注释,不超过 140 字(可选)

在我看来,仅凭这个小技巧,模运算符就值得学习!这些年来,我已经多次使用这种循环数组技巧,这只是模运算符的几个实际用例之一。

最后

本文通过改进除法的心理模型来学习模运算是如何工作的,并介绍了一个很实用的日常实践,希望对你有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1181865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习之基于YoloV5-Deepsort人物识别与追踪系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 YoloV5-Deepsort是一种基于深度学习的人物识别与追踪系统,具有较高的准确率和实时性能。 YoloV5是一种…

4.三大基础排序 -选择排序、冒泡排序、插入排序

排序算法 文章目录 冒泡排序算法步骤动图代码优化总结 选择排序算法步骤动图代码总结 插入排序算法步骤动图代码总结 排序算法,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。一般默认排序是按照由小到大即…

2.HTML中常用浏览器

2.常用浏览器 2.1 什么是浏览器 浏览器是网页显示,运行的平台。常用的浏览器有IE,火狐,谷歌,Safari和Opera等 平时成为五大浏览器 2.2 浏览器内核 浏览器内核(渲染引擎):负责读取网页内容&…

用CMake编译项目 CMake和g++的区别

0.同样是编译c文件有了g为什么又出了个CMake? g适用于要编译的文件较少的情况。 而CMake像是写好的脚本,可以一键编译很多c文件。一.创建项目和CMakeLists.txt文件 1.1 创建一个项目,目录结构如下 1.2 在项目的根目录下创建一个CMakeLists.…

个人常用Linux命令

来自 linux命令学习-2023-8-1 153913.md等 1、切换目录 cd //切换目录 cd change directory cd 目录名 cd .. 返回上一级目录 pwd显示当前所处目录cd 绝对路径 cd ~ 表示一个用户的home目录 cd - 表示上一次访问的目录 cd / 表示进入根目录下//新建目录/data,并且进入/data…

001、Nvidia Jetson Nano Developer KIT(b01)-系统与登录

之——镜像烧录与远程登录 杂谈 Nvidia Jetson Nano Developer KIT(b01,4G),系统配置全纪录,镜像烧录、系统安装、远程桌面安装、cuda与torch安装、pycharm、pycuda、tensorrt等等。 正文 1.开发板系统安装 1.1 开发…

创意涌动:CSDN·大学生博主14天创作挑战赛·第二期,正式开启报名!

文章目录 ⭐️ 活动介绍⭐️ 活动详情⭐️ 活动奖品⭐️ 活动流程⭐️ 评审规则⭐️ 报名&投稿注意事项⭐️ 关于活动官方 活动报名地址(点击跳转) 本次活动与官方活动及其他博主的创作型活动并不不冲突! ⭐️ 活动介绍 亲爱的大学生博主…

【无标题】【教3妹学编程-算法题】2918. 数组的最小相等和

3妹:呜呜,烦死了, 脸上长了一个痘 2哥 : 不要在意这些细节嘛,不用管它,过两天自然不就好了。 3妹:切,你不懂,影响这两天的心情哇。 2哥 : 我看你是不急着找工作了啊, 工作…

Leo赠书活动-05期 【打造敏捷测试团队】文末送书5本

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 赠书活动专栏 ✨特色专栏:…

运动想象 EEG 信号分析

基于运动想象的公开数据集:Data set IVa (BCI Competition III)1 数据描述参考前文:https://blog.csdn.net/qq_43811536/article/details/134224005?spm1001.2014.3001.5501 本文使用公开数据集 Data set IVa 中的部分被试数据,数据已公开可…

Rust和Pytho写一段采集公众号代码

首先,我们需要安装Rust和Python的requests库。Rust的requests库可以用来发送HTTP请求,而Python的requests库可以用来处理HTTP响应。 // 导入所需的库 use std::io; use std::env;// 使用rustc命令来编译我们的程序 fn main() {// 获取命令行参数let args…

GuLi商城-商品服务-API-三级分类-查询-递归树形结构数据获取

导入sql语句 insert into pms_category(cat_id,name,parent_cid,cat_level,show_status,sort,icon,product_unit,product_count) values (1,图书、音像、电子书刊,0,1,1,0,NULL,NULL,0),(2,手机,0,1,1,0,NULL,NULL,0),(3,家用电器,0,1,1,0,NULL,NULL,0),(4,数码,0,1,1,0,NULL…

分享六个 Vue3 开发必备的 VSCode 插件

今天分享 6 个 Vue3 开发必备的 VSCode 插件,可以直接用过 VSCode 的插件中心直接安装使用。 1. Volar 🔥 下载数 153 万 相信使用 VSCode 开发 Vue2 的同学一定对 Vetur 插件不会陌生,作为 Vue2 配套的 VSCode 插件,它的主要作…

混合云中 DevOps 的最佳实践

近年来,出现了各种工具、技术和框架,其目标是增强灵活性、性能和可扩展性。传统的整体方法已被微服务和纳米服务等更加模块化的方法所取代。此外,云计算的兴起导致本地软件被云环境所取代,云环境提供了以前无法提供的广泛优势和功…

获取狮子座明年恋爱运势预测API接口

获取狮子座明年恋爱运势预测API接口的功能是通过API接口获取狮子座明年恋爱运势的预测结果,为用户提供恋爱运势指导。 首先,使用挖数据平台该API接口需要先申请API密钥。在获取API密钥后,可以使用该接口进行开发。 API接口地址为&#xff1a…

[LC 总结] 前缀和(Prefix Sum)总结 10 道相关练习题

[LC 总结] 前缀和(Prefix Sum)总结& 10 道相关练习题 类型与题目列表如下: 题目的解法都做过了,会留在最后一个部分,接下来就梳理一下 prefix sum,列举的题目从简单到 -> 困难 基础 prefix sum 其…

【深蓝学院】手写VIO第9章--课程总结--笔记

0. 内容 1. 课程回顾 最大后验概率MAP,如果不知道先验则是MLE,如果观测服从高斯分布(关于为什么服从高斯分布有个pdf)则可转化为LSP。 残差构建主要讲了IMU残差的构建,包括预积分模型,误差模型(…

使用Android Jetpack Compose渲染效果打造酷炫的动画效果

如何在Android Jetpack Compose中使用渲染效果打造令人惊艳的视觉体验 学习示例:如何使用渲染效果来改变UI界面 引言 Jetpack Compose提供了各种工具和组件来构建引人入胜的UI,而在Compose中较为鲜为人知的一个宝藏是RenderEffect。 在这篇博文中&a…

freertos任务参数

实现多个任务利用同一个函数,传进不同的任务参数,打印不同的任务内容。多个人用同一个电脑干不同工作,美工用电脑干美工,程序员用电脑敲代码 #include "stm32f10x.h" // Device header #include &quo…

.NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth

前言 我相信做开发的同学应该都对接过各种各样的第三方平台的登录授权,来获取用户信息(如:微信登录、支付宝登录、QQ登录、GitHub登录等等)。今天给大家推荐一个.NET开源好用的、全面的、方便第三方登录组件集合框架:…