Skip to content

运算符

1.算数运算符

运算符描述
+加法
-减法
*乘法
/除法
%取模(余数)
++自增
--自减
<<左移,将第一个操作数向左移动指定位数,左边超出的位数将会被清除,右边将会补零。
>>右移,将一个操作数的二进制表示形式向右移动指定位数,该操作数可以是数值或者 BigInt 类型。
右边移出位被丢弃,左边移出的空位补符号位(最左边那位)。
该操作也称为“符号位传播右移”(sign-propagating right shift)或“算术右移”(arithmetic right shift),
因为返回值的符号位与第一个操作数的符号位相同。
**求幂,2**3就是2的3次方

左移操作符 (<<)

js
const a = 5; // 00000000000000000000000000000101
const b = 2; // 00000000000000000000000000000010

console.log(a << b); // 00000000000000000000000000010100
// Expected output: 20

右移运算符>>

js
const a = 5; //  00000000000000000000000000000101
const b = 2; //  00000000000000000000000000000010
const c = -5; //  11111111111111111111111111111011

console.log(a >> b); //  00000000000000000000000000000001
// Expected output: 1

console.log(c >> b); //  11111111111111111111111111111110
// Expected output: -2

2.赋值运算符

运算符用法等同于描述
=x=y赋值,把右值赋值给左值
+=x+=yx=x+y加法赋值,把左值上右值,再赋值给左值
-=x-=yx=x-y减法赋值,把左值上右值,再赋值给左值
*=x*=yx=x*y乘法赋值,把左值上右值,再赋值给左值
/=x/=yx=x/y除法赋值,把左值上右值,再赋值给左值
%=x%=yx=x%y取余赋值,把左值上右值,再把余数赋值给左值
<<=x<<=yx=x<<y左移赋值,把左值向左移动右值的位数,再赋值给左值
>>=x>>=yx=x>>y右移赋值,把左值向右移动右值的位数,再赋值给左值

3.比较运算符

运算符描述
==等于,比较值
===绝对等于,比较值和类型
!=不等于
!==不绝对等于(值和类型有一个不相等,或两个都不相等)
>大于
<小于
>=大于或等于
<=小于或等于

4.逻辑运算符

运算符描述
&&且运算,运算符两边都为true才为true,否则为false,或者左边为true则执行右边语句
||或运算,运算符两边有一边为true即为true,否则为false,或者左边为true返回左边值,否者返回右边值
||=逻辑或赋值(`x
!取反,!true即为false
??空值合并,当左侧的操作数为null或者undefined时,返回其右侧操作数,否则返回左侧操作数。
??=空赋值运算符,仅在 x 是空值(nullundefined)时对其赋值。

5.可选链运算符

运算符描述
?.?. 运算符的功能类似于 . 链式运算符,
在引用为空 (nullish ) (null 或者 undefined) 的情况下不会引起错误,
该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined

语法

js
obj.val?.prop
obj.val?.[expr]
obj.func?.(args)

3.三元运算符

语法

js
条件 ? 为true触发的逻辑 : 为false触发的逻辑

7.一元运算符

运算符描述
num++先执行逻辑,在将num+1
++num先将num+1,在执行逻辑
num--先执行逻辑,在将num-1
--num先将num-1,在执行逻辑

8.位运算符

运算符描述例子类似于结果十进制
&ANDx = 5 & 10101 & 000100011
|ORx = 5 | 10101 | 000101015
~取反x = ~ 5~01011010-6
^异或x = 5 ^ 10101 ^ 000101004
<<左移x = 5 << 10101 << 1101010
>>右移x = 5 >> 10101 >> 100102

9.in 运算符

如果指定的属性在指定的对象或其原型链中,则 in 运算符返回 true

js
prop in object

参数:

  • prop:一个字符串类型或者 symbol 类型的属性名或者数组索引(非 symbol 类型将会强制转为字符串)。
  • object:检查它(或其原型链)是否包含具有指定名称的属性的对象。

返回值:返回一个布尔值

js
// 数组
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
0 in trees; // 返回 true
3 in trees; // 返回 true
6 in trees; // 返回 false
"bay" in trees; // 返回 false (必须使用索引号,而不是数组元素的值)

"length" in trees; // 返回 true (length 是一个数组属性)

Symbol.iterator in trees; // 返回 true (数组可迭代,只在 ES2015+ 上有效)

// 内置对象
"PI" in Math; // 返回 true

// 自定义对象
var mycar = { make: "Honda", model: "Accord", year: 1998 };
"make" in mycar; // 返回 true
"model" in mycar; // 返回 true

in右操作数必须是一个对象值。例如,你可以指定使用String构造函数创建的字符串,但不能指定字符串文字。

js
var color1 = new String("green");
"length" in color1; // 返回 true
var color2 = "coral";
"length" in color2; // 报错 (color2 不是对象)

如果你使用 delete 运算符删除了一个属性,则 in 运算符对所删除属性返回 false

js
var mycar = { make: "Honda", model: "Accord", year: 1998 };
delete mycar.make;
"make" in mycar; // 返回 false

var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
delete trees[3];
3 in trees; // 返回 false

如果你只是将一个属性的值赋值为undefined,而没有删除它,则 in 运算仍然会返回true

js
var mycar = { make: "Honda", model: "Accord", year: 1998 };
mycar.make = undefined;
"make" in mycar; // 返回 true
js
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
trees[3] = undefined;
3 in trees; // 返回 true

继承属性

如果一个属性是从原型链上继承来的,in 运算符也会返回 true

js
"toString" in {}; // 返回 true

10.运算符优先级

优先级分类运算符结合性
1后缀运算符( )、[ ]、->从左到右
2单目运算符!、*(指针)、& 、++、--、+(正号)、-(负号)从右到左
3乘法/除法/取余*(乘号)、/、%从左到右
4加法/减法+、-从左到右
5位移运算符<<、>>从左到右
6关系运算符<、<=、>、>=从左到右
7相等/不等==、!=从左到右
8按位与&从左到右
9按位异或^从左到右
10按位或|从左到右
11逻辑与&&从左到右
12逻辑或||从左到右
13三目运算符? :从右到左
14赋值运算符=、+=、-=、*=、/=、 %=、 >>=、 <<=、&=、^=、|=从右到左
15逗号运算符,从左到右

MIT Licensed