运算符
算术(数学)运算
支持:加(+)、减(-)、乘(*)、除(/)、求余(%)
值得注意的是,+和-可以放到单个数据的前面,表示正负。
算术运算的表达式一定返回数字,可以利用其特点做类型转换,参考类型的隐式转换
字符串拼接
当+的两端有一个是字符串时,不再进行算术运算,而变为字符串拼接
表达式一定返回 string,可以利用其特点做类型转换,参考类型的隐式转换
赋值运算
涉及的运算符:= += *= /= -= %=。
其中,a += xxx,等效于a = a + (xxx),其他类似
小贴士
赋值表达式始终返回赋值结果,我们可以利用该特点完成连续赋值
1
2 // 将 3 同时赋值给 a、b
a = b = 3;
比较运算
涉及的运算符:== === != !== > >= < <=
小贴士
在实际开发中,没有任何理由使用==和!=,你可以当做这两个运算符并不存在。
应该始终使用===和!==来比较相等和不相等
比较运算始终返回 boolean,我们可以利用这一点来完成某些赋值
1
2
3
4
5
6
7
8
9 // 啰嗦的代码
if (sex === "男") {
user.isMale = true;
} else {
user.isMale = false;
}
// 简洁优雅的代码
user.isMale = sex === "男";
逻辑运算
逻辑运算会涉及到布尔判定
运算符:!
对后面的数据取反,表达式一定返回 boolean。
可以利用其特点做类型转换,参考类型的隐式转换
运算符:&&
并且,真真为真,其他为假,具有短路规则。
表达式返回最后一个判定的数据
小贴士
在实际的开发中,我们可以利用短路规则简化代码
1
2
3
4
5
6
7
8
9 // 实现功能,如果exp有值(判定为真),就输出ok
// 啰嗦的代码
if (exp) {
console.log(exp);
}
// 简洁的代码
exp && console.log(exp);
运算符:||
或者,假假为假,其他为真,具有短路规则。
表达式返回最后一个判定的数据
小贴士
在实际的开发中,我们可以利用短路规则简化代码
1
2
3
4
5
6
7
8
9
10
11 // 实现功能,如果exp有值,就把它的值赋值给n,如果没有值,就给n赋值为默认值 1
// 啰嗦的代码
if (exp) {
n = exp;
} else {
n = 1;
}
// 简洁的代码
n = exp || 1;
运算符:? :,格式a ? b : c
三目运算,判定 a,为真时表达式返回 b,否则返回 c
小贴士
三目运算通常用于替代一些简单的 if 结构
1
2
3
4
5
6
7
8
9
10 // 如果exp为真,则把1赋值给n,否则,把2赋值给n
// 啰嗦的代码
if (exp) {
n = 1;
} else {
n = 2;
}
// 更简洁的代码
n = exp ? 1 : 2;
布尔判定
所有需要判断真假的地方都会使用下面的规则
| 数据 | 判定 |
|---|---|
false null undefined 0 NaN '' |
false |
| 剩余所有数据 | true |
类型的隐式转换
每个运算符都有自己期望的数据,比如*期望两端都是数字
一旦数据不符合运算符的期望,js 就会悄悄的对数据进行类型转换,把它转换成期望的值后进行运算。
值得注意的是,这种转换是 临时 的,并不会对原数据造成影响
小贴士
在实际的开发中,我们可以利用类型的隐式转换完成以下功能:
1
2
3 var n = +a; // 不管a是啥,都会被转换成数字,保存到n中
var s = a + ""; // 不管a是啥,都会被转换成字符串,保存到s中
var b = !!a; // 不管a是啥,都会被转换成boolean,保存到b中