算数运算符
加减乘除
- 加 +
- 减 -
- 乘 *
- 除 /
- 不能除以零,输出值为Infinity或者-Infinity
余数
- 特殊情况
- 如图-1/7的余数,JS算成是-(1%7),结果为-1,.
- 而正确的算法是-1%7=6%7,-1和6相差7,所以余数为6
指数
- x**3 ,x的3次方
自增自减
- a++/++a,a--/--a 取值,a在前,式子的值为前,在后,式子的值为后
运算 +
- 仅仅作为值的运算,并不能把值由负变正
-
- 不同于+,能把正变负,把负变正
string运算 只支持+,的运算,其他的都不支持
- 连接运算 '123'+'456'
- 奇葩案例
如果把数字和字符串相加,Js会把数字变成字符串,然后拼接
如果把数字和字符串相减,JS先把字符串变成数字,然后相减运算
小结:js有时候不会对错误的代码报错!!!!!!
使用注意点!!!!!!!!!!!!!!!!
尽量少用自增,自减
- 大多数情况下:a++写成 a=a+1或者a+=1
- for循环中的条件
for(let i=0,i<10,i++)
不同的数据类型不要相加
JS三位一体
- 外面的三个都等于0,但是他们互不相等
- 永远不要使用==代替===,JS会自动转换数据类型!!!!
- js数据自动转换数据类型机制参考zhuanlan.zhihu.com/p/22745278
x == y 真值表
- 令人难以理解
- []==false但不是 falsy
- []==false但{}却不是
- [[]]==false
x === y 真值表
没有任何费解
- 基本类型看值是否相等
- 对象看地址是否相等
- 以上两个条件必须同时满足
- [] !== [] 两个空数组地址可能不相等
- {} !== {} 两个空对象地址可能不相等
- 唯一特例!!!!!!! NaN!==NaN
布尔运算符
或、且、非
- ||
- &&
- !
短路逻辑
-案例1 console&& console.log && console.log('hi')
- 原理:防止consle,console.log被篡改或者不存在,报错
- 案例2
a = a || 100:a的保底值是100 - 原理:
n没有初始值,函数无法执行,如果加了if判断,n的保底值为0
简写,但是当n=b||0时,判断条件同时成立,所以直接简些成n=n||0,但是这种写法存在bug,你的5个falsy值都会让他为假
- 新语法
如果n是null或者undefined,n的值为0,如果n为空字符串,直接字符串拼接(数据类型不同js自动转换数据类型)
二进制运算符
- 或、与、否
- | 两个位都为0,则结果为0,否则为1
- &
- ~
- 异或
- ^ 两个位相同,则结果为0,否则为1
- 左移和右移
- << 和 >>
- 头部补零的右移运算符
-
使用与运算符判断奇偶
代码
- 偶数 & 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