一、算术运算符
- number 运算
- 加减乘除(除以0会变为正负无穷
Infinity)
- 余数
x % 7
- 指数
x ** 3
- 自增自减
x++ / ++x(区别: 值不同,x++的值是x,++x的值是++x,x在前为前,x在后为后)
/ x-- / --x(x在前为前,x在后为后)
- 求值运算符 +x(不改变符号)
- 负数运算符 -x(会改变符号)
- string 运算
- 尽量少用自增自减,因为容易记错
- 不同类型不要加起来
二、比较运算符
>
<
>=
<=
==(模糊相等)
!=(不模糊相等)
===(全等)
!==(不相等)
- JS三位一体

0 == []
0 == '0'
0 == '\t'
但是右边三个互不相等
- 忠告:永远不要使用 ==,用 === 代替,== 的问题在于,它总是自动类型转换
- x === y 真值表

- 没有任何费解
- 基本类型看值是否相等
- 对象看地址是否相等
- 特例,强行记忆一下:
NaN !== NaN
[] !== []
{} !== {}
三、布尔运算符
- 或且非
|| 或
&& 且
! 非
- 短路逻辑
console && console.log && console.log('hi') ,防御性代码,以防 console 不存在报错
console?.log?('hi'),可选链语法
a = a || 100a 的保底值是100,建议使用新语法:
function add(n=0){
return n+1
}
四、二进制位运算符
- 或、与、否
| 两个位都为0,则结果为0,否则为1
&
- ~
- 异或
- 左移右移
- 头部补零的右移运算符
五、位运算符
- 使用与运算符判断奇偶
偶数 & 1 = 0
奇数 & 1 = 1
- 使用~, >>, <<, >>>, |来取整
console.log(~~ 6.83)
console.log(6.83 >> 0)
console.log(6.83 << 0)
console.log(6.83 | 0)
console.log(6.83 >>> 0)
- 使用^来交换 a b 的值
var a = 5
var b = 8
a ^= b
b ^= a
a ^= b
console.log(a) // 8
console.log(b) // 5
六、其他运算符
- 点运算符
- 语法:对象.属性名 = 属性值
- 作用:读取对象的属性值
- 有个疑问,不是对象,为什么也可以有属性?
'a-b-c'.split('-')
- 因为:JS 有特殊逻辑,点前面不是对象,就把它封装成对象,number 会变成 Number 对象,string 会变成 String 对象,bool 会变成 Boolean 对象
- void 运算符
- 语法:void 表达式或语句
- 作用:求表达式的值,或执行语句,然后 void 的值总是undefined
- 需求
<a href="http://example.com" onclick="f(); return false;">点击</a>
return 假值可以阻止默认动作
<a href="javascript: void(f())">文字</a>
- 逗号运算符
- 语法:表达式1, 表达式2, ..., 表达式n
- 作用:将表达式 n 的值作为整体的值
- 使用
let a = (1,2,3,4,5)
那么 a 的值就是 5,奇葩吧?
let f = (x) => (console.log('平方值为'), x*x)
注意上面的括号不能省