」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 喬治和羅伯特走進一家酒吧…

喬治和羅伯特走進一家酒吧…

發佈於2024-08-01
瀏覽:700

George and Robert walk into a bar...

标题听起来可能只是一个笑话在等着你(我知道,这是一场 SEO 灾难)。抱歉让您失望了。这篇文章实际上是关于 ES2021 中引入的 JavaScript 逻辑赋值运算符。请继续阅读,了解乔治和罗伯特与此有何关系……

历史背景

逻辑赋值运算符本质上是布尔逻辑和赋值运算的混合。但这些组件的作用比人们最初想象的要多。

一方面,许多(如果不是大多数)开发人员可能没有意识到布尔逻辑与现代计算结构的交织程度有多深。它从计算机电路延伸到代码中的条件语句。

我们每天也使用等号,但常常没有经过太多思考。这个符号现在在数学和编码中都至关重要,它是在 16 世纪为数学目的而发明的。大约 400 年后,即 20 世纪 50 年代,它进入了计算机编程领域。

如果您对这个历史背景没有一点兴趣,请随意跳到“理解逻辑赋值运算符”部分。否则,请和我一起来一次短暂的时光之旅。

乔治·布尔

最早的逻辑研究归功于古希腊人,特别是亚里士多德,他通常被称为“逻辑之父”。他开发了一种形式化的逻辑系统,为逻辑运算符的使用奠定了基础。

我们今天所知的逻辑运算符的真正数学基础随着 19 世纪符号逻辑的出现而开始形成。它使用符号来表示逻辑形式和结构,从而允许更复杂和抽象的推理。

乔治·布尔,一位 19 世纪的英国数学家和逻辑学家,在他的开创性著作《思维法则》(1854 年)中,引入了逻辑的代数方法。这里的值可以是 true 或 false,并且可以对这些值执行操作,类似于代数运算。该系统包括基本的逻辑运算符:

  • AND(连词)
  • OR(析取)
  • NOT(否定)

在布尔工作的基础上,其他数学家和逻辑学家扩展了符号逻辑的范围和深度。 20 世纪中叶,它在新兴的计算机科学领域找到了一片新的沃土。事实证明,布尔逻辑的二进制性质非常适合计算机核心的数字电路,其中数据可以表示为一系列 0 和 1,并且逻辑运算符可以控制该数据的流动。

逻辑运算符成为编程语言的基本组成部分,允许在软件中构建复杂的计算逻辑和决策过程。如今,它们已成为几乎所有编程语言语法中不可或缺的一部分。

罗伯特·雷科德

等号是由威尔士数学家 Robert Recorde 于 1557 年在他的著作《维特的磨刀石》中引入的。雷科德厌倦了在作品中反复书写“等于”,因此他选择了两条等长的平行线作为平等的符号。正如他所说,这是因为“noe 2 thynges can be moare equalle”。这是数学符号的重大发展,提供了一种简洁明了的方式来表达相等性。

在编程的早期,特别是使用机器代码和汇编语言,“赋值”的概念更多的是关于在寄存器和内存位置之间存储和移动数据。使用特定的操作码给出指令,指示机器执行这些操作。

随着高级编程语言的发展,需要一种更抽象和人类可读的方式来表示为变量赋值的操作。这导致许多语言采用等号作为赋值运算符,从 20 世纪 50 年代的 FORTRAN 开始。

使用 = 进行赋值造成了相等的数学含义的一些歧义。这导致引入不同的符号来阐明编程意图:

  • Algol 于 20 世纪 60 年代开发,引入了 := 赋值符号,以区别于相等比较。
  • C 后来普及了使用 = 进行赋值和使用 == 进行相等性测试,这是许多后续语言都遵循的约定。

随着时间的推移,编程语言引入了各种形式的赋值运算符来有效地处理不同的操作,例如复合赋值运算符(=、-=等)以及最近在 JavaScript 中的逻辑赋值运算符。

了解逻辑赋值运算符

逻辑赋值运算符是 JavaScript 中的语法糖,它将赋值 (=) 与逻辑(&&、||)或空合并 (??) 运算符结合起来。共有三种:

  • 逻辑与赋值(&&=):仅当左侧变量为真时,才将右侧的值赋给左侧的变量。
  • 逻辑或赋值(||=):仅当左侧变量为假时,才将右侧的值赋给左侧的变量。
  • 空合并赋值(??=):仅当左侧变量为 null 或未定义时,才将右侧的值分配给左侧的变量。

