JavaScript 运算符是用于对值和变量执行操作的符号或关键字。它们是构建表达式的基础,能够以多种方式操作数据。掌握各类运算符的用法,是编写高效、清晰代码的关键。
熟悉 JavaScript 中 12 类常用运算符及其用途
理解赋值、比较、逻辑等核心运算符的行为差异
掌握现代运算符(如可选链 ?.、BigInt 运算)的使用场景
避免因运算符优先级或类型转换导致的常见错误
用于执行基本数学运算。
const sum = 5 + 3; // 8
const diff = 10 - 2; // 8
const p = 4 * 2; // 8
const q = 8 / 2; // 4
console.log(sum, diff, p, q); // 输出:8 8 8 4注意:
+也可用于字符串拼接。
将值赋给变量,支持复合操作。
let n = 10;
n += 5; // n = 15
n *= 2; // n = 30
console.log(n); // 输出:30比较两个值,返回布尔结果(true / false),常用于条件判断。
console.log(10 > 5); // true
console.log(10 === "10"); // false(类型不同)
最佳实践:始终优先使用
===和!==,避免隐式类型转换带来的 bug。
用于组合多个布尔表达式。
const a = true, b = false;
console.log(a && b); // false
console.log(a || b); // true
console.log(!a); // false短路求值:
a && b:若a为假,则不计算b
a || b:若a为真,则不计算b
常用于默认值设置:name = input || "匿名用户";
对数字的二进制表示进行操作(较少使用,多见于底层优化或加密场景)。
const res = 5 & 1; // 1
console.log(res);条件表达式的简写形式,是 if-else 的紧凑替代。
condition ? exprIfTrue : exprIfFalseconst age = 18;
const status = age >= 18 ? "成年人" : "未成年人";
console.log(status); // 输出:成年人适用于简单条件赋值,避免嵌套过深。
依次执行多个表达式,并返回最后一个表达式的值。
let n1, n2;
const res = (n1 = 1, n2 = 2, n1 + n2);
console.log(res); // 输出:3使用场景有限,常见于
for循环初始化:for (let i = 0, j = 10; i < j; i++, j--) { ... }
仅作用于一个操作数。
let x = 5;
console.log(++x); // 6(先加 1,再输出)
console.log(x--); // 6(先输出,再减 1)
// 此时 x = 5前置 vs 后置区别:
++x:先自增,再返回新值
x++:先返回原值,再自增
用于检查对象属性或实例关系。
const obj = { length: 10 };
console.log("length" in obj); // true
console.log([] instanceof Array); // true注意:
instanceof对跨 iframe 或不同全局环境的对象可能失效。
用于处理超出 Number.MAX_SAFE_INTEGER 的大整数。
字面量以 n 结尾:123n
支持 +, -, *, /, %, ** 等算术运算
不能与普通 Number 混合运算
const big1 = 123456789012345678901234567890n;
const big2 = 987654321098765432109876543210n;
console.log(big1 + big2);
// 输出:1111111110111111111011111111100n主要用于字符串拼接。
const s = "Hello" + " " + "World";
console.log(s); // 输出:Hello World注意:
+在数字和字符串混合时会转为字符串拼接:console.log(5 + "3"); // "53"
Optional Chaining, ?.
安全访问嵌套对象属性,避免因中间属性为 null/undefined 而报错。
const obj = { name: "李明", address: { city: "北京" } };
console.log(obj.address?.city); // "北京"
console.log(obj.contact?.phone); // undefined(不会报错)等价于传统写法:
obj.contact && obj.contact.phone但更简洁、安全。
支持多种用法:
obj?.prop(属性访问)
obj?.[expr](动态属性)
func?.()(函数调用)
arr?.[index](数组元素)
以下代码输出什么?为什么?
console.log([] == ![]);如何使用可选链安全地获取 user.profile.settings.theme,即使 user 或中间属性可能不存在?
为什么 typeof null 返回 "object"?这会影响哪些运算符的使用?