操作符及隐式转换规则

472 阅读6分钟

操作符及隐式转换规则

逻辑非,逻辑与,逻辑或

  • 布尔操作符中包括逻辑非!逻辑与&&逻辑或||
  • 逻辑非!无论应用什么类型,返回的永远都是布尔值。
操作数返回值
对象false
空字符串true
非空字符串false
数值0true
非0数值(包括infinity)false
nulltrue
NaNtrue
undefinedtrue
  • 如果使用!!,作用就等同于Boolean()方法,第一个感叹号会将操作数转为布尔值,第二个非会取反从而得到变量真正对应的布尔值。
  • 逻辑与&&一假即假
  • 逻辑或||一真即真
  • 逻辑或||第一个操作数如果为true就不会再求后面的值了,现实中可以利用||的这一个特性来避免给变量赋值nullundifined 乘性操作符
  • 乘性操作符的特殊规则如下表:
操作数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;