js运算符

130 阅读3分钟
  • 这辈子不要用的东西:New Number()等对象【见点运算符】 , == , ++

算术运算符

number运算

加减乘除 -9 / 0 = -Infinity
余数 x % 7

-1 % 7 = -1    //js当作 1 % 7 再加负号;数学上应该= 6 % 7 = 1 

指数 x ** 3
自增自减 x++ / ++x / x-- / --x
求值运算符 +x
负数运算符 -x

string 运算

连接运算 '123' + '456' (只支持 + )

  • 尽量少用自增自减,因为容易你和别人都记错(for循环要用,其他地方用a+=1)
  • 不同类型不要加起来!
    《面试题》
1 + '2' = '12'  //js自动将1变成字符串'1'
'2' - 1 =  1    //js没有字符串相减,所以将'2'自动变成2

比较运算符

== 模糊相等  //js的bug
=== 全等
  • js三位一体 uTools_1661613803258.png
  • x == y 真值表
0 === []    //false,类型不同
[] === []   //false,地址不同

uTools_1661614700954.png

  • x === y 真值表 uTools_1661615655402.png
  • NaN !== NaN (唯一特例)

布尔运算符

短路逻辑
console && console.log && console.log('hi')
防御性代码以防 console 不存在报错
a = a || 100
a 的保底值

可选链运算符?.
console?.log()?.('hi')

二进制运算符 (0b开头表示二进制:0b11)

  • 或、与、否 : | & ~ 从右向左依次比较
  • 异或 : ^
    两个位相同,则结果为0,否则为1
  • 左移右移 : << 和 >>
  • 头部补零的右移运算符 : >>>
表示二进制的方法:字符串
(0b1111 | 0b1010).toString(2)    //"1111"
(0b1100 | 0b110).toString(2)     //"1110" 空位0补
(0b1100 & 0b10).toString(2)      //"0"

(0b111 << 1).toString(2)        //"1110" 

位运算符在JS中的妙用

《面试题:二进制运算只在面试用,工作基本不用》

使用与运算符判断奇偶

偶数 & 1 = 0
奇数 & 1 = 1

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

console.log(~~ 6.83)    // 6 ,位运算不支持小数
console.log(6.83 >> 0)  // 6
console.log(6.83 << 0)  // 6
console.log(6.83 | 0)   // 6
console.log(6.83 >>> 0)   // 6

使用^来交换 a b 的值 ([a,b] = [b,a])

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 对象
程序员从来不用这三种对象,只用简单类型

1.png2.png

void 运算符

  • 语法: void 表达式或语句
  • 作用: 求表达式的值,或执行语句; 然后 void 的值总是为 undefined
  • 需求:
<a href="http://example.com" onclick="f(); return false;">点击</a>
return 假值可以阻止默认动作
<a href="javascript: void(f())">文字</a>
改用 void 可以炫技

逗号运算符

  • 语法: 表达式1, 表达式2, ..., 表达式n
  • 作用: 将表达式 n 的值作为整体的值
  • 使用:
let a = (1,2,3,4,5)
那么 a 的值就是 5,奇葩吧?
let f = (x) => (console.log('平方值为'), x*x)
注意上面的括号不能省

3.png 4.png

运算符优先级

  • 不同运算符
1 + 2 * 3 是 (1 + 2) * 3 还是 1 + (2 * 3)
! a === 1 是 (! a) === 1 还是 ! (a === 1)
new Person().sayHi() 是什么意思
  • 相同运算符
从左到右 a + b + c  
从右到左 a = b = c = d
  • 优先级就是先算什么后算什么

具体规则想知道吗? 你:想。 不,你不想!看看这里就知道为什么。

  • 优先级汇总 汇总表位于 MDN , 一共有20个运算符
    怎么记忆呢?
    圆括号优先级最高, 会用圆括号就行, 其他一律不记,面试官问就说写的时候会用优先级最高的()表示出来

面试技巧

本节课有两个推荐大家不学

== 不学
优先级不学

面试遇到怎么办

想面试官说明为什么不学,以及你的态度
如果面试官非要你答,直接跳过
跳过不影响面试表现吗?你可以在其他题表现
没必要在这种烂题上表现