一、算术运算符
JavaSscript 提供 10 个算术运算符:
- 加法运算符:
+ - 减法运算符:
- - 乘法运算符:
* - 除法运算符:
/ - 指数运算符:
**,如x**y - 余数运算符:
% - 自增运算符:
x++或者++x - 自减运算符:
x--或者--x - 数值运算符:
+x - 负数值运算符:
-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 个比较运算符:
><>=<===!====!===
非相等运算符:非字符串的比较
- 如果两个运算子都是基础类型的值,先转化为数值在比较。需要注意的是任何与
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
undefined和null与自身严格相等
相等运算符
- 原始类型的值会转换成数值再进行比较。
- 对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转换成原始类型的值,再进行比较。
undefined和null与其他类型的值比较时,结果都为false,它们互相比较时结果为true。
三、布尔运算符
包含四个运算符
- 取反运算符:
! - 且运算符:
&& - 或运算符:
|| - 三元运算符:
?:
四、二进制位运算符
二进制位运算符用于直接对二进制位进行计算,有 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