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

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

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

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]刪除
最新教學 更多>
  • 如何從2D數組中提取元素?使用另一數組的索引
    如何從2D數組中提取元素?使用另一數組的索引
    Using NumPy Array as Indices for the 2nd Dimension of Another ArrayTo extract specific elements from a 2D array based on indices provided by a second ...
    程式設計 發佈於2025-05-11
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,將常數列添加到Spark DataFrame,該列具有適用於所有行的任意值的Spark DataFrame,可以通過多種方式實現。使用文字值(SPARK 1.3)在嘗試提供直接值時,用於此問題時,旨在為此目的的column方法可能會導致錯誤。 df.withCo...
    程式設計 發佈於2025-05-11
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    在使用GO MOD時,在GO MOD 中克服模塊路徑差異時,可能會遇到衝突,其中3個Party Package將另一個PAXPANCE帶有導入式套件之間的另一個軟件包,並在導入式套件之間導入另一個軟件包。如迴聲消息所證明的那樣: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    程式設計 發佈於2025-05-11
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。要解決此問題並確保在後續頁面訪問中執行腳本,Firefox用戶應設置一個空功能。 警報'); }; alert('inline Alert')...
    程式設計 發佈於2025-05-11
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call fil...
    程式設計 發佈於2025-05-11
  • Python中何時用"try"而非"if"檢測變量值?
    Python中何時用"try"而非"if"檢測變量值?
    使用“ try“ vs.” if”來測試python 在python中的變量值,在某些情況下,您可能需要在處理之前檢查變量是否具有值。在使用“如果”或“ try”構建體之間決定。 “ if” constructs result = function() 如果結果: 對於結果: ...
    程式設計 發佈於2025-05-11
  • 如何在JavaScript對像中動態設置鍵?
    如何在JavaScript對像中動態設置鍵?
    在嘗試為JavaScript對象創建動態鍵時,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正確的方法採用方括號: jsobj ['key''i] ='example'1; 在JavaScript中,數組是一...
    程式設計 發佈於2025-05-11
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在Java中的多個返回類型:一種誤解類型:在Java編程中揭示,在Java編程中,Peculiar方法簽名可能會出現,可能會出現,使開發人員陷入困境,使開發人員陷入困境。 getResult(string s); ,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但這確實是如此嗎...
    程式設計 發佈於2025-05-11
  • Java為何無法創建泛型數組?
    Java為何無法創建泛型數組?
    通用陣列創建錯誤 arrayList [2]; JAVA報告了“通用數組創建”錯誤。為什麼不允許這樣做? 答案:Create an Auxiliary Class:public static ArrayList<myObject>[] a = new ArrayList<my...
    程式設計 發佈於2025-05-11
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,可以更快地搜索這些前綴。 了解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-05-11
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-05-11
  • 如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    為有效的slug生成首先,該函數用指定的分隔符替換所有非字母或數字字符。此步驟可確保slug遵守URL慣例。隨後,它採用ICONV函數將文本簡化為us-ascii兼容格式,從而允許更廣泛的字符集合兼容性。 接下來,該函數使用正則表達式刪除了不需要的字符,例如特殊字符和空格。此步驟可確保slug僅包...
    程式設計 發佈於2025-05-11
  • 如何使用“ JSON”軟件包解析JSON陣列?
    如何使用“ JSON”軟件包解析JSON陣列?
    parsing JSON與JSON軟件包 QUALDALS:考慮以下go代碼:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    程式設計 發佈於2025-05-11
  • 如何使用Python有效地以相反順序讀取大型文件?
    如何使用Python有效地以相反順序讀取大型文件?
    在python 中,如果您使用一個大文件,並且需要從最後一行讀取其內容,則在第一行到第一行,Python的內置功能可能不合適。這是解決此任務的有效解決方案:反向行讀取器生成器 == ord('\ n'): 緩衝區=緩衝區[:-1] ...
    程式設計 發佈於2025-05-11
  • 如何在其容器中為DIV創建平滑的左右CSS動畫?
    如何在其容器中為DIV創建平滑的左右CSS動畫?
    通用CSS動畫,用於左右運動 ,我們將探索創建一個通用的CSS動畫,以向左和右移動DIV,從而到達其容器的邊緣。該動畫可以應用於具有絕對定位的任何div,無論其未知長度如何。 問題:使用左直接導致瞬時消失 更加流暢的解決方案:混合轉換和左 [並實現平穩的,線性的運動,我們介紹了線性的轉換。...
    程式設計 發佈於2025-05-11

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

Copyright© 2022 湘ICP备2022001581号-3