主题
操作符
一元操作符
- 定义:只操作一个值的操作符
(1)递增 / 递减操作符
操作符
- ++:给数值加一
- --:给数值减一
操作
前缀
操作:变量的值都会在语句被求值之前改变后缀
操作:在语句被求值后才发生改变
类型转换规则。转换后的类型均为 Number 类型
类型 | 规则 |
---|---|
String | - 有效的数值形式,则转换为数值再应用改变 - 无效的数值形式,则值设置为 NaN |
Boolean | - true,转换为 1,再应用改变。 - false,转换为 0, 再应用改变 |
Number | 加一或减一 |
Object | 1. 调用其 valueOf() 方法取得可以操作的值,应用上述规则。若为 NaN,则走第 2 步 2. 调用 toString() ,并再次应用其他规则 |
(2)一元加和减
- 用途与数学一样
- 此操作符应用到非数值,会
执行 Number() 进行类型转换
布尔操作符
(1)逻辑非:由一个 !
表示
- 会遵守如下规则,且始终返回布尔值
类型 | 规则 |
---|---|
Object | 返回 false |
String | - 空字符串,返回 false - 非空字符串,返回 true |
Number | - 数值 0,返回 true - 非 0 数值,返回 false - NaN,返回 true |
Null | 返回 true |
Undefined | 返回 true |
(2)逻辑与:由 &&
表示
返回规则
- 如果第一个操作数是真值,返回第二个操作数
- 如果第一个操作数是假值,返回第一个操作数
短路特性:如果第一个操作数是假值了,则永远不会执行第二个操作数
jsconst reuslt = false && unVariable // unVariable 未定义,但不会报错,因为第一个操作数是假值
(3)逻辑或:由 ||
表示
返回规则
- 如果第一个操作数是真值,返回第一个操作数
- 如果第一个操作数是假值,返回第二个操作数
短路特性:如果第一个操作数是真值了,则永远不会执行第二个操作数
jsconst reuslt = true || unVariable // unVariable 未定义,但不会报错,因为第一个操作数是真值
乘性操作符
(1)乘法操作符:由一个星号 *
表示
$$ \begin{align} 数值 * 数值 = 正常数值\ |\ Infinity\ |\ -Infinity \ NaN * any = NaN \ Infinity * 0 = NaN \ Infinity * (非 0、NaN 数值) = Infinity \end{align} $$
不是数值的操作数,则先用 Number() 转换为数值,再应用以上规则
(2)除法操作符:由一个斜杠 /
表示
$$ \begin{align} 数值\ /\ 数值 = 正常数值\ |\ Infinity\ |\ -Infinity \ NaN\ /\ any = NaN \ Infinity\ /\ Infinity = NaN \ 0\ /\ 0 = NaN \ (非 0 有限值)\ /\ 0 = Infinity\ |\ -Infinity \ Infinity\ /\ any = Infinity\ |\ -Infinity \ \end{align} $$
不是数值的操作数,则先用 Number() 转换为数值,再应用以上规则
(3)取模操作符:由一个百分比符号 %
表示
$$ \begin{align} 数值\ %\ 数值 = 正常余数 \ Infinity\ %\ any = NaN \ 有限值\ %\ 0 = NaN \ 有限值\ %\ Infinity = 被除数 \ 0\ %\ \lnot 0 = 0 \end{align} $$
不是数值的操作数,则先用 Number() 转换为数值,再应用以上规则
指数操作符
Math.pow()
和**
(ECMAScript 7)jsMath.pow(3, 2) // 9 3 ** 2 //9
指数赋值操作符
**=
jslet num = 3 num **= 2 console.log(num) // 9
加性操作符
加法和减法操作符
(1)加法操作符( + )
情况 | 规则 |
---|---|
两个操作数都是数值 | 有任一操作数是 NaN,返回 NaN Infinity + Infinity = Infinity -Infinity + -Infinity = -Infinity Infinity + -Infinity = NaN +0 + +0 = +0 -0 + +0 = +0 -0 + -0 = -0 |
有一个操作数是字符串 | 两个操作数都是字符串,则返回第一个字符串拼接第二个字符串的结果 只有一个操作数是字符串,将另一个操作数转换为字符串,再将两个字符串拼接 |
有一个操作数是对象、数值、布尔值 | 调用其 toString() 方法获取字符串,再应用上述字符串规则 |
有一个操作数是 undefined、null | 调用其 String() 方法获取 “undefined” 或 “null”,再应用上述字符串规则 |
(2)减法操作符( - )
情况 | 规则 |
---|---|
两个操作数都是数值 | 有任一操作数是 NaN,返回 NaN Infinity - Infinity = NaN +0 - +0 = +0 +0 - -0 = -0 -0 + -0 = +0 |
有一个操作数是字符串、布尔值、null、undefined | 用 Number() 转换为数值,再根据前面规则 |
有一个操作数是对象 | 调用 valueOf() 方法取得表示它的数值,如果值是 NaN,则结果为 NaN 如果没有 valueOf() 方法,则调用 toString() 得到字符串转换为数值计算 |
关系操作符
小于(<
)、大于(>
)、小于等于(<=
)、大于等于(>=
)
比较应用以下规则,均返回布尔值
情况 | 规则 |
---|---|
两个操作数都是数值 | 数值比较 |
有一个操作数是字符串 | 逐个比较字符串中对应字符的编码 |
有一个操作数是对象 | 调用 valueOf() 方法取得表示它的数值,再进行比较 如果没有 valueOf() 方法,则调用 toString() 得到字符串,再进行比较 |
有一个操作数是布尔值 | 将其转换为数值后比较 |
相等操作符
(1)等于(==
)和不等于(!=
)
- 两个操作符会先进行强制类型转换,再确定是否相等
情况 | 规则 |
---|---|
有任一操作数是布尔值 | 将其转换为数值后再比较是否相等。true 转换为 1、false 转换为 0 |
有任一操作数是字符串 另一个操作数是数值 | 尝试将字符串转换为数值,再比较是否相等 |
有任一操作数是对象 另一个不是 | 调用 valueOf() 方法取得原始值,再进行前面的规则比较 |
同时还要遵循如下规则
- null 和 undefined 相等
- null 和 undefined 不能转换为其他类型的值再比较
- 有任一操作数是 NaN,则相等操作符返回 false,不相等操作符返回 true
- 两个操作数都是对象,则比较他们是否不是同一地址的对象
(2)全等(===
)和不全等(!==
)
- 只有两个操作数在不转换的前提下相等才返回 true