一,算术运算符
1.除了加法运算符,其他算术运算符(比如减法、除法和乘法)都不会发生重载。它们的规则是:所有运算子一律转为数值,再进行相应的数学运算。
2.对象的相加,必须先转成原始类型的值,然后再相加。
- 对象转成原始类型的值:对象的
valueOf
方法总是返回对象自身,这时再自动调用对象的toString
方法,将其转为字符串。
true + true // 2
1 + true // 2
1 + 'a' // "1a"
false + 'a' // "falsea"
'3' + 4 + 5 // "345"
3 + 4 + '5' // "75"
var obj = { p: 1 };
obj + 2 // "[object Object]2"
obj.valueOf() // { p: 1 }
obj.valueOf().toString() // "[object Object]"
3.余数运算符(%
)运算结果的正负号由第一个运算子的正负号决定。
4.数值运算符(+
)同样使用加号,但它是一元运算符(只需要一个操作数),而加法运算符是二元运算符(需要两个操作数)。
- 数值运算符+的作用在于可以将任何值转为数值(与
Number
函数的作用相同)。 - 负数值运算符
-
,也同样具有将一个值转为数值的功能。
5.指数运算符**是右结合,先进行最右边的计算。
二,比较运算符
1.比较运算符用于比较两个值的大小,然后返回一个布尔值。
2.对于非相等的比较,算法是先看两个运算子是否都是字符串,如果是的,就按照字典顺序比较(实际上是比较 Unicode 码点);否则,将两个运算子都转成数值,再比较数值的大小。
如果两个运算子之中,至少有一个不是字符串,需要分成以下两种情况。
- 如果两个运算子都是原始类型的值,则是先转成数值再比较。
- 如果运算子是对象,会转为原始类型的值,再进行比较。
3.严格相等===
运算符
比较它们是否为“同一类型的相等值”。
4.两个复合类型(对象、数组、函数)的数据===比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个地址。
{} === {} // false
[] === [] // false
(function () {} === function () {}) // false
var v1;
var v2;
v1 === v2 // true
5.相等==运算符比较不同类型的数据时,相等运算符会先将数据进行类型转换。
- 原始类型的值会转换成数值再进行比较。
- 对象(包括数组和函数)与原始类型的值比较时,对象转换成原始类型的值,再进行比较。
三,布尔运算符
1.取反!是一个感叹号,用于将布尔值变为相反值。
- 对于非布尔值,取反运算符会将其转为布尔值。只有以下六个值取反后为
true
!undefined // true
!null // true
!0 // true
!NaN // true
!"" // true
!54 // false
!'hello' // false
![] // false
!{} // false
2.且(&&)返回的是值,不是布尔值。
- 如果第一个运算子的布尔值为
true
,则返回第二个运算子的值。 - 如果第一个运算子的布尔值为
false
,则直接返回第一个运算子的值,且不再对第二个运算子求值。
't' && '' // ""
't' && 'f' // "f"
't' && (1 + 2) // 3
'' && 'f' // ""
'' && '' // ""
var x = 1;
(1 - 1) && ( x += 1) // 0
x // 1
3.或||运算符同样支持跳过第二个运算子的机制,被称为“短路”机制。
4.位运算符只对整数起作用,如果一个运算子不是整数,会自动转为整数后再执行。
5.虽然在 JavaScript 内部,数值都是以64位浮点数的形式储存,但是做位运算的时候,是以32位带符号的整数进行运算的,并且返回值也是一个32位带符号的整数。
function toInt32(x) {
return x | 0;
}
toInt32(1.001) // 1
toInt32(1.999) // 1
toInt32(1) // 1
toInt32(-1) // -1
toInt32(Math.pow(2, 32) + 1) // 1
toInt32(Math.pow(2, 32) - 1) // -1
6.一个数与自身的取反~值相加,等于-1。
7.两数进行三次异或^运算,可以互换它们的值。
8.头部补零的右移运算符>>>
与右移运算符>>
只有一个差别,就是一个数的二进制形式向右移动时,头部一律补零,而不考虑符号位。
10.位运算符可以用来取整。
四,void运算符
1.void
运算符的作用是执行一个表达式,然后不返回任何值,或者说返回undefined
。
void (x = 5) //undefined
x // 5
五,逗号运算符
1.逗号运算符用于对两个表达式求值,并返回后一个表达式的值。
'a', 'b' // "b"
var y = (x++, 10);
x // 1
y // 10