第三阶段:运算符
- =:基本赋值,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)
- 数组展开:将数组展开成多个元素。例如:
const arr1 = [1, 2];
const arr2 = […arr1, 3, 4];
console.log(arr2); // [1, 2, 3, 4]
- 对象展开:将对象展开成多个键值对。例如:
const obj1 = {name: 'Tom'};
const obj2 = {…obj1, age: 20};
console.log(obj2); // {name: 'Tom', age: 20}
- 函数传参展开:将数组展开作为函数参数。例如:
function add(a, b) {
return a + b;
}
const numbers = [3, 5];
const result = add(…numbers);
console.log(result); // 8
- 优先级从高到低:括号 () 最高,其次是一元运算符(如 !、++、– 等),然后是算术运算符(*、/、% 高于 +、-),接着是比较运算符,再是逻辑运算符(&& 高于 ||),最后是赋值运算符。
- 括号可以改变优先级,例如 (2 + 3) * 4 先计算括号内的加法,再进行乘法。
实战练习:
思考题:






