1.3JavaScript语言的非运算符(Non-Operator)和运算符(Operator)

1.非运算符

非运算符描述
空白空格(U+0020)、水平制表符(\t,U+0009)、垂直制表符(\v,U+000B)、分页符(\f,U+000C)。
行结束符换行符(\n,U+000A)、回车符(\r,U+000D)、行分隔符(U+2028)、段落分隔符(U+2029)。
,逗号
;分号
()圆括号
[]方括号
{}花括号
...省略号

2.一元运算符

运算符名称描述
+a取正a 的值本身。
-a取负a 的负值。
++a前递增a 的值加 1,然后返回 a
--a前递减a 的值减 1,然后返回 a
a++后递增返回 a,然后将 a 的值加 1。
a--后递减返回 a,然后将 a 的值减 1。

3.算术运算符

运算符描述
a + b加法,字符串连接。
a - b减法
a * b乘法
a / b除法
a % b求余
a ** b求幂

4.赋值运算符

运算符名称
a = b赋值
a += b加法赋值
a -= b减法赋值
a *= b乘法赋值
a /= b除法赋值
a %= b求余赋值
a **= b求幂赋值
a &&= b逻辑与赋值
a ||= b逻辑或赋值
a &= b按位与赋值
a |= b按位或赋值
a ^= b按位异或赋值
a <<= b左移位赋值
a >>= b有符号右移位赋值
a >>>= b无符号右移位赋值

5.相等性运算符

=== 运算符与 Object.is() 静态方法的区别:

//区别一
0 === +0  // true
0 === -0  // true
+0 === -0 // true
Object.is(0, +0)  // true
Object.is(0, -0)  // false
Object.is(+0, -0) // false

//区别二
NaN === 除了NaN的任何值  // false
NaN === NaN            // false
Object.is(NaN, 除了NaN的任何值)  // false
Object.is(NaN, NaN)            // true
运算符名称描述
a == b相等(不推荐)先进行强制类型转换,再比较 ab 的值是否相等,如果值相等,则返回 true
字符串类型:字符相同(区分大小写)、字符顺序相同。
a === b全等(推荐)不进行强制类型转换,再比较 ab 的类型和值是否全相等,需类型和值同时都相等,则返回 true
注意:undefined === undefinednull === null 都会返回 true,但 undefined === null 会返回 false
注意:如果 ab 都是对象,则仅当它们引用同一对象时才会返回 true
注意:其它详见“=== 运算符与 Object.is() 静态方法的区别”章节。
字符串类型:类型相同、字符相同(区分大小写)、字符顺序相同。
a != b不相等(不推荐)先进行强制类型转换,再比较 ab 的值是否不相等,如果值不相等,则返回 true
a !== b不全等(推荐)不进行强制类型转换,再比较 ab 的类型和值是否不相等,如果类型和值有其一不相等或全不相等,则返回 true
注意:不全等运算符(!==)是全等运算符(===)的否定,a !== b!(a === b) 的结果始终相同。

6.关系比较运算符

运算符名称描述
a < b小于如果 a 小于 b,则返回 true
a <= b小于或等于如果 a 小于或等于 b,则返回 true
a > b大于如果 a 大于 b,则返回 true
a >= b大于或等于如果 a 大于或等于 b,则返回 true

7.布尔逻辑运算符

运算符名称描述
!表达式逻辑非(not)如果表达式的计算结果为 false,则返回 true,否则返回 false。如果想得到表达式的计算结果,可以取反两次:!!表达式
表达式1 && 表达式2逻辑与(and)如果左侧表达式1的计算结果为 false,则不计算右侧表达式2并返回左侧表达式1的返回值。如果左侧表达式1的计算结果为 true,则继续计算右侧表达式2并返回右侧表达式2的返回值。
表达式1 || 表达式2逻辑或(or)如果左侧表达式1的计算结果为 true,则不计算右侧表达式2并返回左侧表达式1的返回值。如果左侧表达式1的计算结果为 false,则继续计算右侧表达式2并返回右侧表达式2的返回值。

8.位运算符

运算符名称示例结果
~a按位非 NOT~5-6
a & b按位与 AND5 & 11
a | b按位或 OR5 | 15
a ^ b按位异或 XOR5 ^ 14
a << b左移位5 << 110
a >> b有符号右移位5 >> 12
a >>> b无符号右移位5 >>> 12

9.三元条件运算符

运算符描述
(表达式1) ? (表达式2) : (表达式3)如果表达式1的计算结果为 true,则返回表达式2,否则返回表达式3。

10.分组运算符

实例描述
(1 + 2) * 3 // 3 * 3分组运算符 () 用于控制表达式中求值的优先级。它还充当某些语法结构中任意表达式的容器,否则会出现歧义或语法错误,比如立即调用的函数表达式、对象字面量解构赋值中给已声明的变量赋值时等。

11.逗号运算符

示例描述
let num1, num2, num3;
let num1 = 1, num2 = 2, num3 = 3;

const num1 = 1, num2 = 2, num3 = 3;
用来在同一条语句中同时声明(初始化)多个变量或常量。
let num = (5, 1, 4, 8, 0); // num 的值为 0对每个操作数从左往右求值,并返回最后一个操作数的值。

12.可选链?.运算符

