一、算数运算符
number 运算
- 加减乘除 "
+" "-" "*" "/"
(除法不能除0,Infinity) - 余数
x % 7(两个数字相隔7,除以7,余数相等 eg:10%7 = 17%7;
但是JS中有一个错误,会忽略负数相除:eg:-1%7,会变成1%7进行运算,得出余数为-1,所以-1%7 === 6%7 值为false)
- 指数
x ** 3 - 自增自减
x++/++x/x--/--x口诀:a在前 值为前,a在后值为后
var a = 1
a++ //1 返回a加之前的值
a //2 自身增加1
var a =1
++a // 2 返回a加之后的值
a //2
尽量少用自增自减,容易记错 ,a++ 可以写成 a+= 1
不同类型不要相加,JS不提示错误 eg:'1'+ 1
- 求值运算符 +x
- 负数运算符 -x
var a = 8
-a //-8 正数变负数
var a = -8
-a //8 负负得正
string 运算
- 连接运算
'123' + '456' //'123456'
二、比较运算符
> | < | >= | <=| ==(模糊相等) | !=(不等) | === (全等)| !==(不全等)
- JS三位一体
永远不要使用'==',用'==='代替,‘==’会自动类型转换
'==='没有任何费解,基本类型看值是否相等,对象看地址是否相等.
[] !== [] //数组只能比较地址,不能比较内容
{} !== {}
NaN !== NaN //特例
三、布尔运算符
- 或
|| - 且
&& - 非
! - 短路逻辑
console && console.log && console.log('hi')
// 以防 console 不存在报错,如果console存在,如果console.log也存在,就执行console.log(hi)
console?.log?('hi') //JS最新版本把以上代码的简写方式,可选链语法
a = a || 100 //a的保底值是100,但这种写法有bug
function add (n=0) //最新语法把保底值写在参数中,解决了空判断失误的bug
四、二进制运算符
- 或
|两个位都为0,则结果为0,否则为1
eg: (0b1111 | 0b 1010).toString(2) //"1111"
- 与
&两个位都为1,则结果为1,否则为0
eg: (0b1111 & 0b 1010).toString(2) //"1010"
-
否
~如果是1变成0,如果是0变成1,但是变了之后会以补码的形式翻译成负数 -
异或
^两个位相同,则结果为0,否则为1
eg: (0b0111 ^ 0b1010).toString(2) //"1101"
- 左移右移
<<和>>
eg: (0b0111 >> 1).toString(2) //"0011"
(0b0101 << 1).toString(2) //"1010"
- 头部补零的右移运算符
>>>
位运算运用
使用与&运算符判断奇偶
偶数 & 1 = 0;
奇数 & 1 = 1
eg: 123 & 1 //1
124 & 1 //0
使用~, >>, <<, >>>,| 来取整
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
过程:
JS新语法可以写成
[a,b] = [b,a],就能交换a b的值
五、其他运算符(奇葩)
点运算符
- 语法 对象.属性名 = 属性值
- 作用 读取/设置对象的属性值
- 有个疑问
不是对象,为什么也可以有属性?
'a-b-c'.split('-')
JS 有特殊逻辑,点前面不是对象,就把它封装成对象
number 会变成 Number 对象
string 会变成 String 对象
bool 会变成 Boolean 对象
程序员从来不用这三种对象,只用简单类型
var a = {name:'xxx'}
a.name //"xxx" 读取属性值
a.name = 'yyy' //设置属性值
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)
//不用return,也能写出两句语句。先打印 后求值,注意上面的括号不能省
运算符优先级
- 技巧 圆括号优先级最高,逗号最低,其他一律不记