Skip to content

3.3 运算符

3.3.1 基本概念

表达式:由常量/变量和运算符组成的短语;

操作数:表达式中的常量和变量成为操作数;

运算符:表达式中起运算作用的符合成为运算符;

单目运算符:只能带一个操作数的成为单目运算符;(也叫一元运算符)

多目运算符:带多个操作数的成为多目运算符;

3.3.2 赋值运算符:

赋值运算符用于给 JavaScript 变量赋值。

= x=y

+= x+=y 等价于 x=x+y

-= x-=y 等价于 x=x-y

*= x*=y 等价于 x=x*y

/= x/=y 等价于 x=x/y

%= x%=y 等价于 x=x%y

3.3.3 算术运算符

加法操作符+

  1. 如果有任一操作数是NaN,则返回NaN
  2. 如果是Infinity(无穷)Infinity(无穷),则返回Infinity(无穷)
  3. 如果是-Infinity(无穷)-Infinity(无穷),则返回-Infinity(无穷)
  4. 如果是Infinity(无穷)-Infinity(无穷),则返回NaN
  5. 如果是+0+0,则返回+0
  6. 如果是-0+0,则返回+0
  7. 如果是-0-0,则返回-0
  8. 如果两个操作数都是字符串,则将第二个字符串拼接到第一个字符串后面
  9. 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,再将两个字符串拼接在一起

减法操作符-

如果两个操作数都是数值,则执行数学减法运算并返回结果
如果有任一操作数是NaN,则返回NaN
如果是InfinityInfinity,则返回NaN
如果是-Infinity-Infinity,则返回NaN
如果是Infinity-Infinity,则返回Infinity
如果是-InfinityInfinity,则返回-Infinity
如果是+0+0,则返回+0
如果是+0-0,则返回-0
如果是-0-0,则返回+0
如果有任一操作数是字符串布尔值nullundefined,则先在后台使用Number()将其转换为数值,然后再根据前面的规则执行数学运算。如果转换结果是NaN,则减法计算的结果是NaN 如果有任一操作数是对象,则调用其valueOf()方法取得表示它的数值

乘法操作符*

  1. 正值相乘是正值,负值相乘也是正值,正负符号不同的值相乘得到负值
  2. 任意值乘NaN,得到NaN
  3. 任意值乘0,得到0
  4. 任意Infinity(无穷)NaN,得到NaN

除法操作符/

  1. 正值除是正值,负值相除也是正值,正负符号不同的值相除得到负值
  2. 任意值是NaN,得到NaN
  3. 任意值除0,得到Infinity(无穷)
  4. Infinity(无穷)Infinity(无穷),得到NaN
  5. 00,得到NaN

取模运算符:%

  1. 如果被除数是无限值,除数是有限值,则返回NaN
  2. 如果被除数是有限值,除数是0,则返回NaN
  3. 如果是Infinity(无穷)除以Infinity(无穷),则返回NaN
  4. 如果被除数是有限值,除数是无限值,则返回被除数
  5. 如果被除数是0,除数不是0,则返回0
  • 正负运算符:+(如果连接的是两个数字字符串,则数字相连) -(字符串能变成数字的自动变成数字后相减)“20”+2-6=196

递增递减运算符:++--:

使数字递增/递减1(注意前置和后置的区别)

  1. 若没有赋值前置和后置没有区别
  2. 若有赋值:前置则先计算递增/减后赋值,后置则相反

3.3.4 比较运算符

比较运算符是比较两个数的大小的运算符,返回的是一个布尔值。

  • 相等运算符 == 判断两个操作数是否相等。不同的数据类型会自动转换为相等的数据类型再做比较。
js
"hello"==true//false
  • 等同运算符 === 全等(值和类型),严格意义的相等,两个操作数的值和他们的类型必须完全一致。

  • 不等于:!=

  • 不等同运算符: !==

  • 大于:>

  • 小于:<

  • 大于或等于:>=

  • 小于或等于:<=

TIP

  • 若一个是数值字符串,一个是数值,字符串会自动转换成数值进行比较。
  • 若两个都是字符串,则比较首个数字的大小。
  • 字母字符串会转换成对应的ASCII码(较少用到,不做讲解,知道即可)
  • 布尔值的false和true会转换成0和1

3.3.5 逻辑运算符

逻辑运算符用于测定变量或值之间的逻辑。

  • && and(与)

  • || or(或)

  • !not(非)

  • !!双重否定运算符,效果完全等价于Boolean()

js
console.log(true && true ,false && true, false && false); // true false false

console.log(true || true ,false || true, false || false); // true true false

console.log(!0,!1);    // true false

console.log(!!0,Boolean(0));  // false false
console.log(!!1,Boolean(1)); // true true

3.3.6 三元运算符

根据条件在两个语句中执行其中的一个,使用符号?:语法如下:

plaintext
条件表达式 ?: 语句1 : 语句2

参数说明:

条件表达式:结果会被作为布尔值处理
语句1:如果条件表达式返回true则执行语句1
语句2:如果条件表达式返回false则执行语句2

js
function fn(num) {
    return (num > 0) ?'大于零' : (num === 0) ?  '等于零' :'小于零'
}
console.log(fn(20)) // => 大于零
console.log(fn(0)) // => 等于零
console.log(fn(-20)) // => 小于零

3.3.7 运算符优先级

运算符优先级描述了在计算表达式时执行运算的顺序。先执行具有较高优先级的运算,然后执行较低优先级的运算。例如,先执行相乘,再执行相加。

优先级顺序从上往下依次顺序,从左到右:

  1. 小括号()

有括号先算括号里面的;

  1. 一元运算符

加加++、减减--、非!

  1. 算数运算符

*、除/、取于%、加+、减-

  1. 关系运算符

大于>、大于等于>=、小于<、小于等于<=

  1. 相等运算符

等于==、不等于!=、全等于===、不全等!==

  1. 逻辑运算符

&&、或||

  1. 点符号.(访问对象)

  2. 赋值运算符=

  3. 逗号运算符,

js
var a={n:1};   // a → {n:1}
a.x=a={n:2}; // .优先级高于=  所以 此时  a → {n:1,x:undefined}   然后在执行 执行a = {n:2}  所以 a → {n:2}
console.log(a.) // {n:2}
console.log(a.x) // undefined