操作符及隐式转换规则
逻辑非,逻辑与,逻辑或
- 布尔操作符中包括
逻辑非!,逻辑与&&,逻辑或||。 逻辑非!无论应用什么类型,返回的永远都是布尔值。
| 操作数 | 返回值 |
|---|---|
| 对象 | false |
| 空字符串 | true |
| 非空字符串 | false |
| 数值0 | true |
| 非0数值(包括infinity) | false |
| null | true |
| NaN | true |
| undefined | true |
- 如果使用
!!,作用就等同于Boolean()方法,第一个感叹号会将操作数转为布尔值,第二个非会取反从而得到变量真正对应的布尔值。 逻辑与&&一假即假逻辑或||一真即真逻辑或||第一个操作数如果为true就不会再求后面的值了,现实中可以利用||的这一个特性来避免给变量赋值null或undifined乘性操作符- 乘性操作符的特殊规则如下表:
| 操作数1 | 符号 | 操作数2 | 规则 |
|---|---|---|---|
| 正数值 | * | 正数值 | 得到正数值,超出范围输出infinity |
| 负数值 | * | 负数值 | 得到正数值,超出范围输出infinity |
| 正数值 | * | 负数值 | 得到负数值,超出范围输出-infinity |
| 负数值 | * | 正数值 | 得到负数值,超出范围输出-infinity |
| NaN | * | 任意操作数 | 输出NaN |
| infinty | * | 0 | 输出 NaN |
| infinty | * | 非0有限数值 | 根据第二个操作数符号来输出 infinty 或者 -infinty |
| infinty | * | infinty | 输出 infinty |
如果不是数值的操作数,可以用Number()方法转换后再计算
除法操作符
- 除法操作符的特殊规则如下表:
| 操作数1 | 符号 | 操作数2 | 规则 |
| --- |---| --- | --- |
| 正数值 |
/| 正数值 | 得到正数值,超出范围输出infinity | | 负数值 |/| 负数值 | 得到正数值,超出范围输出infinity | | 正数值 |/| 负数值 | 得到负数值,超出范围输出-infinity | | 负数值 |/|正数值 | 得到负数值,超出范围输出-infinity | | NaN |/| 任意操作数 | 输出NaN | | infinty |/| infinty | 输出 NaN | | 0 |/| 0 | 输出 NaN | | 非0有限数值 |/| 0 | 根据第一个操作数符号输出 infinty或者-infinty | | infinty |/| 任何数值 | 根据第二个操作数符号输出 infinty或者-infinty |
如果不是数值的操作数,可以用Number()方法转换后再计算
取模操作符
- 取模操作符的特殊规则如下表:
| 操作数1 | 符号 | 操作数2 | 规则 |
| --- |---| --- | --- |
| 数值 |
%| 数值 | 遵循除法规则,输出余数 | | 无限值 |%| 有限值 | 输出NaN | | 有限值 |%| 0 | 输出NaN | | infinty |%| infinty | 输出NaN | | 有限值 |%| 无限值 | 输出有限值 | | 0 |%| 非0数值 | 输出0 |
如果不是数值的操作数,可以用Number()方法转换后再计算
指数操作符
- 指数操作符为
**,计算方法类似于Math.pow()
console.log( 3 ** 2 ) //输出9
console.log( Math.pow(3,2) ) //输出9
- 指数赋值操作符为
**=
let squard = 3;
squard **= 2;
console.log(squard) //输出9
加性操作符
-
加性操作符一般用于求两数之和
-
加性操作符针对两个数值的规则: | 操作数1 | 符号 | 操作数2 | 规则 | | --- |---| --- | --- | | NaN |
+| 任意数值 | 输出NaN | | infinty |+| infinty | 输出infinty | | -infinty |+| -infinty | 输出-infinty | | infinty |+| -infinty | 输出NaN | | +0 |+| +0 | 输出+0 | | +0 |+| -0 | 输出+0 | | -0 |+| -0 | 输出-0 | -
加性操作符针对字符串的规则: | 操作数1 | 符号 | 操作数2 | 规则 | | --- |---| --- | --- | | 字符串1 |
+| 字符串2 | 拼接字符串 | | 字符串1 |+| 非字符串 | 先将第二个操作数转化为字符串再进行拼接 |
减法操作符
- 减法操作符针对两个数值的规则:
| 操作数1 | 符号 | 操作数2 | 规则 |
| --- |---| --- | --- |
| 数值1 |
-| 数值2 | 执行数学减法运算并返回结果 | | NaN |-| 数值 | 返回NaN | | infinty |-| infinty | 返回NaN | | -infinty |-| -infinty | 返回NaN | | infinty |-| -infinty | 返回infinty | | -infinty |-| infinty | 返回-infinty | | +0 |-| +0 | 返回+0 | | +0 |-| -0 | 返回-0 | | -0 |-| -0 | 返回+0 | | 字符串,布尔值,null,undifined |-| 数值 | 先将非数值调用Number()方法转化后在进行减法计算 | | 对象 |-| 数值 | 先将对象调用valueOf()方法,没有valueOf方法调用toString()方法转化后在进行减法计算 |
关系操作符
- 关系操作符包括
小于(<),大于(>),小于等于(<=),大于等于(>=),这几个操作均返回布尔值。 - 关系操作符的规则:
| 操作数1 | 符号 | 操作数2 | 规则 |
|---|---|---|---|
| 数值1 | <,>,<=,>= | 数值2 | 执行数值比较 |
| 字符串1 | <,>,<=,>= | 字符串2 | 逐个比较字符串中对应字符的编码 |
| 数值 | <,>,<=,>= | 任意操作数 | 会将非数值的操作数转化为数值后进行数值比较 |
| 对象 | <,>,<=,>= | 任意操作数 | 先将对象调用valueOf()方法,没有valueOf方法调用toString()方法转化后在进行比较 |
| 布尔值 | <,>,<=,>= | 任意操作数 | 会将其转化为数值后再进行比较 |
相等操作符
-
等于(
==)和不等于(!=) ,两个操作符都会先进性强制类型转换,再确定操作数是否相等。 -
相等操作符转换规则: | 操作数1 | 符号 | 操作数2 | 规则 | | --- |---| --- | --- | | 布尔值 |
==或!=| 数值 | 会将布尔值转化为数值在进行比较,true转化为1,false转化为0 | | 字符串 |==或!=| 数值 | 会尝试将字符串转化为数值在进行比较 | | 对象 |==或!=| 数值 | 会尝试调用valueOf()方法取得对象的原始值,再进行比较 | | NaN |==或!=| 任意操作数 | ==返回false,!=返回true | | 对象 |==或!=| 对象 | 比较两个操作数是否指向同一个对象 | | null |==或!=| undifined | null和undifined是相等的,且二者不能转化为其他类型进行比较 | -
全等(
===)和不全等(!===)必须是在不进行类型转换的前提下相等才返回true,否则返回false。这里有一个特殊情况,null == undifined(返回true),null === undifined(返回false)。
条件操作符
- 条件操作符也就是我们常说的三目表达运算符,即
条件 ? 结果1 : 结果2,这里如果条件成立为true,返回结果1,反之false返回结果2。
赋值操作符
- 简单的赋值操作用
=就可以完成 - 复合赋值运算符如下,利用这些运算符并不会对性能有所提升。
| 表达式 | 符号 | 规则 |
| --- |--- | --- |
| a *= b | 乘后赋值(
*=) | a = a * b | | a /= b | 除后赋值(/=) | a = a / b | | a %= b|取模后赋值(%=) | a = a % b | | a += b| 加后赋值(+=) | a = a + b | | a -= b| 减后赋值(-=) | a = a - b |
还有一些其他的位运算符以及复合运算符,在实际开发中用的很少,有兴趣的可以自行查阅一下资料。
逗号操作符
- 逗号操作符用来在一条语句中执行多个操作,一般最经常用的情景是同事声明多个变量的情况
let num1 = 1 , num2 = 2 , num3 = 3;