目录
- 算术运算符
- 比较运算符
- 布尔运算符
- 二进制位运算符
- 其他运算符
算术运算符——数学运算
number运算
- 加减乘除
- 余数:x%7
- 指数:x**3
- 自增自减:x++ / ++x / x-- / --x
- 求值运算符:+x
- 负数运算符:-x
string运算
- 连接运算:'123'+'456'
尽量少用自增自减——因为容易你和别人都记错
- 只在一个地方用,就是for循环
不同类型不要加起来——把1和'2'加起来是几个意思?
比较运算符
- <
-
=
- <=
- ==
- !=
- ===(读作全等)
- !==
JS三位一体
- 0 == []
- 0 == '0'
- 0 == '\t'
- 但是右边三个互不相等
- 忠告:永远不要使用==,用===代替。==的问题在于,它总是自作聪明(自动类型转换)
- x==y真值表,令人难以理解,听我一劝,永远不要用两个等于号
x===y真值表,没有任何费解:
- 基本类型看值是否相等
- 对象看地址是否相等
- [] !== []
- {} !== {}
- 对象是比较地址的,不是比较内容
- NaN!==NaN,唯一特例,强行记忆一下
布尔运算符
或且非
- ||
- &&
- !
短路逻辑
- console&&console.log&&console.log('hi')
- 以防console不存在报错,这叫防御性编程
- console?.log?('hi'),叫可选链语法,等价于上面的语法,但这个语法要明年才能用
- a=a||100
- a的保底值
- 但是a=a||100是有bug,最好用最新的语法
function add(n){
n=n||0
return n+1
}
等价于:
function add(n=0){
return n+1
}
最好是用下面这种,最新的语法
二进制运算符
或、与、否
- |两个位都为0,则结果为0,否则为1
- &
- ~
异或
- ^
- 两个位相同,则结果为0,否则为1
左移右移
- <<和>>
头部补零的右移运算符
平时工作基本不会用,面试喜欢问。下面这些都是面试官逼我们要学的
- 参考:位运算符在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的值
代码
- var a = 5
- var b = 8
- a ^= b
- b ^= a
- a ^= b
- console.log(a) //8
- console.log(b) //5
上面的为了应付面试官,记一下就行了。现在最新语法交换a b的值是这样写的:
var a = 5;var b = 8;
[a,b]=[b,a]
位运算用得很少容易忘,面试之前重新看看这三个题即可
其他运算符——一个比一个奇葩
点运算符
语法
- 对象.属性名=属性值
作用
- 读取对象的属性值
有个疑问
- 不是对象,为什么也可以有属性?'a-b-c'.split('-')
- JS有特殊逻辑,点前面不是对象,就把它封装成对象
- number会变成Number对象
- string会变成String对象
- bool会变成Boolean对象
- 程序员从来不用这三种对象,只用简单类型。new Number(),你这辈子都不要用,== ++也不要用,++只在for循环的时候用。
void运算符
语法
- void表达式或语句
作用
- 求表达式的值,或执行语句
- 然后void的值总是位undefined。void的唯一目的就是得到一个undefined
需求
<a href="http://example.com" onclick="f();return false;">点击</a>
- return 假值可以阻止默认动作
<a href="javascript:void(f())">文字</a>
等价于
<a href="javascript:;">文字</a>
- 如果你希望有一个a标签又不希望它有任何动作,就这样写。但是用void可以炫技
逗号运算符
语法
- 表达式1,表达式2,…,表达式n
作用
- 将表达式n的值作为整体的值
使用
- let a = (1,2,3,4,5)
- 那么a的值就是5,奇葩吧?
- let f=(x)=>(console.log('平方值为'),x*x)
- 这么写就不用写return了,但注意两个表达式外面的括号不能省