一、算术运算符
1.1number运算
1.1.1加减乘除
9 / 0 //Infinity
-9 / 0 //-Infinity
复制代码
1.1.2取余
-1 % 7 //-1 JS先把负号提取出来,然后1%7取余,再添负号,事实上是错误的
复制代码
1.1.3指数
7 ** 3 //343
7 **2 //49
复制代码
1.1.4自增自减
var a = 10
a++ //a自增1,但表达式a++的值是10,取自增前的值
++a //a自增1,但表达式++a的值是11,取自增后的值
a--//与a++同理
--a//与++a同理
复制代码
尽量少用自增自减,用a+=1,a-=1
1.2string运算
字符串只支持加号运算
'123'+'456' //'123456'
复制代码
JS一些奇葩的点:
1 + '2' //'3',JS把1转为字符串再相加
3 - '2' //1,JS把字符串转为数字再相减
复制代码
二、比较运算符
===
-
基本类型看值是否相等
-
对象看地址是否相等
[] === [] //false,第一个空数组的地址和第二个空数组的地址不同 {} === {} //false NaN !== NaN //记住特例 复制代码
三、布尔运算符
a = a || 100 // a的保底值为100
console && console.log && console.log('hi') //防止console不存在报错
function add(n=0){
return n+1
}//如果n是null或者undefined,直接让n等于0(新语法)
复制代码
四、二进制运算符
4.1或运算符
| 两个二进制位之中只要有一个为1
,就返回1
,否则返回0
。
(0b1111 | 0b1010).toString(2) //'1111'
复制代码
4.2与运算符
& 两个二进制位之中两位都为1,那么结果为1,否则为0
0 & 3 // 0,0(二进制00)和3(二进制11)进行二进制与运算会得到00(即0)
复制代码
4.3否运算符
二进制否运算符(~
)将每个二进制位都变为相反值(0
变为1
,1
变为0
)。
~ 3 // -4
复制代码
3
的32位整数形式是00000000000000000000000000000011
,二进制否运算以后得到11111111111111111111111111111100
。
由于第一位(符号位)是1,所以这个数是一个负数。JavaScript 内部采用补码形式表示负数,即需要将这个数减去1,再取一次反,然后加上负号,才能得到这个负数对应的10进制值。这个数减去1等于11111111111111111111111111111011
,再取一次反得到00000000000000000000000000000100
,再加上负号就是-4
。
考虑到这样的过程比较麻烦,可以简单记忆成,一个数与自身的取反值相加,等于-1。
4.4异或运算符
两个二进制位不同时返回1
,相同时返回0
。
0 ^ 3 // 3,0(二进制00)与3(二进制11)进行异或运算,它们每一个二进制位都不同,所以得到11(即3)。
复制代码
4.5左移运算符
左移运算符(<<
)表示将一个数的二进制值向左移动指定的位数,尾部补0
,即乘以2
的指定次方。向左移动的时候,最高位的符号位是一起移动的。
4 << 1
// 8
-4 << 1
// -8
复制代码
4.6右移运算符
右移运算符(>>
)表示将一个数的二进制值向右移动指定的位数。如果是正数,头部全部补0
;如果是负数,头部全部补1
-4 >> 1
// -2
/*
// 因为-4的二进制形式为 11111111111111111111111111111100,
// 右移一位,头部补1,得到 11111111111111111111111111111110,
// 即为十进制的-2
*/
复制代码
4.7头部补零的右移运算符
头部补零的右移运算符(>>>
)与右移运算符(>>
)只有一个差别,就是一个数的二进制形式向右移动时,头部一律补零,而不考虑符号位。
-4 >>> 1
// 2147483646
/*
// 因为-4的二进制形式为11111111111111111111111111111100,
// 带符号位的右移一位,得到01111111111111111111111111111110,
// 即为十进制的2147483646。
*/
复制代码
4.7二进制符号位的应用
4.7.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
复制代码
4.7.2 使用与运算符判断奇偶
使用与运算符判断是否为奇偶数
偶数 & 0b001 = 0
奇数 & 0b001 = 1
复制代码
4.7.3使用异或运算交换数值
异或运算可以互换两个变量的值
var a = 10;
var b = 99;
a ^= b, b ^= a, a ^= b;
a // 99
b // 10
复制代码
五、其他运算符
5.1点运算符
语法:
对象.属性名=属性值 //用来读取对象的属性值
复制代码
但是,在JS中不是对象也可以有属性值
var a = 1
a.toString() //'1'
/*如果点前面不是对象,JS会把它封装成对象
number会变成Number对象
string会变成String对象
bool会变成Boolean对象*/
复制代码
5.2void运算符
语法:
void 表达式或语句 //用来求表达式的值或者执行语句,但void的值总是为undefined
复制代码
5.3逗号运算符
语法:
表达式1,表达式2,...,表达式n //将表达式n的值作为整体的值
复制代码
let a = (1,2,3,4,5) //a的值为5
复制代码
六、运算符的优先级
一共有20个运算符,汇总在MDN上
- 圆括号优先级最高,其他没必要记忆