JavaScript 邏輯運算符與實戰案例:從原理到落地

JavaScript 中的邏輯運算符不僅是條件判斷的核心,還能通過“短路特性”簡化代碼;結合 DOM 操作的實戰案例,更能體現其靈活性。本文整理了邏輯運算符的個人理解、優先級規則,以及 4 個高頻實戰需求的實現方案,附個人思路與代碼解析。

一、邏輯運算符:個人理解與核心規則

邏輯運算符(&&||!)是 JS 中最常用的運算符之一,除了判斷真假,其“短路求值”特性更是簡化代碼的關鍵。

1. 核心規則:用“個人翻譯”講透邏輯運算

我習慣用“選值邏輯”理解 &&||,不用死記“true/false 組合表”,更貼近實際開發場景:

(1)邏輯與(&&):“先看第一個,錯了就選它,對了就選第二個”
  • 運算原則A && B
    • A 為“假”(空字符串 ''0nullundefinedNaN),直接返回 A(短路,不看 B);
    • A 為“真”,返回 B(無論 B 真假,都會執行到 B)。
  • 個人翻譯:比如 var res = a && b,可以理解為“a 靠譜嗎?不靠譜就用 a(代表錯的),靠譜就用 b”。
  • 示例
    console.log('abc' && 'def'); // 輸出 'def'(A真,選B)
    console.log('' && 'def');    // 輸出 ''(A假,選A)
    console.log(0 && 123);      // 輸出 0(A假,選A)
    
(2)邏輯或(||):“先看第一個,對了就選它,錯了就選第二個”
  • 運算原則A || B
    • A 為“真”,直接返回 A(短路,不看 B);
    • A 為“假”,返回 B(無論 B 真假,都會執行到 B)。
  • 個人翻譯:比如 var res = a || b,可以理解為“a 有用嗎?有用就用 a,沒用就用 b”。
  • 示例
    console.log('abc' || 'def'); // 輸出 'abc'(A真,選A)
    console.log('' || 'def');    // 輸出 'def'(A假,選B)
    console.log(0 || 123);      // 輸出 123(A假,選B)
    
(3)邏輯非(!):“把真假反過來”
  • 運算原則!A
    • 先將 A 轉為布爾值,再取反(真變假,假變真)。
  • 個人翻譯:“a 是對的嗎?不是就返回 true,是就返回 false”。
  • 示例
    console.log(!'abc');  // 輸出 false('abc'是真,取反為假)
    console.log(!'');     // 輸出 true(''是假,取反為真)
    console.log(!0);      // 輸出 true(0是假,取反為真)
    

2. 優先級:“非” > “與” > “或”

三個邏輯運算符的執行順序:!(邏輯非) > &&(邏輯與) > ||(邏輯或),優先級高的先執行。

  • 示例
    console.log(!false && true || false); 
    // 執行順序:!false → true,再 true && true → true,最后 true || false → true
    

3. 關鍵補充:“假值”的范圍

判斷 A 是“真”還是“假”,核心看是否屬于“假值”,JS 中只有 6 種假值:
''(空字符串)、0nullundefinedNaNfalse,其余均為“真值”(包括 '0'1[]{} 等)。

二、實戰案例:4 個高頻需求的實現

結合邏輯運算符、DOM 事件綁定、數據類型轉換等知識點,實現 4 個面試與開發中常見的需求。

案例 1:兩種方式實現注冊表單(含驗證)

需求

type="submit"type="button" 兩種按鈕,實現注冊功能,驗證賬號/密碼長度在 6-30 位之間。

