云计算百科
云计算领域专业知识百科平台

05 条件判断:=== 才是正道(if/else · 逻辑连接词 · 三元 · switch)

上一篇:04 数字与字符串:+ 号的两副面孔(拼接与相加 · NaN · 类型互转 · 模板字符串)


上篇练习参考答案

练习 1(手动模拟):手动模拟(先写答案再回车):“10” + 5、10 + 5 + “5”、“10” – 5、“3” * “4” 各得什么? 在这里插入图片描述

规律收口:只有 + 遇文则文,其他运算符遇文转数。

练习 2(预测再验证):预测再验证:Number(“”)、Number(“12 8”)、parseInt(“12 8”)、parseFloat(“3.5折”) 的结果各是什么?哪个出乎你意料? 在这里插入图片描述 Number("") 得 0(历史决定); Number("12 8") 得 NaN——中间的空格算杂质,严格派直接拒绝; parseInt("12 8") 得 12——薅到空格就停; parseFloat("3.5折") 得 3.5; 出乎意料的多半是前两个:空串变 0、一个空格就能毒死 Number。

练习 3(改造要点):改造要点:账单加第四笔餐费 “128元”(烧烤)——数据区加一行、合计处加一项,重跑;顺便观察"事故还原"那行跟着变长了多少; 数据区加 const bill4 = "128元"; 洗出 food4 = parseFloat(bill4) 合计加一项——"事故还原"那行变成 "198元225元217元128元",又长一截 每加一笔不洗的账,鬼话就长一截。

练习 4(疫苗揭晓):人均 87.56 元,预算线 90 元——“超没超"是个是非题,程序靠什么回答是非题?控制台试试 console.log(87.56 > 90);再试试 console.log(“10” < “9”)——结果竟然是 true,10 为什么会小于 9?05 篇揭晓比较运算符的坑,和 JS 世界最重要的三条等号。 87.56 > 90 得 false,没超预算,"10" < "9" 得 true——比较运算符两边都是字符串时不转数字,改走字典序:像查字典一样逐字符比,第一位 "1" 排在 "9" 前面,于是 "10" 整体"小于” "9"。教训:数字比较前先洗类型。今天就把"比较"连同"判断"一次讲透,顺便立 JS 世界最重要的一条军规。


一、场景引入:路口与裁判

在这里插入图片描述

前四篇的程序都是一条道走到黑——从上到下每行都执行。但真实世界处处是岔路口:成绩 85 走"良好"岔口,59 走"补考"岔口;密码对走"放行",错走"重试"。程序的"聪明"从今天开始:让代码自己选路。

本篇还要立一条 JS 特有的军规:判断相等永远用三个等号 ===。用两个等号,你会收获 "1" == 1 为 true、"" == 0 为 true 这些惊悚结果——它们是 JS 面试的经典送命题,更是真实项目里逻辑鬼畜的头号来源。

