您好!欢迎访问家园网-www.jy.wang!

家园网

Javascript中的运算符按操作数可分为单目运算符、双目运算符和多目运算符三种,那么,他们是啥意思?目是啥意思?为什么叫单目?

网络 作者:本站 点击:

在 JavaScript 中,运算符根据其操作数(即参与运算的变量或值)的数量可以分为单目运算符、双目运算符和多目运算符。这些名称的由来与运算符所需操作数的个数相关。

单目运算符(Unary Operator)

定义‌:单目运算符是指只需要一个操作数的运算符。这类运算符通常作用于一个变量或值。

命名由来‌:"单目"中的"目"指的是操作数,"单"表示只有一个操作数。例如:

  • 一元加法‌:+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

双目运算符(Binary Operator)

定义‌:双目运算符是指需要两个操作数的运算符。这类运算符通常作用于两个变量或值。

命名由来‌:"双目"中的"目"同样指的是操作数,"双"表示有两个操作数。例如:

  • 加法‌:x + y,将两个数相加。

  • 减法‌:x - y,将两个数相减。

  • 乘法‌:x * y,将两个数相乘。

  • 除法‌:x / y,将两个数相除。

  • 取模‌:x % y,求两个数相除的余数。

  • 比较运算符‌:x > yx < yx == y 等。

  • 逻辑运算符‌:x && yx || y

示例‌:

let a = 10;
let b = 5;
console.log(a + b); // 输出 15
console.log(a > b); // 输出 true
console.log(a && b); // 输出 5(因为 a 和 b 都为真)

多目运算符(Ternary Operator)

定义‌:多目运算符是指需要三个操作数的运算符。在 JavaScript 中,最典型的多目运算符是三元运算符。

命名由来‌:"多目"中的"目"指的是操作数,"多"表示有多个操作数。三元运算符是唯一一个需要三个操作数的运算符,其结构为 条件 ? 表达式1 : 表达式2

示例‌:

let age = 20;
let status = (age >= 18) ? "成年人" : "未成年人";
console.log(status); // 输出 "成年人"

在这个例子中,age >= 18 是条件表达式,"成年人" 是条件为真时的返回值,"未成年人" 是条件为假时的返回值。


JavaScript 三目运算符(也称为条件运算符)是一种非常实用的语法结构,它允许我们用一行代码来实现简单的条件判断。这种运算符之所以被称为"三目",是因为它需要三个操作数:一个条件表达式、一个当条件为真时的值、以及一个当条件为假时的值。下面详细解析其8个典型应用例子:

1. 基本条件赋值

let age = 20;
let status = age >= 18 ? "成年人" : "未成年人";

逐行解析‌:

  • let age = 20;:定义一个变量 age,并将其值设置为 20。

  • let status = age >= 18 ? "成年人" : "未成年人";:这是三目运算符的核心部分。

    • age >= 18 是条件表达式,它会计算 age 是否大于等于 18。

    • 如果条件为真(即 age 确实大于等于 18),则整个表达式的值为 "成年人"

    • 如果条件为假(即 age 小于 18),则整个表达式的值为 "未成年人"

    • 最终,status 变量将被赋值为计算结果。

2. 嵌套条件判断

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"。

    • 如果所有条件都为假,则 grade 为 "D"。

    • 这种方式可以实现多个等级的判断,从高到低依次比较。

3. 条件函数调用

let isLoggedIn = true;
let message = isLoggedIn ? console.log("欢迎回来") : console.log("请先登录");

逐行解析‌:

  • let isLoggedIn = true;:定义一个布尔变量 isLoggedIn 并赋值为 true。

  • let message = isLoggedIn ? console.log("欢迎回来") : console.log("请先登录");:这里三目运算符的两个结果都是函数调用。

    • 如果 isLoggedIn 为真(true),则执行 console.log("欢迎回来")

    • 如果 isLoggedIn 为假(false),则执行 console.log("请先登录")

    • 由于 console.log 函数没有返回值,message 变量最终会得到 undefined。

4. 对象属性设置

let user = {
    name: "张三",
    isActive: true,
    status: user.isActive ? "活跃用户" : "非活跃用户"
};

逐行解析‌:

  • let user = { ... };:创建一个对象 user。

  • name: "张三":设置对象的 name 属性为 "张三"。

  • isActive: true:设置对象的 isActive 属性为 true。

  • status: user.isActive ? "活跃用户" : "非活跃用户":这是三目运算符在对象中的应用。

    • 检查 user.isActive 的值。

    • 如果为真,则 status 属性值为 "活跃用户"。

    • 如果为假,则 status 属性值为 "非活跃用户"。

5. 数组元素处理

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,检查 n > 3 是否为真。

    • 如果为真(即 n 大于 3),则返回 n * 2(元素值乘以 2)。

    • 如果为假(即 n 小于等于 3),则返回 n(保持原值)。

    • 最终 result 数组将包含 [1, 2, 3, 8, 10]。

6. 条件返回值

function getMax(a, b) {
    return a > b ? a : b;
}

逐行解析‌:

  • function getMax(a, b) {:定义一个名为 getMax 的函数,接受两个参数 a 和 b。

  • return a > b ? a : b;:这是函数的返回语句。

    • 比较参数 a 和 b 的大小。

    • 如果 a 大于 b,则返回 a。

    • 如果 a 不大于 b(即 a 小于等于 b),则返回 b。

    • 这个函数的作用是返回两个数中的较大值。

7. 复杂条件表达式

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% 折扣)。

    • 如果两个条件都为假,则 discount 为 0(无折扣)。

    • 在这个例子中,price 为 150,所以 discount 为 0.1。

  • let finalPrice = price * (1 - discount);:计算最终价格。

    • 1 - discount 计算折扣后的比例(1 - 0.1 = 0.9)。

    • price * 0.9 计算最终价格(150 * 0.9 = 135)。

8. 条件赋值与默认值

let userName = null;
let displayName = userName || "访客";
let greeting = displayName ? `你好, ${displayName}!` : "欢迎访问";

逐行解析‌:

  • let userName = null;:定义变量 userName 并赋值为 null。

  • let displayName = userName || "访客";:这里使用了逻辑或运算符(||)。

    • 如果 userName 为真值(非 null、非 undefined、非空字符串等),则 displayName 为 userName 的值。

    • 如果 userName 为假值(null、undefined、空字符串等),则 displayName 为 "访客"。

    • 在这个例子中,userName 为 null,所以 displayName 为 "访客"。

  • let greeting = displayName ? 你好, ${displayName}! : "欢迎访问";:这是三目运算符的应用。

    • 检查 displayName 是否为真值。

    • 如果为真,则返回模板字符串 你好, ${displayName}!,其中 ${displayName} 会被替换为 "访客"。

    • 如果为假,则返回 "欢迎访问"。

三目运算符的优势在于其简洁性,能够用一行代码实现简单的条件逻辑。它特别适合用于赋值、返回值和简单的条件判断场景。然而,过度嵌套会使代码难以阅读,因此在使用时应保持适度。



总结

  • 单目运算符‌:只需要一个操作数,如 ++x-x

  • 双目运算符‌:需要两个操作数,如 x + yx > y

  • 多目运算符‌:需要三个操作数,如 x ? y : z(三元运算符)。

这些名称的由来直观地反映了运算符所需操作数的个数,便于理解和记忆。

标签: