JavaScript 复习之运算符

192 阅读3分钟

一、算术运算符

JavaSscript 提供 10 个算术运算符:

  1. 加法运算符:+
  2. 减法运算符:-
  3. 乘法运算符:*
  4. 除法运算符:/
  5. 指数运算符:**,如x**y
  6. 余数运算符:%
  7. 自增运算符:x++或者++x
  8. 自减运算符:x--或者--x
  9. 数值运算符:+x
  10. 负数值运算符:-x

这里介绍几个特别的列子:

JavaScript 允许非数值相加

true + true  // 2
1 + true // 2

对象的相加

如果运算子是对象,必须先转化为原始类型的值,然后再相加。

var obj = { p:1 };
obj + 2 // "[object Object]2"

对象转成原始类型的值,规则如下:

首先调用对象的 valueof()方法。

var obj = { p: 1 };
obj.valueOf() // { p: 1 }

一般来说,对象的valueOf方法总是返回对象自身,这时再自动调用对象的toString方法,将其转为字符串。

var obj = { p: 1 };
obj.valueOf().toString() // "[object Object]"

自增和自减运算符

自增和自减运算符需要注意的是。当运算符放在变量之后,会先返回变量操作之前的值,在进行自增和自减的操作;放在变量之前,会先进行自增和自减操作,在返回变量操作后的值

数值运算符

+true // 1
+[] // 0
+{} // NaN

赋值运算符

// 等同于 x = 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
x **= y

二、比较运算符

有 8 个比较运算符:

  1. >
  2. <
  3. >=
  4. <=
  5. ==
  6. !=
  7. ===
  8. !===

非相等运算符:非字符串的比较

  • 如果两个运算子都是基础类型的值,先转化为数值在比较。需要注意的是任何与NaN的比较都返回false
  • 如果运算子是对象,先转化为基础类型的值,在比较
[2] > [11] // true
// 等同于 [2].valueOf().toString() > [11].valueOf().toString()
// 即 '2' > '11'

严格相等运算符

  • 需要注意的是两个复合类型(数组,对象,函数)的数据作比较时,不是比较他们的值是否相等,而是比较他们是否指向同一个地址。
{} === {} // false
[] === [] // false
(function () {} === function () {}) // false
var v1 = {};
var v2 = v1;
v1 === v2 // true
  • undefinednull与自身严格相等

相等运算符

  • 原始类型的值会转换成数值再进行比较。
  • 对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转换成原始类型的值,再进行比较。
  • undefinednull与其他类型的值比较时,结果都为false,它们互相比较时结果为true

三、布尔运算符

包含四个运算符

  1. 取反运算符:!
  2. 且运算符:&&
  3. 或运算符:||
  4. 三元运算符:?:

四、二进制位运算符

二进制位运算符用于直接对二进制位进行计算,有 7 个:

类型 符号 规则
二进制或运算符 | 若两个二进制位都为0,则结果为0,否则为1
二进制与运算符 & 若两个二进制位都为1,则结果为1,否则为0
二进制否运算符 ~ 若两个二进制位不相同,则结果为1,否则为0
左移运算符 <<
右移运算符 >>
带符号位的右移运算符 >>>

五、其他运算符

void 运算符

void运算符的作用时执行一个表达式,不返回任何值,或者说返回undefined

逗号运算符

逗号运算符用于对两个表达式求值,并返回后一个表达式的值。

'a', 'b' // "b"

var x = 0;
var y = (x++, 10);
x // 1
y // 10