”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 乔治和罗伯特走进一家酒吧……

乔治和罗伯特走进一家酒吧……

发布于2024-08-01
浏览:253

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]删除
最新教程 更多>
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-07-05
  • JavaScript计算两个日期之间天数的方法
    JavaScript计算两个日期之间天数的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    编程 发布于2025-07-05
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法时,您可能会出现错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && &&华氏度D...
    编程 发布于2025-07-05
  • Java中如何使用观察者模式实现自定义事件?
    Java中如何使用观察者模式实现自定义事件?
    在Java 中创建自定义事件的自定义事件在许多编程场景中都是无关紧要的,使组件能够基于特定的触发器相互通信。本文旨在解决以下内容:问题语句我们如何在Java中实现自定义事件以促进基于特定事件的对象之间的交互,定义了管理订阅者的类界面。以下代码片段演示了如何使用观察者模式创建自定义事件: args)...
    编程 发布于2025-07-05
  • 如何使用Python有效地以相反顺序读取大型文件?
    如何使用Python有效地以相反顺序读取大型文件?
    在python 反向行读取器生成器 == ord('\ n'): 缓冲区=缓冲区[:-1] 剩余_size- = buf_size lines = buffer.split('\ n'....
    编程 发布于2025-07-05
  • Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    在ASP.NET async void void async void void void void void的设计无需返回asynchroncon而无需返回任务对象。他们在执行过程中增加未偿还操作的计数,并在完成后减少。在某些情况下,这种行为可能是有益的,例如未期望或明确预期操作结果的火灾和...
    编程 发布于2025-07-05
  • 如何在Java的全屏独家模式下处理用户输入?
    如何在Java的全屏独家模式下处理用户输入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    编程 发布于2025-07-05
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-07-05
  • 如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    Transform Pandas DataFrame Column to DateTime FormatScenario:Data within a Pandas DataFrame often exists in various formats, including strings.使用时间数据时...
    编程 发布于2025-07-05
  • 在Pandas中如何将年份和季度列合并为一个周期列?
    在Pandas中如何将年份和季度列合并为一个周期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 这个目标是通过组合“年度”和“季度”列来创建一个新列,以获取以下结果: [python中的concate...
    编程 发布于2025-07-05
  • 表单刷新后如何防止重复提交?
    表单刷新后如何防止重复提交?
    在Web开发中预防重复提交 在表格提交后刷新页面时,遇到重复提交的问题是常见的。要解决这个问题,请考虑以下方法: 想象一下具有这样的代码段,看起来像这样的代码段:)){ //数据库操作... 回声“操作完成”; 死(); } ?> ...
    编程 发布于2025-07-05
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-07-05
  • 解决Spring Security 4.1及以上版本CORS问题指南
    解决Spring Security 4.1及以上版本CORS问题指南
    弹簧安全性cors filter:故障排除常见问题 在将Spring Security集成到现有项目中时,您可能会遇到与CORS相关的错误,如果像“访问Control-allo-allow-Origin”之类的标头,则无法设置在响应中。为了解决此问题,您可以实现自定义过滤器,例如代码段中的MyFi...
    编程 发布于2025-07-05
  • 为什么HTML无法打印页码及解决方案
    为什么HTML无法打印页码及解决方案
    无法在html页面上打印页码? @page规则在@Media内部和外部都无济于事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: bo...
    编程 发布于2025-07-05
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-07-05

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3