算数运算符
JavaScript 共提供10个算术运算符
- 加法运算符:
x + y
- 减法运算符:
x - y
- 乘法运算符:
x * y
- 除法运算符:
x / y
- 指数运算符:
x ** y
- 余数运算符:
x % y
- 自增运算符:
++x
或者x++
- 自减运算符:
--x
或者x--
- 数值运算符:
+x
- 负数值运算符:
-x
加法运算符
1、求两个数值的和
1 + 1 // 2
2、非数值的相加
true + true // 2
//两个布尔值相加,布尔值会自动转化为数值然后再相加
1 + true // 2
3、两个字符串相加
'a' + 'bc' // "abc"
这时加法运算符会变成连接运算符,返回一个新的字符串,将两个原字符串连接在一起。
4、字符串和非字符串相加
1 + 'a' // "1a"
false + 'a' // "falsea"
这时非字符串会转成字符串,再连接在一起。
加法运算符是在运行时决定,到底是执行相加,还是执行连接。运算子的不同,导致了不同的语法行为,这种现象称为“重载”(overload)
由于从左到右的运算次序,字符串的位置不同会导致不同的结果。
'3' + 4 + 5 // "345"
3 + 4 + '5' // "75"
-减法、除法和乘法运算符,都是将字符串自动转为数值,然后再运算。
5、对象的相加
- 如果运算子是对象,必须先转成原始类型的值,然后再相加。
var obj = { p: 1 };
obj + 2 // "[object Object]2"
//对象obj转成原始类型的值是[object Object],再加2就得到了上面的结果。
余数运算符
- 余数运算符(%)返回前一个运算子被后一个运算子除,所得的余数。
12 % 5 // 2
- 需要注意的是,运算结果的正负号由第一个运算子的正负号决定。
-1 % 2 // -1
1 % -2 // 1
- 自增和自减运算符有一个需要注意的地方,就是放在变量之后,会先返回变量操作前的值,再进行自增/自减操作;放在变量之前,会先进行自增/自减操作,再返回变量操作后的值。
var x = 1;
var y = 1;
x++ // 1
++y // 2
数值运算符,负数值运算符
- 数值运算符(+),只需要一个操作数,可以将任何值转为数值(与Number函数的作用相同)。
+true // 1
+[] // 0
+{} // NaN
- 负数值运算符(-),得到的值正负相反,连用两个负数值运算符,等同于数值运算符。
var x = 1;
-x // -1
-(-x) // 1
- 数值运算符号和负数值运算符,都会返回一个新的值,而不会改变原始变量的值。
指数运算符
- 指数运算符(**)完成指数运算,前一个运算子是底数,后一个运算子是指数。
2 ** 4 // 16
- 多个指数运算符连用时,先进行最右边的计算。
比较运算符
JavaScript 一共提供了8个比较运算符。
-
>
大于运算符 -
<
小于运算符 -
<=
小于或等于运算符 -
>=
大于或等于运算符 -
==
相等运算符 -
===
严格相等运算符 -
!=
不相等运算符 -
!==
严格不相等运算符
- 比较运算符可以比较各种类型的值,不仅仅是数值。
- 八个比较运算符分成两类:
1、相等比较
2、非相等比较:
非相等比较算法是先看两个运算子是否都是字符串,如果是的,就按照字典顺序比较(实际上是比较 Unicode 码点);否则,将两个运算子都转成数值,再比较数值的大小。
布尔运算符
- 布尔运算符用于将表达式转为布尔值,一共包含四个运算符:
1、取反运算符:!
- 用于将布尔值变为相反值,即
true
变成false
,false
变成true
。 - 对于非布尔值,取反运算符会将其转为布尔值。
- 以下六个值取反后为
true
,其他值都为false
:
undefined
null
false
0
NaN
空字符串('')
- 不管什么类型的值,经过取反运算后,都变成了布尔值。
2、且运算符:&&
- 且运算符(&&)往往用于多个表达式的求值。
- 运算规则是:如果第一个运算子的布尔值为true,则返回第二个运算子的值(注意是值,不是布尔值);如果第一个运算子的布尔值为false,则直接返回第一个运算子的值,且不再对第二个运算子求值。
't' && '' // ""
't' && 'f' // "f"
't' && (1 + 2) // 3
'' && 'f' // ""
'' && '' // ""
- 且运算符可以多个连用,这时返回第一个布尔值为false的表达式的值。如果所有表达式的布尔值都为true,则返回最后一个表达式的值。
true && 'foo' && '' && 4 && 'foo' && true
// ''
//第一个为布尔值为false的表达式是第三个表达式,所以返回''
1 && 2 && 3
// 3
//所有表达式都为true,所以返回最后一个表达式 3
3、或运算符:||
- 或运算符(||)用于多个表达式的求值。
- 运算规则是:如果第一个运算子的布尔值为true,则返回第一个运算子的值,且不再对第二个运算子求值;如果第一个运算子的布尔值为false,则返回第二个运算子的值。
't' || '' // "t"
't' || 'f' // "t"
'' || 'f' // "f"
'' || '' // ""
- 或运算符可以多个连用,这时返回第一个布尔值为true的表达式的值。如果所有表达式都为false,则返回最后一个表达式的值
false || 0 || '' || 4 || 'foo' || true
// 4
false || 0 || ''
// ''
4、三元运算符:?:
- 三元条件运算符由问号(?)和冒号(:)组成,分隔三个表达式
- 是 JavaScript 语言唯一一个需要三个运算子的运算符
- 如果第一个表达式的布尔值为true,则返回第二个表达式的值,否则返回第三个表达式的值。
't' ? 'hello' : 'world' // "hello"
//t的布尔值为true,返回第二个表达式的值
0 ? 'hello' : 'world' // "world"
//0 的布尔值为false,返回第三个表达式的值
三元条件表达式与if...else语句具有同样表达效果。但if...else是语句,没有返回值,而三元条件表达式是一个表达式,具有返回值
在需要返回值的场合,只能使用三元条件表达式,而不能使用if..else。例如:
console.log(true ? 'T' : 'F');
上面代码中,console.log
方法的参数必须是一个表达式,这时就只能使用三元条件表达式。如果要用if...else
语句,就必须改变整个代码写法了。
二进制位运算符
-
二进制位运算符用于直接对二进制位进行计算,一共有7个
此图来自