- 这辈子不要用的东西: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三位一体
- x == y 真值表
0 === [] //false,类型不同
[] === [] //false,地址不同
- x === y 真值表
- 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"
《面试题:二进制运算只在面试用,工作基本不用》
使用与运算符判断奇偶
偶数 & 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 对象
程序员从来不用这三种对象,只用简单类型
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)
注意上面的括号不能省
运算符优先级
- 不同运算符
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个运算符
怎么记忆呢?
圆括号优先级最高, 会用圆括号就行, 其他一律不记,面试官问就说写的时候会用优先级最高的()表示出来
面试技巧
本节课有两个推荐大家不学
== 不学
优先级不学
面试遇到怎么办
想面试官说明为什么不学,以及你的态度
如果面试官非要你答,直接跳过
跳过不影响面试表现吗?你可以在其他题表现
没必要在这种烂题上表现