JavaScript 运算符详解:单目、双目与多目
JavaScript 中根据操作数数量划分的单目、双目和多目运算符。详细列举了递增递减、逻辑非、算术运算及三元运算符等示例,并深入分析了嵌套条件、类型转换、浮点数精度等常见陷阱及规避方法,旨在帮助开发者准确理解和使用运算符。

JavaScript 中根据操作数数量划分的单目、双目和多目运算符。详细列举了递增递减、逻辑非、算术运算及三元运算符等示例,并深入分析了嵌套条件、类型转换、浮点数精度等常见陷阱及规避方法,旨在帮助开发者准确理解和使用运算符。


微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
在 JavaScript 中,运算符根据其操作数(即参与运算的变量或值)的数量可以分为单目运算符、双目运算符和多目运算符。这些名称的由来与运算符所需操作数的个数相关。
定义:单目运算符是指只需要一个操作数的运算符。这类运算符通常作用于一个变量或值。
命名由来:"单目"中的"目"指的是操作数,"单"表示只有一个操作数。例如:
+x,将变量 x 转换为数字。-x,将变量 x 取反。++x 或 x++,将变量 x 的值加 1。--x 或 x--,将变量 x 的值减 1。!x,对变量 x 进行逻辑取反。~x,对变量 x 进行按位取反。示例:
let x = 5;
console.log(-x); // 输出 -5
console.log(++x); // 输出 6
console.log(!true); // 输出 false
定义:双目运算符是指需要两个操作数的运算符。这类运算符通常作用于两个变量或值。
命名由来:"双目"中的"目"同样指的是操作数,"双"表示有两个操作数。例如:
x + y,将两个数相加。x - y,将两个数相减。x * y,将两个数相乘。x / y,将两个数相除。x % y,求两个数相除的余数。x > y、x < y、x == y 等。x && y、x || y。示例:
let a = 10;
let b = 5;
console.log(a + b); // 输出 15
console.log(a > b); // 输出 true
console.log(a && b); // 输出 5(因为 a 和 b 都为真)
定义:多目运算符是指需要三个或三个以上操作数的运算符。在 JavaScript 中,最典型的多目运算符是三元运算符。
命名由来:"多目"中的"目"指的是操作数,"多"表示有多个操作数。三元运算符是唯一一个需要三个操作数的运算符,其结构为 条件 ? 表达式 1 : 表达式 2。
示例:
let age = 20;
let status = (age >= 18) ? "成年人" : "未成年人";
console.log(status); // 输出 "成年人"
在这个例子中,age >= 18 是条件表达式,"成年人" 是条件为真时的返回值,"未成年人" 是条件为假时的返回值。
总结:单目运算符:只需要一个操作数,如
++x、-x。双目运算符:需要两个操作数,如x + y、x > y。多目运算符:需要三个操作数,如x ? y : z(三元运算符)。这些名称的由来直观地反映了运算符所需操作数的个数,便于理解和记忆。
let age = 20;
let status = age >= 18 ? "成年人" : "未成年人";
解析:
let age = 20;:定义一个变量 age,并将其值设置为 20。let status = age >= 18 ? "成年人" : "未成年人";:这是三目运算符的核心部分。
age >= 18 是条件表达式,它会计算 age 是否大于等于 18。"成年人"。"未成年人"。let score = 85;
let grade = score >= 90 ? "A" : score >= 80 ? "B" : score >= 70 ? "C" : "D";
解析:
let score = 85;:定义变量 score 并赋值为 85。let grade = score >= 90 ? "A" : score >= 80 ? "B" : score >= 70 ? "C" : "D";:这是一个嵌套的三目运算符。
score >= 90,如果为真则 grade 为 "A"。score >= 80,如果为真则 grade 为 "B"。score >= 70,如果为真则 grade 为 "C"。let isLoggedIn = true;
let message = isLoggedIn ? console.log("欢迎回来") : console.log("请先登录");
解析:
let isLoggedIn = true;:定义一个布尔变量 isLoggedIn 并赋值为 true。let message = isLoggedIn ? console.log("欢迎回来") : console.log("请先登录");:这里三目运算符的两个结果都是函数调用。
console.log("欢迎回来")。console.log("请先登录")。console.log 函数没有返回值,message 变量最终会得到 undefined。let user = { name: "张三", isActive: true };
user.status = user.isActive ? "活跃用户" : "非活跃用户";
解析:
let user = { ... };:创建一个对象 user。name: "张三":设置对象的 name 属性为 "张三"。isActive: true:设置对象的 isActive 属性为 true。user.status = user.isActive ? "活跃用户" : "非活跃用户":这是三目运算符在对象中的应用。
let numbers = [1, 2, 3, 4, 5];
let result = numbers.map(n => n > 3 ? n * 2 : n);
解析:
let numbers = [1, 2, 3, 4, 5];:创建一个包含数字 1 到 5 的数组。let result = numbers.map(n => n > 3 ? n * 2 : n);:使用 map 方法处理数组中的每个元素。
numbers.map() 方法会遍历数组中的每个元素。n => n > 3 ? n * 2 : n 是一个箭头函数,对每个元素 n 进行处理。n > 3 是否为真。n * 2(元素值乘以 2)。n(保持原值)。[1, 2, 3, 8, 10]。function getMax(a, b) {
return a > b ? a : b;
}
解析:
function getMax(a, b) {:定义一个名为 getMax 的函数,接受两个参数 a 和 b。return a > b ? a : b;:这是函数的返回语句。
let price = 150;
let discount = price >= 200 ? 0.2 : price >= 100 ? 0.1 : 0;
let finalPrice = price * (1 - discount);
解析:
let price = 150;:定义变量 price 并赋值为 150。let discount = price >= 200 ? 0.2 : price >= 100 ? 0.1 : 0;:这是复杂的嵌套三目运算符。
price >= 200,如果为真则 discount 为 0.2(20% 折扣)。price >= 100,如果为真则 discount 为 0.1(10% 折扣)。let finalPrice = price * (1 - discount);:计算最终价格。
1 - discount 计算折扣后的比例(1 - 0.1 = 0.9)。price * 0.9 计算最终价格(150 * 0.9 = 135)。let userName = null;
let displayName = userName || "访客";
let greeting = displayName ? `你好,${displayName}!` : "欢迎访问";
解析:
let userName = null;:定义变量 userName 并赋值为 null。let displayName = userName || "访客";:这里使用了逻辑或运算符(||)。
let greeting = displayName ? 你好,${displayName}! : "欢迎访问";:这是三目运算符的应用。
你好,${displayName}!,其中 ${displayName} 会被替换为 "访客"。三目运算符的优势在于其简洁性,能够用一行代码实现简单的条件逻辑。它特别适合用于赋值、返回值和简单的条件判断场景。然而,过度嵌套会使代码难以阅读,因此在使用时应保持适度。
JavaScript 中的单目、双目和多目运算符在使用时存在多种陷阱,主要包括以下几类:
++a 和 a++ 的执行顺序不同,前置运算符先增加再使用变量值,后置运算符先使用再增加。例如在表达式中 let a = 1; let b = ++a; 会使 b 的值为 2,而 let c = a++; 会使 c 的值为 1。+ 会尝试将操作数转换为数字,如果转换失败则返回 NaN。例如 +'abc' 的结果是 NaN。+ 既可以进行数学加法,也可以进行字符串拼接。当操作数中至少有一个是字符串时,JavaScript 会将另一个操作数也转换为字符串。例如 1 + "2" 的结果是 "12" 而不是 3。2 ** 3 * 2 会先计算幂运算再计算乘法,结果为 16。在逻辑运算符中,&& 的优先级高于 ||。0.1 + 0.2 的结果不是 0.3,而是 0.30000000000000004。== 时,JavaScript 会进行类型转换,可能导致意外结果。例如 0 == false 为 true,"" == false 为 true。condition ? (a > b ? a : b) : c 过于复杂时应简化。&& 和 || 不总是返回布尔值,而是返回实际参与运算的值。例如 0 || "hello" 会返回字符串 "hello"。|| 连接多个"不等于"条件时,可能导致判断始终为真。例如 if (a != 1 || a != 2) 会始终为真。=== 而非宽松相等 ==。null 和 undefined 时,它们的比较行为特殊。null == undefined 为 true,但 null === undefined 为 false。[1,2] + [3,4] 会得到 "1,23,4"。避免这些陷阱的关键在于理解运算符的特性和优先级,使用显式类型转换,以及在复杂逻辑中使用清晰的代码结构。