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

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

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

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]删除
最新教程 更多>
  • C++20 Consteval函数中模板参数能否依赖于函数参数?
    C++20 Consteval函数中模板参数能否依赖于函数参数?
    [ consteval函数和模板参数依赖于函数参数在C 17中,模板参数不能依赖一个函数参数,因为编译器仍然需要对非contexexpr futcoriations contim at contexpr function进行评估。 compile time。 C 20引入恒定函数,必须在编译时进行...
    编程 发布于2025-05-12
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-05-12
  • 如何简化PHP中的JSON解析以获取多维阵列?
    如何简化PHP中的JSON解析以获取多维阵列?
    php 试图在PHP中解析JSON数据的JSON可能具有挑战性,尤其是在处理多维数组时。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    编程 发布于2025-05-12
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-05-12
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-05-12
  • 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-05-12
  • 哪种在JavaScript中声明多个变量的方法更可维护?
    哪种在JavaScript中声明多个变量的方法更可维护?
    在JavaScript中声明多个变量:探索两个方法在JavaScript中,开发人员经常遇到需要声明多个变量的需要。对此的两种常见方法是:在单独的行上声明每个变量: 当涉及性能时,这两种方法本质上都是等效的。但是,可维护性可能会有所不同。 第一个方法被认为更易于维护。每个声明都是其自己的语句,使其...
    编程 发布于2025-05-12
  • 如何处理PHP文件系统功能中的UTF-8文件名?
    如何处理PHP文件系统功能中的UTF-8文件名?
    在PHP的Filesystem functions中处理UTF-8 FileNames 在使用PHP的MKDIR函数中含有UTF-8字符的文件很多flusf-8字符时,您可能会在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    编程 发布于2025-05-12
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-05-12
  • 如何使用Python理解有效地创建字典?
    如何使用Python理解有效地创建字典?
    在python中,词典综合提供了一种生成新词典的简洁方法。尽管它们与列表综合相似,但存在一些显着差异。与问题所暗示的不同,您无法为钥匙创建字典理解。您必须明确指定键和值。 For example:d = {n: n**2 for n in range(5)}This creates a dicti...
    编程 发布于2025-05-12
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案:的,请访问量很大,并应为procectiquiestate的,并在整个代码上正确格式不多: java.text.simpledateformat; 导入java.util.calendar; 导入java...
    编程 发布于2025-05-12
  • 为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    class'ziparchive'在Linux Server上安装Archive_zip时找不到错误 commant in lin ins in cland ins in lin.11 on a lin.1 in a lin.11错误:致命错误:在... cass中找不到类z...
    编程 发布于2025-05-12
  • 如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    Unveiling the Mystery: Content Security Policy Directive ErrorsEncountering the enigmatic error "Refused to load the script..." when deployi...
    编程 发布于2025-05-12
  • 如何从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-05-12
  • CSS可以根据任何属性值来定位HTML元素吗?
    CSS可以根据任何属性值来定位HTML元素吗?
    靶向html元素,在CSS 中使用任何属性值,在CSS中,可以基于特定属性(如下所示)基于特定属性的基于特定属性的emants目标元素: 字体家庭:康斯拉斯(Consolas); } 但是,出现一个常见的问题:元素可以根据任何属性值而定位吗?本文探讨了此主题。的目标元素有任何任何属性值,属...
    编程 发布于2025-05-12

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

Copyright© 2022 湘ICP备2022001581号-3