逻辑与赋值 (&&=)

&&= 运算符是仅当变量当前包含真值时设置变量值的快捷方式。它在只有在特定条件成立时才应继续执行操作的情况下特别有用。

示例用例:功能切换

想象一个场景,其中某些功能只能为管理员启用:

const isAdmin = user.isAdmin();
let canAccessDashboard = isAdmin;

canAccessDashboard &&= user.isAuthenticated();
console.log(canAccessDashboard); // true if user is authenticated, otherwise false

此代码片段确保仅当 isAdmin 和 user.isAuthenticated() 都为 true 时,canAccessDashboard 才为 true,从而有效地保护两个条件背后的功能。

逻辑或赋值 (||=)

||= 运算符允许您在变量当前持有假值(例如 null、undefined、0、false、“”)时为该变量赋值。这对于设置默认值非常有用。

示例用例:设置默认值

const userSettings = {
  theme: null,
};

// Set default theme if none is specified
userSettings.theme ||= "dark";
console.log(userSettings.theme); // Outputs 'dark'

此运算符非常适合初始化尚未设置的变量,确保您的应用程序使用合理的默认值,而不会覆盖 0 或 false 等潜在有意义的虚假值。

空合并赋值 (??=)

这 ??运算符,称为空合并运算符,是编程语言中相对较新的新增内容。从严格意义上讲,它不是逻辑赋值运算符,尽管 ES2021 规范将其分类为逻辑赋值运算符,因为它不是基于逻辑运算符。相反,它的开发与编程的实际需求更加紧密地联系在一起,特别是在以干净且可预测的方式处理 null 和未定义值方面。

当且仅当变量当前为 null 或未定义时,??= 运算符用于为变量赋值。这比 ||= 运算符更精确,后者还考虑其他虚假值。

示例用例:配置默认值

const config = {
  timeout: 0,
};

config.timeout ??= 5000; // Set default timeout if not specified, i.e. undefined, or null
console.log(config.timeout); // Outputs 0, preserving the explicitly set falsy value

此运算符在默认值应仅填充缺失值而不替换其他虚假但有效的设置(如 0)的配置和设置中特别有用。

实际好处和注意事项

使用逻辑赋值运算符而不是 if 或三元语句,可以减少需要编写的代码量,并且可以让其他开发人员更清楚地了解您的意图。与许多功能一样,关键是明智地使用这些运算符,尤其是在处理在代码上下文中有效的虚假值时。

附加说明