二、本篇目标

  • 会写 if / else if / else 多级分支;
  • 立 === 军规,认清 == 的隐式转换坑;
  • 掌握 &&、||、! 三个逻辑连接词;
  • 会用三元表达式在模板字符串里"就地分岔";
  • 认识 switch:同一个变量多值匹配时的清爽写法。
  • 三、知识点讲解

    3.1 if / else:布尔当裁判

    const score = 85;
    if (score >= 90) {
    console.log("优秀");
    } else if (score >= 60) {
    console.log("及格");
    } else {
    console.log("不及格");
    }

    在这里插入图片描述

    语法要点:条件写在小括号里,大括号包住"条件成立才执行的代码";else if 可以连很多级;从上往下依次检查,命中一个岔口就进,后面全部跳过——85 命中 >= 60,不再看 else。

    比较运算符全家福:> >= < <= ===(相等)!==(不等)。它们的产出永远是布尔值——03 篇说布尔是判断燃料,现在正式点火。

    falsy 六兄弟:小括号里的条件其实不一定是布尔,JS 会自动转换。只有六个值会被转成 false:false、0、""、null、undefined、NaN,其余一切转成 true(连 "false" 这个字符串都是 true!)。建议:条件里永远写明确的比较(如 score >= 60),把隐式转换留给读旧代码的时候。

    3.2 === 军规:三个等号才是正道

    === 全等:值和类型都相同才算相等。== 宽松:先做一轮隐式转换再比——转换规则复杂到能出面试题:

    表达式结果人话翻译
    "1" == 1 true 字符串被转成数字再比
    "" == 0 true 空串被转成 0
    0 == false true 数字被转成布尔
    null == undefined true 两个"空"被特判相等
    "1" === 1 false 类型不同,直接不等,干净利落

    军规只有一句:自己写代码,比较相等只用 ===;== 留给读别人的老代码时"认识它"。它和 04 篇的隐式转换是同一款赌——宽松等号赌的是"转换规则恰好如你所愿",而规则表长得没人背得完。同理,不等用 !==,别用 !=。

    3.3 逻辑连接词:&&、||、!

    真实条件常常是复合的——"90 分并且全勤"才有奖学金:

    const hasScholarship = score >= 90 && attendance === "全勤"; // 并且:两边都真才真
    const canMakeup = score < 60 || score === 1; // 或者:一边真就真
    const isAbsent = !(score >= 0); // 取反:真假互换

    口诀:&& 收紧(都得满足),|| 放宽(满足其一),! 反着说。复合条件建议先存进一个见名知意的布尔变量(如 hasScholarship),if 里只写变量名——比把三行逻辑塞进小括号可读十倍。

    短路求值(附赠冷知识):&& 和 || 执行时还会"偷懒"——A && B 若 A 是 falsy,右边看都不看,直接返回 A;A || B 若 A 是 truthy,同样直接返回 A。这个特性最出名的用法是兜底默认值:

    const input = ""; // 用户没填,空串是 falsy
    const name = input || "匿名用户"; // 左边没货,取右边的兜底
    console.log(name); // 匿名用户

    在这里插入图片描述

    逻辑:input 有真内容就用它,是空串/null/undefined 这类"没货"值就换默认值。17 篇从 localStorage 取存档时会用到这招——第一次访问还没存过档,取出来是 null,用 || 一行兜底,优雅不崩。现在混个脸熟,到时候会心一笑。

    3.4 三元表达式:就地分岔的小 if

    条件 ? A : B

    条件真取 A、假取 B。它是表达式(有值),所以能直接塞进模板字符串:

    const score = 85;
    console.log(`结果:${score >= 60 ? "通过" : "补考"}`);

    在这里插入图片描述

    一句话完成分岔,报表和看板里高频出场。注意它只适合"二选一"——三岔以上老实用 if。

    3.5 switch:多值匹配的清爽写法

    同一个变量比对多个具体值时,if/else 链写着啰嗦,switch 更清爽:

    const level = "B";
    switch (level) {
    case "A": console.log("优秀"); break;
    case "B": console.log("良好"); break;
    case "C": console.log("及格"); break;
    default: console.log("其他");
    }

    在这里插入图片描述

    两条必守的规矩:

    • 每个 case 末尾写 break——漏了 break,命中后会"漏"到下一个 case 继续执行,经典坑;
    • switch 的匹配用的是 ===(严格相等)——case "A" 匹配不上 "a",大小写敏感。

    default 是全都不中时的兜底,相当于 else。注意分工:比对具体值用 switch,比对范围(分数段)用 if——switch 写不了 >= 60。

    四、完整实战:成绩判定器

    把五种判断工具拼成一台完整的"判定机"。新建 成绩判定器.html:

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    <meta charset="UTF-8">
    <title>成绩判定器</title>
    </head>
    <body>
    <h2>成绩判定器</h2>
    <p>判定报告在控制台——按 F12 查看。</p>

    <script>
    // ===== 数据区 =====
    const studentName = "星宇";
    const score = 78; // 数字,不是字符串——04 篇的教训记住了
    const attendance = "全勤"; // 考勤情况

    // ===== 判定区:等级链 =====
    let grade; // 等级要先算出来,所以用 let
    if (score >= 90) {
    grade = "优秀";
    } else if (score >= 75) {
    grade = "良好";
    } else if (score >= 60) {
    grade = "及格";
    } else {
    grade = "不及格";
    }

    // 复合条件:奖学金(&& 收紧)
    const hasScholarship = score >= 90 && attendance === "全勤";

    // ===== 输出区:模板字符串 + 三元 =====
    console.log("=".repeat(40));
    console.log(" 成 绩 判 定 报 告");
    console.log("=".repeat(40));
    console.log(`姓名:${studentName}`);
    console.log(`分数:${score}(类型 ${typeof score},纯数字)`);
    console.log(`考勤:${attendance}`);
    console.log(`等级:${grade}`);
    console.log(`结论:${score >= 60 ? "本学期平安落地" : "假期规划补考"}`);
    console.log(`奖学金:${hasScholarship ? "符合条件,可以申请" : "暂不符合(需 90 分以上且全勤)"}`);
    console.log("=".repeat(40));
    </script>
    </body>
    </html>

    留个心眼看结构:数据区 → 判定区 → 输出区,三段式和 03 篇的资料卡一脉相承——以后所有工具都是"数据进来、逻辑加工、报告出去",只是每段会越长越壮。

    五、运行效果

    在这里插入图片描述

    ========================================
    成 绩 判 定 报 告
    ========================================
    姓名:星宇
    分数:78(类型 number,纯数字)
    考勤:全勤
    等级:良好
    结论:本学期平安落地
    奖学金:暂不符合(需 90 分以上且全勤)
    ========================================

    六、常见报错与排查

    报错 1:SyntaxError: Unexpected token 'else' 在这里插入图片描述

    原因:九成是 if 那行行尾手滑多了分号——if (score >= 90); 分号把 if 提前"终结",后面的 else 成了孤儿。 解决:删掉那个分号。军规:if / else 行尾永远不写分号(分号属于大括号里的语句,不属于 if 行本身)。

    现象 2:某个分支永远执行(或永远不执行)

    原因:条件里写了一个等号——if (score = 90) 是赋值:把 90 塞进 score,整个表达式值为 90(truthy),永远走 if 分支,还不报任何错。 解决:数一数条件里的等号数量——一个 = 是赋值,=== 才是比较。这是新手逻辑鬼畜第一名,比报错更阴险。

    现象 3:"10" < "9" 为 true

    04 篇疫苗的正式答案:两边都是字符串,比较走字典序,逐字符比对。 解决:数字比较前先 Number() 洗一遍,保证两边都是 number。

    排查心法:else 报错找分号,逻辑鬼畜数等号,比较离谱查类型。条件世界的三大坑,一句话打包。

    七、练习作业

  • 手动模拟(先写答案再回车):"1" == 1、"1" === 1、null == undefined、null === undefined、0 == false、0 === false 各得什么?
  • 预测再验证:const x = 0; 之后执行 if (x = 5) { console.log("A"); } else { console.log("B"); } 输出什么?x 最后的值变成了多少?为什么?
  • 改造要点:给判定器加"旷考"分支——score === -1 表示旷考,等级判为"旷考"、结论判为"需联系教务";注意 else if 的顺序该插在哪(提示:-1 < 60,放最前面判断);
  • 疫苗(下篇预告):现在判定器只能判一个学生。全班 8 个人、8 个分数,难道把判定区复制 8 遍?电脑最擅长的事就是重复——06 篇的循环三行代码判 800 人。动手前先在纸上想:判定区哪些行是"每个学生都要跑一遍"的,哪些行是"全班只需跑一遍"的?(这个思考就是 07 篇函数化的预热。)

  • 下一篇预告:《06 循环:让程序重复干活》——for 循环三段式、02 篇手写的星星树三行代码生成一百层,还有 break/continue 两张"逃生券"。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 05 条件判断:=== 才是正道(if/else · 逻辑连接词 · 三元 · switch)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!