JS - 在JS中常用的运算符

学过编程语言的都知道一种大部分编程语言其实都存在许多相似的地方,比如数学中的四则运算,这个在JS中同样生效,不过在JS中,有进行部分拓展,这个也是其他语言中都有的,每个语言都有其功能和特性,JS也不例外。下面我们就来看看JS中的运算符的种类和相关介绍吧:

运算符:我们通常也被称作为操作符,用于实现赋值,比较和执行,行算数运算等功能的符号。
表达式:由数字、运算符 、变量等组成的式子,我们称作表达式,例如 1 + 1;

算术运算符

关于算术运算符这个咱们经常见到了,已经是见怪不怪了,在JS中有以下算术运算符:

加法(+):用于将两个值相加。
减法(-):用于将一个值减去另一个值。
乘法(*):用于将两个值相乘。
除法(/):用于将一个值除以另一个值。
取余(%):用于获取两个值相除的余数。
自增(++):用于将变量的值增加1。自增运算符可以放在变量前(前缀自增)或变量后(后缀自增)。
自减(--): 用于将变量的值减1。自减运算符可以放在变量前(前缀自减)或变量后(后缀自减)。
let x = 5;
let y = ++x; // 前缀自增,x先加1,然后赋值给y,x和y的值都为6  使用口诀 : 先自加 1  再返回值
let z = x++; // 后缀自增,x的值先赋值给z,然后x再加1,z为6,x为7  使用口诀 :  先返回原值 后自加
                console.log(1 + 1);//  取余 %console.log((4 % 2));// 0console.log((3 % 5));// 3console.log("2%7 = "+(2%7)); // 2//  浮点数 算数里面会有问题console.log(0.1 + 0.2 ); console.log(0.1 * 0.2 ); //  我们不能拿着浮点数来进行 相比较是否相等var num = 0.1 + 0.2;console.log(num == 0.3); // false//    如何判断一个数能被整除: 它的余数为0 说明这个数能被 整除 这就是 % 取余运算符的主要用途// 算术运算先后 和数学上一致

使用算术运算符会碰到的问题

  • 数值溢出:当进行算术运算时,如果结果超出了JavaScript数值的表示范围,可能会导致数值溢出。这通常发生在处理非常大或非常小的数值时。要避免数值溢出,可以使用BigInt类型来处理大整数,或者进行适当的范围检查和处理。
var result= 0.1 + 0.2; //  结果不是0.3 而是 0.30000000000000004
var result= 0.1 * 0.2; // 结果不是0.02 而是 0.020000000000000004
  • 浮点数精度问题:由于JavaScript中的数字类型是基于浮点数的,因此在进行浮点数运算时可能会出现精度问题。这是由于浮点数的二进制表示无法精确地表示某些十进制数。例如,0.1 + 0.2 的结果可能不是预期的0.3,而是一个近似值。为了避免浮点数精度问题,可以使用适当的舍入函数或将浮点数转换为整数进行计算。

  • 除以零:在进行除法运算时,如果除数为零,将会导致除以零的错误。这将引发一个异常,并可能导致程序中断。因此,在进行除法运算之前,应该确保除数不为零。

  • 字符串拼接:在使用加法运算符(+)时,如果其中一个操作数是字符串,JavaScript会将其视为字符串拼接操作,而不是数值相加。这可能导致意外的结果。要确保正确的数值相加,可以使用括号或将操作数转换为数值类型。

  • 运算顺序:在复杂的表达式中,运算符的优先级和结合性可能会导致意外的结果。要确保表达式按预期进行计算,可以使用括号来明确指定运算的顺序。

赋值运算符:用于将值赋给变量。