方案 1:type="submit" 按鈕(依賴表單 onsubmit 事件)
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>注冊表單(submit 按鈕)</title>
</head>
<body><!-- 表單 onsubmit 事件:返回 false 阻止提交,true 允許提交 --><form action="success.html" method="get" onsubmit="return checkForm()"><p>賬號:<input type="text" id="username" name="username"></p><p>密碼:<input type="password" id="pwd" name="pwd"></p><button type="submit">注冊(submit)</button></form><script>function checkForm() {const username = document.getElementById('username').value;const pwd = document.getElementById('pwd').value;// 驗證賬號長度:用 || 判斷“小于6”或“大于30”,滿足則提示并阻止提交if (username.length < 6 || username.length > 30) {alert('賬號長度需在 6-30 位之間');return false; // 阻止表單提交}// 驗證密碼長度if (pwd.length < 6 || pwd.length > 30) {alert('密碼長度需在 6-30 位之間');return false;}// 驗證通過,允許提交return true;}</script>
</body>
</html>
方案 2:type="button" 按鈕(手動觸發表單提交)
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>注冊表單(button 按鈕)</title>
</head>
<body><form id="regForm" action="success.html" method="get"><p>賬號:<input type="text" id="username" name="username"></p><p>密碼:<input type="password" id="pwd" name="pwd"></p><button type="button" id="regBtn">注冊(button)</button></form><script>const regBtn = document.getElementById('regBtn');const regForm = document.getElementById('regForm');// 給 button 綁定點擊事件regBtn.addEventListener('click', function() {const username = document.getElementById('username').value;const pwd = document.getElementById('pwd').value;// 同樣的驗證邏輯if (username.length < 6 || username.length > 30) {alert('賬號長度需在 6-30 位之間');return; // 驗證失敗,不執行后續代碼}if (pwd.length < 6 || pwd.length > 30) {alert('密碼長度需在 6-30 位之間');return;}// 驗證通過,手動提交表單regForm.submit();});</script>
</body>
</html>

案例 2:兩種事件綁定實現交互功能

需求

addEventListeneronclick 兩種綁定方式,實現:

  1. 點擊按鈕顯示/隱藏圖片;
  2. 點擊按鈕顯示文本框內容;
  3. 移動鼠標顯示坐標。
實現代碼
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>事件綁定實戰</title><style>#img1 { display: none; } /* 初始隱藏圖片 */#coordTip { position: absolute; } /* 坐標提示框跟隨鼠標 */</style>
</head>
<body><!-- 功能按鈕與元素 --><button id="showImgBtn">顯示/隱藏圖片</button><button id="showInputBtn">顯示文本框內容</button><input type="text" id="infoInput" value="給 UP 主三連~"><img id="img1" src="test.jpg" width="300" alt="測試圖片"><!-- 鼠標坐標顯示區 --><div id="coordTip"></div><script>window.onload = function() {const img1 = document.getElementById('img1');const infoInput = document.getElementById('infoInput');const coordTip = document.getElementById('coordTip');// 1. addEventListener 綁定:顯示/隱藏圖片(切換 display 屬性)document.getElementById('showImgBtn').addEventListener('click', function() {img1.style.display = img1.style.display === 'block' ? 'none' : 'block';});// 2. onclick 綁定:顯示文本框內容document.getElementById('showInputBtn').onclick = function() {alert('文本框內容:' + infoInput.value);};// 3. addEventListener 綁定:移動鼠標顯示坐標document.addEventListener('mousemove', function(e) {// e.clientX/Y:鼠標相對于瀏覽器窗口的坐標const x = e.clientX;const y = e.clientY;// 讓提示框跟隨鼠標(偏移 30px 避免遮擋)coordTip.innerHTML = `鼠標坐標:X=${x}, Y=${y}`;coordTip.style.left = x + 30 + 'px';coordTip.style.top = y + 'px';});};</script>
</body>
</html>

案例 3:包裝 String 并修改 toString 方法

需求
  1. 定義一個字符串值類型變量;
  2. 包裝成引用類型(new String());
  3. 修改其 toString 方法,使其返回字符串長度。
老師方案(核心:區分值類型與引用類型)
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>修改 String 的 toString 方法</title><script>// 1. 值類型字符串(無法修改 toString 方法)var str = 'testing';// 嘗試修改值類型的 toString:無效,因為值類型不可變str.toString = function() {return this.length;};alert(str); // 輸出 'testing'(修改失敗)// 2. 包裝成引用類型(new String())var strObj = new String(str);// 修改引用類型的 toString 方法:有效strObj.toString = function() {return this.length; // this 指向 strObj,length 是字符串長度};alert(strObj); // 輸出 7('testing' 長度為 7,修改成功)</script>
</head>
<body></body>
</html>
我的方案(簡化:直接獲取長度并返回)
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>我的 String 包裝方案</title>
</head>
<script>// 1. 值類型字符串var str = '詩書畫唱';// 2. 包裝成引用類型var strObj = new String(str);// 3. 修改 toString:直接返回長度(this.length 即 strObj.length)strObj.toString = function() {return this.length;};// 調用 toString 并打印:'詩書畫唱' 長度為 4console.log(strObj.toString()); // 輸出 4
</script>
<body></body>
</html>
關鍵區別
  • 值類型(var str = 'abc':無法修改 toString 等原型方法,因為值類型不可變;
  • 引用類型(var strObj = new String('abc'):是對象,可自定義方法,修改 toString 后,alert 或打印時會自動調用該方法。

案例 4:用邏輯運算符實現“選值邏輯”

需求

創建兩個文本輸入框,用邏輯或(||)實現:

  • 若輸入框 1 有內容,使用輸入框 1 的值;
  • 若輸入框 1 為空,使用輸入框 2 的值。
實現代碼(含個人思路注釋)
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>邏輯運算符選值</title><script>window.onload = function() {const input1 = document.getElementById('input1');const input2 = document.getElementById('input2');const resultBtn = document.getElementById('resultBtn');// 點擊按鈕,執行選值邏輯resultBtn.addEventListener('click', function() {// 核心邏輯:input1.value || input2.value// 個人翻譯:input1 有值嗎?有就用 input1,沒有就用 input2const finalVal = input1.value || input2.value;// 打印結果(若兩個都為空,finalVal 為空字符串)console.log('最終使用的值:', finalVal);alert('最終使用的值:' + finalVal);});};</script>
</head>
<body><input type="text" id="input1" placeholder="輸入框1(優先使用)"><input type="text" id="input2" placeholder="輸入框2(備用)"><button id="resultBtn">獲取最終值</button>
</body>
</html>
邏輯驗證
輸入框 1 內容輸入框 2 內容最終結果原因
‘abc’‘def’‘abc’input1 為真,選 input1
‘’‘def’‘def’input1 為假,選 input2
‘’‘’‘’兩個都為假,選 input2(空字符串)

三、個人學習心得與補充知識點

1. 高效學習建議

  • “翻譯”知識點:把復雜概念換成自己的話(比如“邏輯或”翻譯成“選第一個有用的”),比死記規則更易理解;
  • 優先手動敲代碼:JS 語法不復雜,像邏輯運算符、DOM 選擇器這類高頻內容,敲多了自然能記住,比復制粘貼高效;
  • 記錄“演示過程”:比如錄制視頻演示表單驗證的編寫步驟,復盤時能發現“哪里漏了驗證條件”,進步更快。

2. 易混淆知識點補充

  • 三元運算符 vs 邏輯運算符:三元運算符(a ? b : c)適合“二選一”的條件賦值,邏輯運算符適合“短路選值”(如 a || b);
  • == vs ===== 會自動類型轉換(如 0 == '' 為 true),=== 嚴格比較(不轉換類型,0 === '' 為 false),開發中優先用 ===
  • 元素選擇器優先級:一次能找到元素用 getElementById(如 document.getElementById('btn')),多級查找用 querySelector(如 document.querySelector('.box #btn'))。

3. 面試小貼士

  • 遇到有歧義的題目,不用慌:只要邏輯正確,說明自己的理解即可(比如“三元運算符也叫三目運算符”,兩種說法都對);
  • 默寫代碼時,優先寫核心邏輯:比如表單驗證,先寫“長度判斷 + 阻止提交”,再補細節(如獲取元素、提示框)。

這些案例和知識點覆蓋了 JS 基礎的核心場景,建議結合代碼反復練習,尤其是邏輯運算符的“短路特性”和 DOM 事件綁定,能幫你在開發中寫出更簡潔、高效的代碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918873.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918873.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918873.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android RxJava 過濾與條件操作詳解

RxJava 是一個基于觀察者模式的響應式編程庫&#xff0c;在 Android 開發中被廣泛使用。其中&#xff0c;過濾和條件操作是 RxJava 中非常重要的一部分&#xff0c;它們允許我們對數據流進行精細控制。本文將詳細介紹 RxJava 中常用的過濾與條件操作符及其使用場景。一、過濾操…

云手機都具有哪些特點?

云手機擁有著便捷的遠程操作功能&#xff0c;讓用戶無論身處何地&#xff0c;只要能連接網絡&#xff0c;就能通過手機、電腦等終端設備遠程操控云手機&#xff0c;無需受限于物理位置&#xff0c;大大提升了工作的靈活性與便捷性。云手機主要是依賴于云計算技術&#xff0c;能…

Sparse-ICP—(4) 加權稀疏迭代最近點算法(matlab版)

目錄 一、算法原理 1、原理概述 2、參考文獻 二、代碼實現 三、結果展示 一、算法原理 1、原理概述 見:Sparse-ICP—(1)稀疏迭代最近點算法 2、參考文獻 二、代碼實現 SparseWeightedDistance.m function [move_points,T] =

統信UOS安裝NFS共享文件夾

在 UOS ARM 架構系統上安裝和配置 NFS 服務&#xff0c;實現與局域網中其他服務器共享文件夾的步驟如下&#xff1a;1. 安裝 NFS 服務首先更新系統并安裝 NFS 服務器組件&#xff1a;bash# 更新軟件包列表 sudo apt update# 安裝NFS服務器 sudo apt install nfs-kernel-server …

【完整源碼+數據集+部署教程】孔洞檢測系統源碼和數據集:改進yolo11-RetBlock

背景意義 研究背景與意義 隨著工業自動化和智能制造的快速發展&#xff0c;孔洞檢測作為關鍵的質量控制環節&#xff0c;受到了廣泛關注。孔洞的存在可能會影響產品的強度、密封性和整體性能&#xff0c;因此&#xff0c;準確、快速地檢測孔洞對于保障產品質量至關重要。傳統的…

k8s環境使用Operator部署Seaweedfs集群(一)

#作者&#xff1a;閆乾苓 文章目錄4.1 前置條件4.2 部署seaweedfs-operator4.3 準備operator鏡像SeaweedFS Operator是一個Kubernetes Operator&#xff0c;用于自動化部署和管理SeaweedFS集群 README.md:6-8 。部署分為兩個階段&#xff1a;首先部署Operator本身&#xff0c;然…

實踐基地落地:成都影像產業園與重慶五一職院強實訓

近日&#xff0c;成都國際影像產業園與重慶五一職業技術學院合作的實踐基地正式落地&#xff0c;這一舉措為雙方強化實訓合作、培養高素質技能人才注入了新的活力。實踐基地的落地&#xff0c;是雙方基于各自優勢資源的深度融合。成都國際影像產業園作為影像行業的重要聚集地&a…

算法----滑動窗口

滑動窗口 什么是滑動窗口 滑動窗口是一種常用的技術&#xff0c;主要用于處理連續數據序列&#xff08;如數組、字符串或時間序列數據&#xff09;&#xff0c;通過動態調整一個固定大小的“窗口”來高效地解決問題。窗口在序列上“滑動”&#xff0c;每次移動一個位置&#xf…

Rust學習筆記(三)|所有權機制 Ownership

本篇文章包含的內容1 重新從堆和棧開始考慮2 所有權規則3 變量和數據&#xff08;值&#xff09;的交互方式3.1 移動 Move3.2 克隆 Clone3.3 復制 Copy4 函數與所有權4.1 參數傳遞時的所有權轉移4.2 函數返回時的所有權轉移5 引用和借用6 切片前面兩篇僅僅介紹了一些Rust的語法…

Redis 知識點與應用場景

1. Redis 簡介與核心特性Redis&#xff08;Remote Dictionary Server&#xff09;是一款開源的內存數據存儲系統&#xff0c;支持多種數據結構&#xff0c;兼具高性能、持久化、分布式等特性&#xff0c;廣泛用于緩存、數據庫、消息中間件等場景。其核心特性包括&#xff1a;高…

日常反思總結

1.group by和order by的區別

易貝 (eBay (eBay) 關鍵字搜索 API 實戰:從認證到商品列表獲取全流程解析

在跨境電商開發領域&#xff0c;eBay 作為全球最大的在線交易平臺之一&#xff0c;其開放 API 為開發者提供了豐富的商品數據獲取能力。本文將聚焦 eBay 關鍵字搜索商品列表接口的實現&#xff0c;涵蓋 OAuth2.0 認證、高級搜索參數配置、分頁策略及完整代碼實現&#xff0c;幫…

敏捷數據開發實踐:基于 Amazon Q Developer + Remote MCP 構建本地與云端 Amazon Redshift 交互體系

敏捷數據開發實踐&#xff1a;基于 Amazon Q Developer Remote MCP 構建本地與云端 Amazon Redshift 交互體系 新用戶可獲得高達 200 美元的服務抵扣金 亞馬遜云科技新用戶可以免費使用亞馬遜云科技免費套餐&#xff08;Amazon Free Tier&#xff09;。注冊即可獲得 100 美元的…

【SpringBoot】11 概念理解 - 深入理解 Java 和 Spring 中的容器、組件、類、對象與 Bean

文章目錄引言1. 基本概念解析1.1 類&#xff08;Class&#xff09;1.2 對象&#xff08;Object&#xff09;1.3 組件&#xff08;Component&#xff09;1.4 Bean 實例&#xff08;Bean Instance&#xff09;1.5 容器&#xff08;Container&#xff09;2. 運行時 vs. 非運行時的…

【學習嵌入式day-25-線程】

exec函數族exec函數族利用進程空間執行另一份代碼#include "../head.h"int main(void) {char *parg[5] {"./hello","how","are","you",NULL,};printf("execl-up\n");//execl("./hello", "./hello…

Rust 中 Box 的深度解析:作用、原理與最佳實踐

Rust 中 Box 的深度解析&#xff1a;作用、原理與最佳實踐 Box 是 Rust 中最基礎且最重要的智能指針類型&#xff0c;它在 Rust 的內存管理和所有權系統中扮演著核心角色。以下是關于 Box 的全面解析&#xff1a; Box 的核心作用 #mermaid-svg-m6liFZlmqOHRfIZB {font-family:&…

【測試用例】

需求背景部分金融/政企等行業客戶&#xff0c;企業內部安全要求較高&#xff0c;且因為某些原因未接入 sso 登錄&#xff0c;會要求 MG 提供較為復雜的密碼規則甚至提供強更機制&#xff1b;且每個客戶的安全要求不一樣目前 MG 線上密碼規則&#xff1a; 8 位以上&#xff0c;包…

Klipper-probe模塊

配置信息[probe] pin: !PD4 x_offset: 0 y_offset: 0 z_offset: -0.20 #the distance between nozzle and level switch speed: 10 samples: 2 #probe one point three times get an average samples_result: average sample_retract_dist: 5 samples_tolerance: 0.05 # …

Excel多級數據結構導入導出工具

Excel多級數據結構導入導出工具 這是一個功能強大的Excel導入導出工具庫&#xff0c;專門用于處理復雜的多級嵌套數據結構。通過自定義注解配置&#xff0c;可以輕松實現Java對象與Excel文件之間的雙向轉換。 核心功能特性 1. 多級數據結構支持 嵌套對象處理: 支持任意層級的對…

基于UniApp的新大陸物聯網平臺溫濕度檢測系統開發方案

新大陸物聯網平臺對接要點 認證方式&#xff1a; 使用AccessToken進行API認證 Token存儲在本地緩存中 數據格式&#xff1a; 溫度數據單位&#xff1a;攝氏度(C) 濕度數據單位&#xff1a;百分比(%) 時間格式&#xff1a;ISO 8601或時間戳 設備狀態&#xff1a; online:…