JS运算符学习

一、算术运算符

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把字符串转为数字再相减
复制代码

二、比较运算符

14.png

===

  • 基本类型看值是否相等

  • 对象看地址是否相等

    [] === [] //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变为11变为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上

  • 圆括号优先级最高,其他没必要记忆
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享