简单赋值(=):用于将一个值赋给一个变量。
加法赋值(+=):用于将一个值加到变量上,并将结果赋给该变量。
减法赋值(-=):用于将一个值从变量中减去,并将结果赋给该变量。
乘法赋值(*=):用于将一个值乘以变量,并将结果赋给该变量。
除法赋值(/=):用于将变量的值除以一个值,并将结果赋给该变量。
取余赋值(%=):用于将变量的值除以一个值的余数,并将结果赋给该变量。
左移赋值:<<= : 将变量的位向左移动指定的位数,并将结果赋值给变量。
右移赋值:>>= : 将变量的位向右移动指定的位数,并将结果赋值给变量。右移操作会保留符号位。
无符号右移赋值:>>>= :将变量的位向右移动指定的位数,并将结果赋值给变量。无符号右移操作不保留符号位,用0填充左侧空位。
按位与赋值:&= :对变量的每个位执行按位与操作,并将结果赋值给变量。
按位或赋值:|= :对变量的每个位执行按位或操作,并将结果赋值给变量。
按位异或赋值:^= :对变量的每个位执行按位异或操作,并将结果赋值给变量。
		let x = 5; // 二进制表示为 00000101x <<= 2; // 左移2位,结果为 00010100,即20console.log(x); // 输出为 20let x = -10; // 二进制表示为 11111111111111111111111111110110x >>= 2; // 右移2位,结果为 11111111111111111111111111111101,即-3console.log(x); // 输出为 -3let x = -10; // 二进制表示为 11111111111111111111111111110110x >>>= 2; // 无符号右移2位,结果为 00111111111111111111111111111101,即1073741821console.log(x); // 输出为 1073741821let x = 12; // 二进制表示为 00001100x &= 5; // 按位与操作,结果为 00000100,即4console.log(x); // 输出为 4let x = 12; // 二进制表示为 00001100x |= 5; // 按位或操作,结果为 00001101,即13console.log(x); // 输出为 13let x = 12; // 二进制表示为 00001100x ^= 5; // 按位异或操作,结果为 00000101,即5console.log(x); // 输出为 5

比较运算符:用于比较两个值,并返回布尔值。

相等(==):用于比较两个值是否相等。
不相等(!=):用于比较两个值是否不相等。
全等(===):用于比较两个值的值和类型是否完全相等。
不全等(!==):用于比较两个值的值和类型是否不完全相等。
大于(>):用于检查一个值是否大于另一个值。
小于(<):用于检查一个值是否小于另一个值。
大于等于(>=):用于检查一个值是否大于或等于另一个值。
小于等于(<=):用于检查一个值是否小于或等于另一个值。

逻辑运算符:用于组合和操作布尔值。

逻辑与(&&):用于检查两个条件是否同时为真。
逻辑或(||):用于检查两个条件是否至少有一个为真。
逻辑非(!):用于取反一个条件的值。

位运算符:用于对二进制位进行操作。

  • 按位与(&):对两个操作数的每个位执行逻辑与操作。如果两个操作数的对应位都为1,则结果为1;否则,结果为0。使用情况:按位与操作常用于位掩码、清除特定位、提取特定位等操作。
  • 位或(|):对两个操作数的每个位执行逻辑或操作。如果两个操作数的对应位至少有一个为1,则结果为1;否则,结果为0。使用情况:按位或操作常用于设置特定位、合并标志等操作。
  • 按位异或(^):对两个操作数的每个位执行逻辑异或操作。如果两个操作数的对应位不相同,则结果为1;否则,结果为0。使用情况:按位异或操作常用于交换变量值、加密解密、校验等操作。
  • 按位非(~):对操作数的每个位执行逻辑非操作,将0变为1,将1变为0。按位非操作是一元操作符,只作用于一个操作数。使用情况:按位非操作常用于取反操作、位级别的数据处理等。
  • 左移(<<):将操作数的位向左移动指定的位数。左移操作会在右侧填充0。使用情况:左移操作常用于位级别的数据处理、乘以2的幂等操作等。
  • 右移(>>):将操作数的位向右移动指定的位数,保留符号位。右移操作会在左侧填充符号位的值。使用情况:右移操作常用于位级别的数据处理、除以2的幂等操作等。
  • 无符号右移(>>>):将操作数的位向右移动指定的位数,不保留符号位。无符号右移操作会在左侧填充0。使用情况:无符号右移操作常用于位级别的数据处理、无符号数值的处理等。
		let x = 5; // 二进制表示为 00000101let y = 3; // 二进制表示为 00000011let result = x & y; // 按位与操作,结果为 00000001,即1console.log(result); // 输出为 1let x = 5; // 二进制表示为 00000101let y = 3; // 二进制表示为 00000011let result = x | y; // 按位或操作,结果为 00000111,即7console.log(result); // 输出为 7let x = 5; // 二进制表示为 00000101let y = 3; // 二进制表示为 00000011let result = x ^ y; // 按位异或操作,结果为 00000110,即6console.log(result); // 输出为 6let x = 5; // 二进制表示为 00000101let result = ~x; // 按位非操作,结果为 11111010,即-6console.log(result); // 输出为 -6let x = 5; // 二进制表示为 00000101let result = x << 2; // 左移2位,结果为 00010100,即20console.log(result); // 输出为 20let x = -10; // 二进制表示为 11111111111111111111111111110110let result = x >> 2; // 右移2位,结果为 11111111111111111111111111111101,即-3console.log(result); // 输出为 -3let x = -10; // 二进制表示为 11111111111111111111111111110110let result = x >>> 2; // 无符号右移2位,结果为 00111111111111111111111111111101,即1073741821console.log(result); // 输出为 1073741821