运算符描述
o?.a如果 o 为 nullundefined,则不计算 a 并返回 undefined,否则 o?.a 的结果与 o.a 的结果相同。
o?.[a]如果 o 为 nullundefined,则不计算 a 并返回 undefined,否则 o?.[a] 的结果与 o[a] 的结果相同。
f?.(实参)如果 f 为 nullundefined,则不计算实参并返回 undefined,否则 f?.(实参) 的结果与 f(实参) 的结果相同。注意:?. 不会检测 f 是不是函数。

13.Null运算符

运算符名称描述
a ?? bNull合并如果 anullundefined,则返回 b,否则返回 a
a ??= bNull合并赋值如果 anullundefined,则将 b 赋值给 a,否则返回 a

14.展开(Spread)运算符(...)

展开(Spread)操作符又称为扩展操作符。

14.1展开数组字面量

14.1.1用于变量赋值

注意:展开运算符 ... 必须在 [] 内使用。

注意:对新数组的元素的更改不会反应到老数组的元素。

//新数组中的元素全部由老数组中的元素组成。
let arr1 = [1, 2, 3];
let arr2 = [...arr1];  
console.log(arr2);  // [1, 2, 3]
//新数组中的部分元素由老数组中的元素组成。
//新老数组无重复元素
let arr1 = [1, 2, 3];
let arr2 = [0, ...arr1, 4, 5];  
console.log(arr2);  // [0, 1, 2, 3, 4, 5]

//新老数组有重复元素,不会去重,仅此复制而已。
let arr1 = [1, 2, 3];
let arr2 = [1, ...arr1, 2, 3];  
console.log(arr2);  // [1, 1, 2, 3, 2, 3]

实际上,展开运算符可以展开任何可迭代(Iterable)对象。

let s = "12";
let arr = [...s];
console.log(arr);  // [1, 2]
let s = new Set([1, 2]);
let arr = [...s];
console.log(arr);  // [1, 2]

14.1.2用于函数实参

规则参考上面的“用于变量赋值”章节。

//方法调用
function f(a, b, c) {
  console.log(a, b, c);
}

let arr = [1, 2, 3];
f(...arr);  // 1 2 3

14.2展开对象字面量

14.2.1用于变量赋值

注意:展开运算符 ... 必须在 {} 内使用。

注意:对新对象的属性的更改不会反应到老对象的属性。

//新对象中的属性全部由老对象中的属性组成。
let o1 = { a: 1, b: 2 };
let o2 = {...o1};
console.log(o2);  // { a: 1, b: 2 }
//新对象中的部分属性由老对象中的属性组成。
//新老对象无同名属性
let o1 = { a: 1, b: 2 };
let o2 = {...o1, c: 3 };
console.log(o2);  // { a: 1, b: 2, c: 3 }

//新老对象有同名属性,后面的属性会覆盖前面的属性。
let o1 = { a: 1, b: 2 };
let o2 = {...o1, a: 3 };
console.log(o2);  // { a: 3, b: 2 }

let o1 = { a: 1, b: 2 };
let o2 = { a: 3, ...o1 };
console.log(o2);  // { a: 1, b: 2 }

14.2.2用于函数实参

JavaScript 语言不支持展开作为实参的对象字面量。

15.delete运算符

运算符描述
delete 对象名.属性名;
delete 对象名[表达式];
删除一个对象的属性。

16.in运算符

运算符描述
'属性名' in 对象名;
"属性名" in 对象名;
如果指定对象存在指定的属性,则返回 true

17.instanceof运算符

运算符描述
对象名 instanceof 引用类型名如果指定对象是指定引用类型(或指定引用类型的派生类型)的实例,则返回 true

18.typeof运算符

运算符描述
typeof 操作数;
typeof (操作数);
返回一个表示 操作数 类型的字符串值。
操作数类型返回的字符串值
BigInt"bigint"
Number"number"
Boolean"boolean"
String"string"
Symbol"symbol"
Undefined"undefined"
Null"object"
Object以及任何其它类型"object"
Function(函数定义和类定义以及实现了内部[[Call]] 方法的对象)"function"

19.void运算符

运算符描述
void 表达式;
void (表达式);
对指定表达式求值,然后返回 undefined

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/javascript/javascriptlang/1944.html

(0)
huoxiaoqiang的头像huoxiaoqiang
上一篇 2020年8月2日 02:21
下一篇 2020年8月4日 02:23

相关推荐

  • 2.4JavaScript引用类型之类(Class)

    类是一种“特殊的函数”。 就像函数声明定义方式和函数表达式定义方式一样,类的定义方式也有两种:类声明定义方式和类表达式定义方式。 1.类声明 注意:在同一个作用域,类声明不可以重复定义,否则会报错。 2.类表达式 注意:在同一个作用域,类表达式不可以重复定义,否则会报错。 注意:命名类表达式的右侧依然是类表达式,不是类…

  • 1.7JavaScript语言的函数(Function)

    1.Function()函数方式 Function() 函数方式创建的函数定义存在安全性和性能问题,所以不推荐使用,不过此种创建函数定义的方式很好地诠释了函数声明、函数表达式、箭头函数表达式是 Function 类型的实例这个概念。 2.函数声明 注意:在同一个作用域,相同名称的函数可以重复声明,但后定义的会覆盖先定义…

  • 2.11JavaScript语言的异步函数

    1.异步函数声明 如果您想声明一个异步函数,只需要首先在普通函数前添加一个 async 关键字,然后在函数体内至少包含一个 await 关键字即可。普通函数支持函数声明、函数表达式、箭头函数、立即调用的函数表达式和实例方法。 2.await表达式 await 关键字后的表达式可以是 实现了 Thenable 接口的对象…

发表回复

登录后才能评论