1.算术运算符
1.1.number 运算
1.1.1.加减除乘
[x] 一个特殊情况 9/0 = Infinity 正无穷
1.1.2.余数 ( x % 7)
数学里 x>=0
- JS 里 x 可以为负值
[x] -1 % 7 = -1 (相当于是把负号先提取出来了) //数学中如果可以算也应该是算-1这个数跟7的余数为6
1.1.3.指数 (x ** 3)
-
1.1.4.自增自减 (x++ / ++x / x— / —x) —尽量少用(一般用 a+=1 = a++)
尽量少用,因为容易你和别人都记错
x 值在前,得出的结果是x计算之前的值
- x 值在后,得出的结果是x计算之后的值
1.1.5.求值运算符 (+x) —不管x是正负,值都是x,并不是说求x的正值
+x 就相当于是把 x 值打出来
1.1.6.负数运算符 (-x) —取x的相反值
1.2.string 运算(只有 + 可行)
-
1.3.不同类型不要加起来—实际中不要写这种代码
但JS的数字和字符串相加居然可以算
- 1+’2’=”12” — JS先把 1 变成了字符串
- ‘2’-1=1 /2-‘1’=1 —因为string不支持-,所以就把string变成了数字
- 实际是你写错了,其他语言直接报错
2.比较运算符—不要用 ==
2.1.种类
- >
- <
=
- <=
- ==
- !=
- ===
-
2.2.JS 三位一体
2.3.x == y 真值表
2.4.x === y 真值表
3.布尔运算符
3.1.或且非
3.2.短路逻辑补充
3.2.1.console && console.log && console.log(‘hi’)
以防 console 不存在报错(其中IE6没有console,其他防止console被篡改了导致用console报错)
console && console.log && console.log('hi')
防御性编程—也就是上面写法出来之前的写法
if(console){if(console.log){console.log('hi')}}
可选链语法(JS下个版本,目前还不能使用)
console ?. log ? 'hi'
3.2.2.a = a || 100 防止a不存在,给一个保底值
function add(n){if(!n){n=0}return n+1} //如果n不存在,就让n等于0
[x] !n 就表示n不存在
- n=n || 0 有一个bug,前面知道 false 值有五个,那么当 n=’’ 时,也是当n不存在,结果就是n=0了
下面是最新的语法
function add(n=0){return n+1}
[x] 此时只有 n = null/undefined 才是空
4.二进制位运算符—平时工作用的少,但面试喜欢问
[x] 0b 开头表示二进制
[x] (0b1111^0b1010).toString(2) 加了后面的 .toString(2) 结果才是二进制的,否则自动计算为十进制的数
4.1.或、与、否
[x] | 两个位都为0,则结果为0,否则为1
- & 都为1,才为1
-
4.2.异或 ^
[x] 两个位相同,则结果为0,否则为1
-
4.3.左移右移 << 和 >>
4.4.头部补零的右移运算符 >>>
[x] 正数 相当于 >>
-
*5.位运算用法(面试喜欢问的)
5.1.使用与运算符判断奇偶
偶数 & 1 = 0奇数 & 1 = 1 //相当于 5&0b001=1
[x] 因为二进制里只要最后一位是1,那么就是奇数
[x] 十进制的写法,如下
n % 2 === 1 //奇数n % 2 === 0 //偶数
5.2.使用 ~, >>, <<, >>>, | 来取整
console.log(~~ 6.83) // 6console.log(6.83 >> 0) // 6console.log(6.83 << 0) // 6console.log(6.83 | 0) // 6console.log(6.83 >>> 0) // 6
[x] 因为这些运算符的特点就是去掉小数,只保留整数
[x] 有个整数的函数写法,如下:
window.parseInt()
5.3.使用^来交换 a b 的值
var a = 5var b = 8a ^= b //相关于 a=a^bb ^= aa ^= bconsole.log(a) // 8console.log(b) // 5
[x] 不用知道原理,自己写个二进制数尝试一下就知道了
- 实际中写法(不用二进制交换值) ```javascript let a = 1 let b = 2
6.其他运算符(奇葩运算符)
6.1.点运算符
- 用内存图画出来

- 证明

6.2.void 运算符 — 值总为 undefined

- void—直接下面这样写就好了,没必要用void—目的都是为了得到一个undefined,让标签跳转不了
6.3.逗号运算符 — 值为括号里的最后一位

[x] 不写return又能打出一个值
7.运算符优先级—圆括号优先级最高




问:面试中问到为什么不学运算符优先级
答:因为 JS 运算符太多了,没人能记得特别清楚,而且就算我记清楚了,我的同事也不一定都记清楚了,所以我只记了优先级最高的圆括号,我会在写代码的时候用圆括号非常清楚的表明我的优先级,这样我的同事也能很好的理解我的代码



结果省略了第一个0,因为二进制的前面的0没用