三元运算符:也称为条件运算符,根据条件选择不同的值。

条件 ? 结果1 : 结果2 

条件:一个可以求值为布尔类型的表达式,用于判断条件的真假。
结果1:如果条件为真,则返回的值。
结果2:如果条件为假,则返回的值。

let age = 18;
let message = (age >= 18) ? "成年人" : "未成年人";
console.log(message); // 输出为 "成年人"

typeof 运算符:用于检测操作数的数据类型。

typeof 操作数
typeof 42; // "number"
typeof "Hello"; // "string"
typeof true; // "boolean"
typeof undefined; // "undefined"
typeof null; // "object" (这是一个历史遗留问题,实际上 null 是一个原始值)
typeof []; // "object"
typeof {}; // "object"
typeof function() {}; // "function"

typeof 运算符用于检测不同类型的操作数。它返回的字符串表示操作数的数据类型。例如,typeof 42 返回的是字符串 “number”,表示操作数是一个数字类型。

需要注意的是,typeof null 返回的是 “object”,这是一个历史遗留问题,实际上 null 是一个原始值。而对于数组和对象,typeof 运算符同样返回 “object”,无法区分它们的具体类型。如果需要更精确地检测对象的类型,可以使用其他方法,如 Array.isArray() 来检测数组,或者使用 instanceof 运算符来检测对象的构造函数。

instanceof 运算符:用于检测对象是否属于特定的类型。

对象 instanceof 类型
let str = "Hello";
console.log(str instanceof String); // falselet num = new Number(42);
console.log(num instanceof Number); // truelet arr = [1, 2, 3];
console.log(arr instanceof Array); // truelet obj = { name: "John" };
console.log(obj instanceof Object); // truefunction Person(name) {this.name = name;
}
let person = new Person("Alice");
console.log(person instanceof Person); // true
console.log(person instanceof Object); // true

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

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

相关文章

流媒体协议--RTMP

文章目录 RTMP播放基本流程TCP握手过程RTMP握手过程connect连接createStream 创建流play 播放命令deleteStream删除流RTMP数据组成 RTMP(Real Time Messaging Protocol)是一个应用层协议&#xff0c;主要用于在Flash player和服务器之间传输视频、音频、控制命令等内容。 该协议…

【笔试强训_Day06】

文章目录 1.字符串相乘 1.字符串相乘 题目链接 解题思路&#xff1a; 高精度乘法&#xff0c;注意要学会下面这种列式相乘的形式&#x1f34e; 注意细节❗&#xff1a; ① &#x1f34e; 首先把列式相乘的数据都存放到数组中去&#xff0c; 然后再对数组中的数据进行取余进…

C++:运算符重载和“const”成员

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;运算符重载》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 赋值运算符重载1. 运算符重载2.赋值运算符重载第一个点第二个点&…

迅雷下载不了的资源怎么下载?

我想下载Boost库&#xff0c;但是下载不下来 用迅雷下载是一直卡在0k 后来尝试在centos上用wget进行下载&#xff0c;竟然可以 wget https://boostorg.jfrog.io/artifactory/main/release/1.85.0/source/boost_1_85_0.tar.gz

揭开ChatGPT面纱(一):准备工作(搭建开发环境运行OpenAI Demo)

文章目录 序言&#xff1a;探索人工智能的新篇章一、搭建开发环境二、编写并运行demo1.代码2.解析3.执行结果 本博客的gitlab仓库&#xff1a;地址&#xff0c;本博客对应01文件夹。 序言&#xff1a;探索人工智能的新篇章 随着人工智能技术的飞速发展&#xff0c;ChatGPT作为…

2024燃动智火-业务视角的中国企业AI+学习发展报告

来源&#xff1a;新华三 学习型组织的数字化转型是众多企业关注的焦点&#xff0c;数字战略需要人才升级&#xff0c;数字 化学习加速人才培养。AI 技术在学习中的运用&#xff0c;为企业学习型组织的数字化转型插 上了飞翔的翅膀。这份报告解码了AI 时代企业的学习发展&#…

混合现实(MR)开发框架