JavaScript 中有更多的赋值运算符,例如左移赋值运算符 (

(封面图片位于 Freepik 上的 starline 上方)

版本聲明 本文轉載於:https://dev.to/codejet/george-and-robert-walk-into-a-bar-413e?1如有侵犯,請洽[email protected]刪除
最新教學 更多>
  • 如何從PHP中的數組中提取隨機元素?
    如何從PHP中的數組中提取隨機元素?
    從陣列中的隨機選擇,可以輕鬆從數組中獲取隨機項目。考慮以下數組:; 從此數組中檢索一個隨機項目,利用array_rand( array_rand()函數從數組返回一個隨機鍵。通過將$項目數組索引使用此鍵,我們可以從數組中訪問一個隨機元素。這種方法為選擇隨機項目提供了一種直接且可靠的方法。
    程式設計 發佈於2025-04-01
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    在使用GO MOD時,在GO MOD 中克服模塊路徑差異時,可能會遇到衝突,其中可能會遇到一個衝突,其中3派對軟件包將另一個帶有導入套件的path package the Imptioned package the Imptioned package the Imported tocted pac...
    程式設計 發佈於2025-04-01
  • \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    答案: 在大多數現代編譯器中,while(1)和(1)和(;;)之間沒有性能差異。編譯器: perl: 1 輸入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    程式設計 發佈於2025-04-01
  • 如何在其容器中為DIV創建平滑的左右CSS動畫?
    如何在其容器中為DIV創建平滑的左右CSS動畫?
    通用CSS動畫,用於左右運動 ,我們將探索創建一個通用的CSS動畫,以向左和右移動DIV,從而到達其容器的邊緣。該動畫可以應用於具有絕對定位的任何div,無論其未知長度如何。 問題:使用左直接導致瞬時消失 更加流暢的解決方案:混合轉換和左 [並實現平穩的,線性的運動,我們介紹了線性的轉換。...
    程式設計 發佈於2025-04-01
  • 如何在GO編譯器中自定義編譯優化?
    如何在GO編譯器中自定義編譯優化?
    在GO編譯器中自定義編譯優化 GO中的默認編譯過程遵循特定的優化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    程式設計 發佈於2025-04-01
  • 如何在Java中執行命令提示命令,包括目錄更改,包括目錄更改?
    如何在Java中執行命令提示命令,包括目錄更改,包括目錄更改?
    在java 通過Java通過Java運行命令命令可能很具有挑戰性。儘管您可能會找到打開命令提示符的代碼段,但他們通常缺乏更改目錄並執行其他命令的能力。 solution:使用Java使用Java,使用processBuilder。這種方法允許您:啟動一個過程,然後將其標準錯誤重定向到其標準輸出...
    程式設計 發佈於2025-04-01
  • 如何同步迭代並從PHP中的兩個等級陣列打印值?
    如何同步迭代並從PHP中的兩個等級陣列打印值?
    同步的迭代和打印值來自相同大小的兩個數組使用兩個數組相等大小的selectbox時,一個包含country代碼的數組,另一個包含鄉村代碼,另一個包含其相應名稱的數組,可能會因不當提供了exply for for for the uncore for the forsion for for ytry...
    程式設計 發佈於2025-04-01
  • 哪種在JavaScript中聲明多個變量的方法更可維護?
    哪種在JavaScript中聲明多個變量的方法更可維護?
    在JavaScript中聲明多個變量:探索兩個方法在JavaScript中,開發人員經常遇到需要聲明多個變量的需要。對此的兩種常見方法是:在單獨的行上聲明每個變量: 當涉及性能時,這兩種方法本質上都是等效的。但是,可維護性可能會有所不同。 第一個方法被認為更易於維護。每個聲明都是其自己的語句,使...
    程式設計 發佈於2025-04-01
  • 為什麼使用固定定位時,為什麼具有100%網格板柱的網格超越身體?
    為什麼使用固定定位時,為什麼具有100%網格板柱的網格超越身體?
    網格超過身體,用100%grid-template-columns 為什麼在grid-template-colms中具有100%的顯示器,當位置設置為設置的位置時,grid-template-colly修復了? 問題: 考慮以下CSS和html: class =“ snippet-code”> ...
    程式設計 發佈於2025-04-01
  • 如何配置Pytesseract以使用數字輸出的單位數字識別?
    如何配置Pytesseract以使用數字輸出的單位數字識別?
    Pytesseract OCR具有單位數字識別和僅數字約束 在pytesseract的上下文中,在配置tesseract以識別單位數字和限制單個數字和限制輸出對數字可能會提出質疑。 To address this issue, we delve into the specifics of Te...
    程式設計 發佈於2025-04-01
  • 如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    使用http request 上傳文件上傳到http server,同時也提交其他參數,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    程式設計 發佈於2025-04-01
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-04-01
  • 如何檢查對像是否具有Python中的特定屬性?
    如何檢查對像是否具有Python中的特定屬性?
    方法來確定對象屬性存在尋求一種方法來驗證對像中特定屬性的存在。考慮以下示例,其中嘗試訪問不確定屬性會引起錯誤: >>> a = someClass() >>> A.property Trackback(最近的最新電話): 文件“ ”,第1行, attributeError:SomeClass實...
    程式設計 發佈於2025-04-01
  • 如何從Google API中檢索最新的jQuery庫?
    如何從Google API中檢索最新的jQuery庫?
    從Google APIS 問題中提供的jQuery URL是版本1.2.6。對於檢索最新版本,以前有一種使用特定版本編號的替代方法,它是使用以下語法:獲取最新版本:未壓縮)While these legacy URLs still remain in use, it is recommended ...
    程式設計 發佈於2025-04-01
  • 如何在JavaScript對像中動態設置鍵?
    如何在JavaScript對像中動態設置鍵?
    在嘗試為JavaScript對象創建動態鍵時,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正確的方法採用方括號: jsobj ['key''i] ='example'1; 在JavaScript中,數組是一...
    程式設計 發佈於2025-04-01

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3