运算符
约 2214 字大约 7 分钟
2026-03-17
手写笔记









一、运算符概述
1.1 核心概念
- 运算符:参与运算的符号
- 操作数:参与运算的数据(也叫“元”)
- 表达式:
运算符 + 操作数组成的式子,每个表达式都有一个运算结果(返回值),返回值类型叫「返回类型」 - 目前接触的特殊运算符:
=:赋值运算符./[]:属性访问符():函数调用符
1.2 表达式分类与返回值
| 表达式类型 | 返回值说明 |
|---|---|
= 赋值表达式 | 返回赋值后的值 |
. 属性访问表达式 | 返回属性的值 |
[] 属性访问表达式 | 返回属性的值 |
() 函数调用表达式 | 返回函数运行结果 |
| 声明 + 赋值表达式组合 | 结果返回 undefined |
1.3 运算符分类
- 算术运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 其他运算符(三目、逗号、void 等)
二、算术运算符
2.1 基础算术运算符
+ - * / % ++ -- **(幂运算)
2.2 关键细节
- 除法
/精度问题:- 除数为
0:正数 →Infinity,负数 →-Infinity - 被除数为
0→NaN
- 除数为
- 取余
%:- 有的教程也称“求模”,但 JS 中
%本质是求余 - 余数符号与被除数相同
- 有的教程也称“求模”,但 JS 中
- 自增/自减
++/--:x++:先取值,后自增++x:先自增,后取值x--/--x同理
- 优先级:
++/-->*///%>+/- - 优先级口诀:
- 从左到右依次查看
- 遇到操作数直接取出
- 相同优先级运算符:左边优先级 > 右边,直接运算左边
2.3 类型自动转换
- 除
+外的算术运算符:将原始类型自动转为number后运算boolean:true→1,false→0string:能转数字则转,否则NaN;空串""→0null:0undefined:NaNobject:先转字符串,再转数字,结果通常为NaN
- 加法
+特殊规则:- 一边是字符串 → 变为字符串拼接
number/boolean/null/undefined都转成对应字符串object先转字符串"[object Object]"再拼接
- 两边都没有字符串,但有对象 → 对象先转字符串,再按上面规则
- 其他情况 → 按数字运算
- 一边是字符串 → 变为字符串拼接
2.4 数字判断工具
typeof NaN→'number'(注意:NaN是数字类型)isNaN(数据):判断是否为NaN,返回booleanisFinite(数据):判断是否为有限数,返回boolean
三、比较运算符
3.1 分类
- 大小比较:
><>=<=(返回boolean) - 相等比较:
==!====!==(返回boolean)
3.2 大小比较细节
- 两边都是字符串:比较字符的字符编码值
- 一个不是字符串,且两边都是原始类型:都转成
number比较 - 特殊值规则:
NaN与任何数字比较 → 结果都是falseInfinity比任何有限数都大(除了Infinity自身)-Infinity比任何有限数都小
- 一边是对象:对象转原始类型后,再按规则 1 或 2 比较
3.3 相等比较细节
(1)== / !=(不严格相等/不相等)
- 两边类型相同:直接比较值/地址(对象比地址)
- 两边类型不同:
null和undefined:互相相等,和其他原始类型比较则不相等- 其他原始类型:先转成
number再比较 NaN:和任何值比较都为false(包括自身)Infinity/-Infinity:只和自身相等- 对象比较:先转成原始类型,再比较
- ⚠️ 不推荐使用
==/!=,容易违反直觉,优先使用===/!==
(2)=== / !==(严格相等/不相等)
- 两边类型不同 → 直接
false - 两边类型相同 → 规则和
==类型相同时一致 Infinity/-Infinity:只和自身相等
四、逻辑运算符
4.1 与 &&(并且)
- 语法:
表达式1 && 表达式2 - 步骤:
- 将
表达式1转成boolean判断 - 若为
false:直接返回表达式1,不执行表达式2(短路) - 若为
true:返回表达式2的结果
- 将
- 转
false的值:null/undefined/false/0/NaN/""(空串)
4.2 或 ||(或者)
- 语法:
表达式1 || 表达式2 - 步骤:
- 将
表达式1转成boolean判断 - 若为
true:直接返回表达式1,不执行表达式2(短路) - 若为
false:返回表达式2的结果
- 将
4.3 非 !(取反)
- 语法:
!数据 - 对数据的
boolean判断结果直接取反,一定返回boolean类型 - 双取反
!!数据:可快速将数据转成对应boolean值
五、三目运算符
- 语法:
表达式1 ? 表达式2 : 表达式3 - 逻辑:对
表达式1做boolean判断,为true返回表达式2,否则返回表达式3
六、运算符补充
6.1 模板字符串
- 语法:
`字符串 ${变量} 字符串` - 作用:方便字符串拼接,不会影响原数据
6.2 复合赋值运算符
+= -= *= /= %= **=
- 等价于:
a += b→a = a + b
6.3 void 运算符
- 语法:
void 表达式或void(表达式) - 作用:运行表达式,然后返回
undefined
6.4 typeof 运算符
- 语法:
typeof 表达式或typeof(表达式) - 注意:不是函数,是运算符,返回表达式类型(字符串)
6.5 逗号运算符
- 语法:
表达式1, 表达式2 - 作用:依次运行两个表达式,返回
表达式2 - 优先级:比赋值运算符更低
七、[扩展] 数字的存储
7.1 核心问题与答案
| 问题 | 答案 |
|---|---|
| JS 小数运算精确吗? | 不一定(二进制存储导致精度丢失) |
| JS 整数运算精确吗? | 不一定(超过安全整数范围后不精确) |
| JS 整数是连续的吗? | 不是,数字很大时不再连续 |
| JS 能表示的最大数? | 9007199254740991(2^53 - 1,安全整数) |
| JS 数字有效位数? | 16~17 位 |
7.2 二进制与十进制转换
- 二进制 → 十进制:按权展开求和
- 十进制整数 → 二进制:除 2 取余,余数从下往上读
- 十进制小数 → 二进制:乘 2 取整,整数部分从上往下读
7.3 小数不精确原因
- 十进制小数转二进制后可能是无限循环小数,计算机存储位数有限,会丢失精度(如
0.1 + 0.2 ≠ 0.3)
7.4 JS 数字存储格式(IEEE 754 双精度)
- 固定 64 位存储空间:
- 第 1 段(1 位):符号位(0 正,1 负)
- 第 2 段(11 位):指数位(存储偏移后的指数)
- 第 3 段(52 位):有效数字位(存储小数部分)
- 特殊值:
0:符号位 0,指数 0,尾数 0Infinity:符号位 0,指数全 1,尾数 0-Infinity:符号位 1,指数全 1,尾数 0NaN:指数全 1,尾数不全 0
八、[扩展] 位运算符
8.1 基础规则
- 对数据进行位运算时,先转成整数,并按 32 位有符号整数处理
- 特殊值:
NaN/Infinity/-Infinity→ 转成0
8.2 位运算符列表
| 运算符 | 语法 | 说明 |
|---|---|---|
与 & | 整数1 & 整数2 | 同位都为 1 → 1,否则 0 |
| 或 ` | ` | `整数1 |
非 ~ | ~整数 | 按位取反(JS 中 ~x = -x-1) |
异或 ^ | 整数1 ^ 整数2 | 同位不同 → 1,相同 → 0 |
左移 << | 数1 << 数2 | 结果 = 数1 * 2^数2 |
右移 >> | 数1 >> 数2 | 结果 = 数1 / 2^数2(带符号) |
无符号右移 >>> | 数1 >>> 数2 | 右移后高位补 0(无符号) |
8.3 负数存储(补码)
- 原码 → 反码(符号位不变,其余取反)→ 补码(反码 + 1)
- 取反快捷运算:
~x = -x - 1 - 应用场景:权限控制(位掩码)、快速计算 2 的幂等
九、[扩展] 求余和求模
9.1 求余 x % y(JS 中 % 实现)
- 公式:
x - n * y,n为商取整(去掉小数,向 0 取整) - 规则:余数符号与被除数相同
9.2 求模 x mod y
- 公式:
x - n * y,n为商取整(去掉小数,向下取整) - 规则:求模结果符号与除数相同
十、核心总结
- 表达式:必有返回值,赋值/属性/函数调用表达式各有规则
- 算术运算:
+特殊(字符串拼接),其他自动转数字,%余数与被除数同号 - 比较运算:优先用
===/!==,避免==隐式转换坑 - 逻辑运算:短路特性,
&&找假,||找真,!转布尔 - 数字存储:IEEE 754 双精度,小数不精确,安全整数上限
2^53 - 1 - 位运算:32 位整数处理,补码存储,适合高效计算