混合现实&#xff08;MR&#xff09;开发框架为开发者提供了构建MR应用程序所需的基本工具和功能。它们通常包括3D引擎、场景图、输入系统、音频系统、网络功能以及支持同时处理现实世界和虚拟世界信息的功能。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&…

springboot+ssm基于Java的小型企业银行账目管理系统代码Lw

本毕业设计课题要求学生基于软件工程方法&#xff0c;根据课题的需求&#xff0c;给出小型企业银行账目管理系统概要设计、详细设计、数据库的设计以及系统实现和测试&#xff0c;并撰写规范的毕业设计说明书。该系统的主要模块有&#xff1a;系统管理、帐目管理、查询统计、用…

如何使用 ArcGIS Pro 制作边界晕渲效果

在某些出版的地图中&#xff0c;边界有类似于“发光”的晕渲效果&#xff0c;这里为大家介绍一下如何使用ArcGIS Pro 制作这种晕渲效果&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的行政区划数据&#xff0c;除了行政区划数据&#xff0c…

【Flutter】多语言方案二:GetX 版

介绍 多语言方案&#xff1a;GetX版&#xff0c;需要手动自定义字符串引用常量&#xff0c;优点不需要自己管理状态。 目录 介绍运行效果一、安装 GetX二、使用1.语言配置 在lib/core下创建一个language文件夹&#xff0c;文件夹下创建一个local.dart文件2.language文件夹下创…

程序员自由创业周记#32:新产品构思

程序员自由创业周记#32&#xff1a;新产品构思 新作品 我时常把自己看做一位木匠&#xff0c;有点手艺&#xff0c;能做一些作品养活自己。而 加一、Island Widgets、Nap 就是我的作品。 接下来在持续维护迭代的同时&#xff0c;要开启下一个作品的创造了。 其实早在2022的1…

进程间通信(1)管道

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

【C语言】内存函数-memcpy-memmove-memset...用法及实现,沉淀自己!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. memcpy函数使用和模拟实现 2. memmove使用和模拟实现 3. memset函数的使用 4. memcmp函数的使用 1. memcpy函数使用和模拟实现 <string.h>-------…

Buildroot系统构建学习笔记(以百问网imx6ullPro开发板为例)

一、Builroot是什么&#xff1f; Buildroot是一组Makefile和补丁&#xff0c;可简化并自动化地为嵌入式系统构建完整的、可启动的Linux环境(包括bootloader、Linux内核、包含各种APP的文件系统)。Buildroot运行于Linux平台&#xff0c;可以使用交叉编译工具为多个目标板构建嵌…

沉思录 (梁实秋)

链接&#xff1a;https://pan.quark.cn/s/8e27564b02f5

Python 检测当前系统的内存及硬盘资源,发送邮件告警通知(告警内容包含告警语句及网卡和系统版本时间)

颜色块 rootbogon:~ 2024-04-18 16:16:40# cat DefaultColor.py ######################################################################### # File Name: DefaultColor.py # Author: eight # Mail: 18847097110163.com # Created Time: Thu 11 Apr 2024 10:…

H3C之GRE VPN

华子目录 GRE实验测试 MGRE实验 GRE实验 第一步&#xff1a;接口配置IP地址 <H3C>sys System View: return to User View with CtrlZ. [H3C]sysname r1 [r1]int g0/0 [r1-GigabitEthernet0/0]ip add 192.168.1.1 24 [r1-GigabitEthernet0/0]int g0/1 [r1-GigabitEtherne…

短视频素材哪里去找?推荐几个视频素材免费下载的网站

高质量的资源&#xff0c;会让你的视频创作更加生动和具有吸引力。下面我为你介绍世界各地的优质无水印视频素材网站&#xff0c;以拓宽你的创作视野&#xff0c;帮助你在这个视觉革命的时代中脱颖而出。 1. 蛙学府&#xff08;中国&#xff09; 提供各种类别的优质高清视频素…

视频监控平台的web客户端看到的视频画面是黑屏时的处理方法

目录 一、问题描述 二、问题分析 &#xff08;一&#xff09;总体分析 &#xff08;二&#xff09;视频流传输问题的原因分析 1、网络问题 2、设备问题 3、配置和设置问题 4、兼容性问题 三、诊断和排查步骤 &#xff08;一&#xff09;编码方式问题的处理办法 &…

Redis中的订阅发布(一)

订阅发布 概述 Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过执行SUBSCRIBER命令&#xff0c;客户端可以订阅一个或多个频道&#xff0c;从而成为这些频道的订阅者(subscribe)&#xff1a; 每当有其他客户端向被订阅的频道发送消息(message)时&…