1.算术运算符

1.1.number 运算

1.1.1.加减除乘

  • [x] 一个特殊情况 9/0 = Infinity 正无穷

    image.png

    1.1.2.余数 ( x % 7)

  • 数学里 x>=0

  • JS 里 x 可以为负值
  • [x] -1 % 7 = -1 (相当于是把负号先提取出来了) //数学中如果可以算也应该是算-1这个数跟7的余数为6

    image.png

    1.1.3.指数 (x ** 3)

  • [x] x ** 3 = x

    1.1.4.自增自减 (x++ / ++x / x— / —x) —尽量少用(一般用 a+=1 = a++)

    尽量少用,因为容易你和别人都记错

  • x 值在前,得出的结果是x计算之前的值

  • x 值在后,得出的结果是x计算之后的值

image.png

1.1.5.求值运算符 (+x) —不管x是正负,值都是x,并不是说求x的正值

+x 就相当于是把 x 值打出来

如:x=-3 ;+x = -3 image.png

1.1.6.负数运算符 (-x) —取x的相反值

1.2.string 运算(只有 + 可行)

  • [x] 连接运算 ‘123’ + ‘456’ image.png

    1.3.不同类型不要加起来—实际中不要写这种代码

  • 但JS的数字和字符串相加居然可以算

  • 1+’2’=”12” — JS先把 1 变成了字符串
  • ‘2’-1=1 /2-‘1’=1 —因为string不支持-,所以就把string变成了数字
  • 实际是你写错了,其他语言直接报错

其他语言的数字和字符串相加
image.png

2.比较运算符—不要用 ==

2.1.种类

  • >
  • <
  • =

  • <=
  • ==
  • !=
  • ===
  • !==

    2.2.JS 三位一体

    image.png

    2.3.x == y 真值表

    image.pngimage.png

    2.4.x === y 真值表

    image.pngimage.png

    3.布尔运算符

    3.1.或且非

    image.png

    3.2.短路逻辑补充

    3.2.1.console && console.log && console.log(‘hi’)

  • 以防 console 不存在报错(其中IE6没有console,其他防止console被篡改了导致用console报错)

    1. console && console.log && console.log('hi')
  • 防御性编程—也就是上面写法出来之前的写法

    1. if(console){if(console.log){console.log('hi')}}
  • 可选链语法(JS下个版本,目前还不能使用)

    1. console ?. log ? 'hi'

    3.2.2.a = a || 100 防止a不存在,给一个保底值

    1. 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了
  • 下面是最新的语法

    1. 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
  • [x] ~ 会以读码的方式写成一个负数

    4.2.异或 ^

  • [x] 两个位相同,则结果为0,否则为1

  • [x] image.png 结果省略了第一个0,因为二进制的前面的0没用

    4.3.左移右移 << 和 >>

    image.png

    4.4.头部补零的右移运算符 >>>

  • [x] 正数 相当于 >>

  • [ ] 负数 比较复杂

    *5.位运算用法(面试喜欢问的)

    5.1.使用与运算符判断奇偶

    1. 偶数 & 1 = 0
    2. 奇数 & 1 = 1 //相当于 5&0b001=1
  • [x] 因为二进制里只要最后一位是1,那么就是奇数

  • [x] 十进制的写法,如下

    1. n % 2 === 1 //奇数
    2. n % 2 === 0 //偶数

    5.2.使用 ~, >>, <<, >>>, | 来取整

    1. console.log(~~ 6.83) // 6
    2. console.log(6.83 >> 0) // 6
    3. console.log(6.83 << 0) // 6
    4. console.log(6.83 | 0) // 6
    5. console.log(6.83 >>> 0) // 6
  • [x] 因为这些运算符的特点就是去掉小数,只保留整数

  • [x] 有个整数的函数写法,如下:

    1. window.parseInt()

    5.3.使用^来交换 a b 的值

    1. var a = 5
    2. var b = 8
    3. a ^= b //相关于 a=a^b
    4. b ^= a
    5. a ^= b
    6. console.log(a) // 8
    7. console.log(b) // 5
  • [x] 不用知道原理,自己写个二进制数尝试一下就知道了

  • 实际中写法(不用二进制交换值) ```javascript let a = 1 let b = 2

[a,b]=[b,a] ``` image.png

6.其他运算符(奇葩运算符)

6.1.点运算符

image.png

  • 用内存图画出来

image.png

  • 证明image.png

6.2.void 运算符 — 值总为 undefined

image.png

  • void—直接下面这样写就好了,没必要用void—目的都是为了得到一个undefined,让标签跳转不了

image.png

6.3.逗号运算符 — 值为括号里的最后一位

image.png

  • [x] 不写return又能打出一个值

    image.png
    image.png

    7.运算符优先级—圆括号优先级最高

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


参考文章:

位运算符在JS中的妙用