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

1.一元运算符

运算符名称描述
+a取正a 的值本身。
-a取负a 的负值。
++a前递增a 的值加 1,然后返回 a。
--a前递减a 的值减 1,然后返回 a。
a++后递增返回 a,然后将 a 的值加 1。
a--后递减返回 a,然后将 a 的值减 1。
delete 对象名.属性名
delete 数组名[索引]
————删除一个对象的属性或者一个数组中某一个索引对应的值。
typeof 操作数
typeof (操作数)
————返回一个表示 操作数 类型的字符串值。
void 表达式
void (表达式)
————表明一个运算没有返回值。

2.算术运算符

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

3.赋值运算符

运算符名称
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无符号右移位赋值

4.相等性运算符

运算符名称描述
a == b相等(不推荐)先进行强制类型转换,再比较 ab 的值是否相等,如果值相等,则返回 true
a === b全等(推荐)不进行强制类型转换,再比较 ab 的类型和值是否全相等,需类型和值同时都相等,则返回 true
a != b不相等(不推荐)先进行强制类型转换,再比较 ab 的值是否不相等,如果值不相等,则返回 true
a !== b不全等(推荐)不进行强制类型转换,再比较 ab 的类型和值是否不相等,如果类型和值有其一不相等或全不相等,则返回 true

5.关系比较运算符

运算符名称描述
a < b小于如果 a 小于 b,则返回 true
a <= b小于或等于如果 a 小于或等于 b,则返回 true
a > b大于如果 a 大于 b,则返回 true
a >= b大于或等于如果 a 大于或等于 b,则返回 true
属性名 in 对象名
数组索引 in 数组名
————如果所指定的对象中存在所指定的属性,则返回 true
如果所指定的数组中存在所指定的索引,则返回 true
对象名 instanceof 对象类型————如果所判别的对象确实是所指定的类型,则返回 true

6.布尔逻辑运算符

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

7.位运算符

运算符名称示例结果
a ~ b按位非 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

8.三元条件运算符

运算符描述
(expr1) ? (expr2) : (expr3)在 expr1 为 true 时,返回 expr2,否则返回 expr3。

9.Null运算符

运算符名称描述
a?.x可选链如果 a 为 null 或 undefined,则返回 undefined,否则 a?.x 的结果与 a.x 的结果相同。
a ?? bNull合并如果 a 为 null 或 undefined,则返回 b,否则返回 a。
a ??= bNull合并赋值如果 a 为 null 或 undefined,则将 b 赋值给 a,否则返回 a。

10.逗号运算符

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

11.非运算符

非运算符名称描述
;分号分隔语句
...省略号用于剩余运算符和展开运算符。

11.1...剩余(rest)运算符

剩余运算符描述
[...变量名]添加在数组解构赋值左侧的变量名前面,表示将右侧数组内剩余的元素打包(pack)成数组赋给此变量。
{...变量名}添加在对象字面量解构赋值左侧的变量名前面,表示将右侧对象内剩余的属性打包(pack)成对象赋给此变量。
...方法形参名添加在方法声明的形参名前面,表示将剩余的方法实参打包(pack)为数组传递给此方法形参。

11.1.1用于数组解构赋值

//多余元素会被打包成数组
let [a, b, ...rest] = [10, 20, 30, 40, 50];
console.log(rest); // [30, 40, 50]

11.1.2用于对象字面量解构赋值

//多余属性会被打包成对象
const { a, ...others } = { a: 1, b: 2, c: 3 };
console.log(others); // { b: 2, c: 3 }

11.1.3用于方法剩余形参

function sum(...theArgs) {
  let total = 0;
  for (const arg of theArgs) {
    total += arg;
  }
  return total;
}

console.log(sum(1, 2, 3));
//输出:6

console.log(sum(1, 2, 3, 4));
//输出:10

11.2...扩展(spread)运算符

扩展运算符描述
[...数组变量名]把已存在可迭代对象(比如数组字面量)中的元素解包复制到新可迭代对象中。
{...对象变量名}把已存在对象字面量中的属性解包复制到新对象字面量中。
方法调用(...数组字面量)方法调用(...数组变量名)用于将可迭代对象(比如数组)解包(unpack)为独立的方法实参。

11.2.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]

11.2.2用于解包复制对象字面量

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

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

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

11.2.3用于解包复制方法实参

//方法调用
function myFunction(v, w, x, y, z) {}
const args = [0, 1];
myFunction(-1, ...args, 2, ...[3]);

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

(0)
上一篇 2020年8月2日
下一篇 2020年8月4日

相关推荐

发表回复

登录后才能评论