按位与(&)
按位与(&)运算符在两个操作数对应的二进位都为 1 时,该位的结果值才为 1。
例如:
![](https://i-blog.csdnimg.cn/blog_migrate/fbcf9c99d9864dda0c657dd486d86c16.png)
最后的结果会转换成10进制进行输出
操作数会被转换为 32 位的二进制数。超过 32 位的数字将丢弃其最高有效位。
补充:(十进制怎么转化为二进制?----》除2取余,将余数进行倒叙摆列,高位补0)
例如:
![](https://i-blog.csdnimg.cn/blog_migrate/ea587fc097e9d5041b1a254c2e4de73d.png)
按位非(~)
按位非运算符(~)将操作数的位反转。如同其他位运算符一样,它将操作数转化为 32 位的有符号整型。
![](https://i-blog.csdnimg.cn/blog_migrate/6b43f3b90e03c76377a3327dcf6199df.png)
与按位与一样,转换为32位,超过丢弃,不足补0。
按位或(|)
按位或(|)运算符在其中一个或两个操作数对应的二进制位为 1 时,该位的结果值为 1。
![](https://i-blog.csdnimg.cn/blog_migrate/59dd3205386fce78e277403a8f5bab34.png)
与按位与(&)和按位非(~)一样,转换为32位,超过丢弃,不足补0。
按位异或(^)
按位异或(^)运算符在两个操作数有且仅有一个对应的二进制位为 1 时,该位的结果值为 1。
![](https://i-blog.csdnimg.cn/blog_migrate/fd28ffe4db147728114af0fe73e5ae83.png)
与按位与(&)和按位非(~)一样,转换为32位,超过丢弃,不足补0。
逗号运算符(,)
逗号(,)运算符对它的每个操作数从左到右求值,并返回最后一个操作数的值。
![](https://i-blog.csdnimg.cn/blog_migrate/bdbf98033444bcc9ef493b124a8e3961.png)
一个或多个表达式,最后一个表达式的返回值会作为当前复合表达式的值。
function fun(){
let a = 0
return (a++,a) //相当于return ++a;
}
幂(**)
幂(**)运算符返回第一个操作数取第二个操作数的幂的结果。它等价于Math.pow(基数base,指数exponent),不同的是,他接受BigInt(内置对象)作为操作数
![](https://i-blog.csdnimg.cn/blog_migrate/aabc1d8d11b160616d813f85b6a69f9f.png)
注意:
幂运算符是右结合的:a ** b ** c = a ** ( b ** c )
在大多数语言里,比如 PHP、Python 等那些有幂运算符(**)的语言,幂运算符被定义有一个比一元运算符,比如一元的 + 和一元的 - 更高的运算顺序,但有一些例外。在 Bash 语言里,** 运算符被定义有一个比一元运算符更低的运算顺序。
在 JavaScript 中,不可能写出模棱两可的幂表达式,不然会导致语法错误
例如,-2 ** 2 在 Bash 中为 4,但在其他语言(如 Python)中为 -4。这在 JavaScript 中是无效的,因为操作不明确。你必须在两边加上括号,
例如: -(2 ** 2)。
![](https://i-blog.csdnimg.cn/blog_migrate/35e5c78447757da92b0df72c0fb00242.png)
import.meta(需要深入理解)
它可以获取这个模块的URL。(我没打印出来)
![](https://i-blog.csdnimg.cn/blog_migrate/9e059f0c7155b835a5ba7ac17a2dd66a.png)
in运算符
如果指定的属性在指定的对象时,返回true。
![](https://i-blog.csdnimg.cn/blog_migrate/2218a4edf7fafe47787112d0fbf05c65.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bb62b1a5c268e6529c45720b8f6c16d0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/85a2409bbda286e48f905ba89a8bf718.png)
注意:in右操作数必须是一个对象值。
如果你使用 delete运算符删除了一个属性,则 in 运算符对所删除属性返回 false。
如果你只是将一个属性的值赋值为undefined,而没有删除它,则 in 运算仍然会返回true。
如果一个属性是从原型链上继承来的,in 运算符也会返回 true。
instanceof(需要深入理解---》和多全局对象)
instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
![](https://i-blog.csdnimg.cn/blog_migrate/577de0049c2aa108e1c60ff0e1c0efad.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c2f517ffed158219ddde7983f4c5722d.png)
左移 (<<)
左移操作符 (<<) 将第一个操作数向左移动指定位数,左边超出的位数将会被清除,右边将会补零
![](https://i-blog.csdnimg.cn/blog_migrate/d72006157918ad3a3bba3e84bff79637.png)
移动任意数字 x 至左边 y 位,得出 x * 2 ** y。 所以例如:5 << 2 等价于 5 * 2的2次方= 5 * 4 = 20。
右移(>>)
右移操作符 (<<) 将第一个操作数向右移动指定位数,右边超出的位数将会被丢弃,左边移出的空位补符号位(最左边的这一位(符号位)填充左边的空位)。
![](https://i-blog.csdnimg.cn/blog_migrate/0878e487faf40d748119c809b5cc33f5.png)
移动任意数字 x 至左边 y 位,得出 x * 2 ** y。 所以例如:5 << 2 等价于 5 * 2的2次方= 5 * 4 = 20。
&&=
![](https://i-blog.csdnimg.cn/blog_migrate/36195e893094fd4006b115425882716c.png)
不是转换为x = x && y,而是转换为x && ( x = y )。
||=
不是转换为x = x || y,而是转换为x || ( x = y )。
![](https://i-blog.csdnimg.cn/blog_migrate/63a515d83c4089b03cb3845b6fb77e44.png)
x ||= y仅在x转换成布尔类型为false时才赋值
new.target
new.target 属性允许你检测函数或构造方法是否是通过new运算符被调用的。
若是的话,new.target返回一个指向构造方法或函数的引用。
若不是,在普通的函数调用中,new.target 的值是undefined。
![](https://i-blog.csdnimg.cn/blog_migrate/b6b2a9f14526d892e68a836bcab1d652.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3e0420cc2ed21cbe29254714bca8c3d7.png)
逻辑空赋值(??=)
逻辑空赋值运算符(x ??= y)仅在 x 是空值(null 或 undefined)时对其赋值。
![](https://i-blog.csdnimg.cn/blog_migrate/90fa895f64521caa0ff002201673a2ef.png)
转换为x ?? ( x = y )。
空值合并运算符(??)
空值合并运算符(??)是一个逻辑运算符,当左侧的操作数为 或者 undefined时,返回其右侧操作数,否则返回左侧操作数。
如果使用 || 来为某些变量设置默认值,可能会出现问题。
比如为假值(例如,' ' 或 0)时
![](https://i-blog.csdnimg.cn/blog_migrate/fa45c5be7c40d87fd71d99c67e8b3a91.png)
可选链运算符(?.)
可选链运算符(?.)允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。
?. 运算符的功能类似于 . 链式运算符,不同之处在于,在引用为空 (null或者 undefined) 的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined。
![](https://i-blog.csdnimg.cn/blog_migrate/b41d0385ee52c2d775d3b113c3295017.png)
无符号右移(>>>)
无符号右移运算符(>>>)(零填充右移)将左操作数计算为无符号数,并将该数字的二进制表示形式移位为右操作数指定的位数,取模 32。向右移动的多余位将被丢弃,零位从左移入。其符号位变为 0,因此结果始终为非负数。与其他按位运算符不同,零填充右移返回一个无符号 32 位整数。
通俗来说:无符号右移(>>>)补充的是0,右移(>>)补充的是和最左边位数相同的数字。