Skip to content

操作符

一元操作符

  • 定义:只操作一个值的操作符
(1)递增 / 递减操作符
  • 操作符

    1. ++:给数值加一
    2. --:给数值减一
  • 操作

    1. 前缀操作:变量的值都会在语句被求值之前改变
    2. 后缀操作:在语句被求值后才发生改变
  • 类型转换规则。转换后的类型均为 Number 类型

类型规则
String- 有效的数值形式,则转换为数值再应用改变
- 无效的数值形式,则值设置为 NaN
Boolean- true,转换为 1,再应用改变。
- false,转换为 0, 再应用改变
Number加一或减一
Object1. 调用其 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)逻辑与:由 && 表示
  • 返回规则

    1. 如果第一个操作数是真值,返回第二个操作数
    2. 如果第一个操作数是假值,返回第一个操作数
  • 短路特性:如果第一个操作数是假值了,则永远不会执行第二个操作数

    js
    const reuslt = false && unVariable // unVariable 未定义,但不会报错,因为第一个操作数是假值
(3)逻辑或:由 || 表示
  • 返回规则

    1. 如果第一个操作数是真值,返回第一个操作数
    2. 如果第一个操作数是假值,返回第二个操作数
  • 短路特性:如果第一个操作数是真值了,则永远不会执行第二个操作数

    js
    const 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)

    js
    Math.pow(3, 2) // 9
    3 ** 2 //9
  • 指数赋值操作符 **=

    js
    let 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