第三阶段:运算符
- 赋值运算符:
- =:基本赋值,
let a = 5; - +=:相加后赋值,
let b = 3; b += 2; // b 变为 5 - -=:相减后赋值,
let c = 5; c-= 2; // c 变为 3 - *=:相乘后赋值,
let d = 2; d *= 3; // d 变为 6 - /=:相除后赋值,
let e = 6; e /= 2; // e 变为 3 - %=:取模后赋值,
let f = 5; f %= 2; // f 变为 1 - **=「ES6+」:幂运算后赋值,
let g = 2; g **= 3; // g 变为 8 - &&=「ES6+」:逻辑与后赋值,如果左边为真,才赋值右边的值。
let h = true; let i = 5; h &&= i; // h 变为 5 - ||=「ES6+」:逻辑或后赋值,如果左边为假,才赋值右边的值。
let j = false; let k = 10; j ||= k; // j 变为 10 - ??=「ES6+」:空值合并后赋值,如果左边为
null或undefined,才赋值右边的值。let l; l??= 20; // l 变为 20
- 算术运算符:
± * / %:加、减、乘、除、取模。
let result1 = 5 + 3; // 8,let result2 = 5- 3; // 2,let result3 = 5 * 3; // 15,let result4 = 5 / 3; // 1.666...,let result5 = 5 % 3; // 2++ 自增、-- 自减:
++/-- 在后,先使用再 ++/-- :
let m = 3; let n = m++; // n 为 3,m 变为 4++/-- 在前,先 ++/-- 再使用:
let o = 3; let p =--o; // p 为 2,o 变为 2*幂运算「ES6+」*:
let q = 2 ** 3; // 8
- 比较运算符:
- > < >= <=:大于、小于、大于等于、小于等于。
let r = 5 > 3; // true,let s = 5 < 3; // false - == 宽松相等、=== 严格相等:
==会进行类型转换再比较,===不进行类型转换直接比较,类型和值都必须相等才为真。let t1 = 5 == '5'; // true,let t2 = 5 === '5'; // false - !=、!==:宽松不等、严格不等。
let u1 = 5!= 3; // true,let u2 = 5!== '5'; // true
- 逻辑运算符:
- && 与:两边都为真才为真。
console.log(true && false); // false - || 或:只要一边为真就为真。
console.log(true || false); // true - ! 非:取反。
console.log(!true); // false
空值合并运算符??「ES6+」:如果左边值为
null或undefined,返回右边值,否则返回左边值。let w1 = null?? 10; // 10,let w2 = 5?? 10; // 5可选链操作符?.「ES6+」:
- 对象
?. 属性:安全访问对象属性,若对象为null或undefined不会报错。let obj = {sub: {prop: 'value'}}; let value = obj?.sub?.prop; // value 为 'value' - 数组
?.[]:安全访问数组元素。let arr = [1, 2]; let element = arr?.[1]; // element 为 2,如果arr为null或undefined,返回undefined - 函数
?.():安全调用函数。let func; let res = func?.(); // res 为 undefined,如果func为null或undefined不会报错,而是返回undefined
三元运算符 条件?a : b:如果条件为真返回
a,为假返回b。let x = 5 > 3? 'yes' : 'no'; // 'yes'位运算符:
- &:按位与,对每一位进行与运算(对应位都为 1 才为 1)。
let y1 = 5 & 3; // 1(5 的二进制是 101,3 的二进制是 011,按位与后为 001 即 1) - |:按位或,对每一位进行或运算(对应位有一个为 1 就为 1)。
let y2 = 5 | 3; // 7(二进制运算:101 | 011 = 111 即 7) - ^:按位异或,对每一位进行异或运算(对应位不同为 1,相同为 0)。
let y3 = 5 ^ 3; // 6(二进制:101 ^ 011 = 110 即 6) - ~:按位取反,对每一位取反。
let y4 = ~5; //-6(5 的二进制 101 取反为 010,在 JavaScript 中以补码形式表示负数,010 补码为 110 即-6) - << >> >>>:左移(将二进制数左移指定位数,右边补 0)、有符号右移(将二进制数右移指定位数,左边补符号位)、无符号右移(将二进制数右移指定位数,左边补 0)。
let y5 = 5 << 1; // 10(5 的二进制 101 左移一位为 1010 即 10)
- 逗号运算符,:从左到右计算表达式,返回最后一个表达式的值。
let z1 = (1 + 2, 3 + 4); // 7 - in 运算符:检测属性是否存在对象。
let person = {name: 'John'}; let hasName = 'name' in person; // true - delete 运算符:删除对象属性。
let person2 = {age: 30}; delete person2.age; // person2 变为 {} - new 运算符:实例化构造函数。
function Animal() {}; let myAnimal = new Animal(); - 展开运算符 …「ES6+」:
- 数组展开:将数组展开成多个元素。例如:
constarr1=[1,2];constarr2=[...arr1,3,4];console.log(arr2);// [1, 2, 3, 4]- 对象展开:将对象展开成多个键值对。例如:
constobj1={name:'Tom'};constobj2={...obj1,age:20};console.log(obj2);// {name: 'Tom', age: 20}- 函数传参展开:将数组展开作为函数参数。例如:
functionadd(a,b){returna+b;}constnumbers=[3,5];constresult=add(...numbers);console.log(result);// 8- 运算优先级、括号改变优先级规则:
- 优先级从高到低:括号
()最高,其次是一元运算符(如!、++、--等),然后是算术运算符(*、/、%高于+、-),接着是比较运算符,再是逻辑运算符(&&高于||),最后是赋值运算符。 - 括号可以改变优先级,例如
(2 + 3) * 4先计算括号内的加法,再进行乘法。
实战练习:
- 对比 == 与 === 多组测试用例
- 展开运算符合并数组、合并对象、函数传参
思考题:
- || 和??空值合并运算符区别?
- 展开运算符是浅拷贝还是深拷贝?
- delete 能删除 var 声明的全局变量吗?