”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 解锁 JavaScript:逻辑 OR (||) 与空合并运算符 (??)

解锁 JavaScript:逻辑 OR (||) 与空合并运算符 (??)

发布于2024-07-30
浏览:570

Unlocking JavaScript: Logical OR (||) vs Nullish Coalescing Operator (??)

介绍

JavaScript作为最流行的编程语言之一,为开发人员提供了一系列运算符来处理各种逻辑运算。其中,逻辑或 (||) 和空值合并 (??) 运算符是管理默认值和处理空值的基本工具。本文将深入探讨这两个运算符之间的差异、它们的用例,以及实际、复杂的示例来说明它们的用法。

了解逻辑 OR (||) 运算符

JavaScript 中的逻辑 OR (||) 运算符广泛用于返回其操作数中的第一个真值,如果没有一个真值,则返回最后一个值。主要用于设置默认值。

句法

result = operand1 || operand2;

怎么运行的

||运算符从左到右计算,如果第一个操作数为真则返回;否则,它计算并返回第二个操作数。

示例 1:设置默认值

let userInput = '';
let defaultText = 'Hello, World!';

let message = userInput || defaultText;
console.log(message); // Output: 'Hello, World!'

在此示例中,userInput 是一个空字符串(假),因此返回 defaultText。

示例 2:处理多个值

let firstName = null;
let lastName = 'Doe';

let name = firstName || lastName || 'Anonymous';
console.log(name); // Output: 'Doe'

这里,firstName为null(假),因此lastName被返回,因为它是true。

逻辑 OR (||) 运算符的限制

|| 的主要限制运算符的一个缺点是它将多个值视为假值,例如 0、NaN、''、false、null 和 undefined。当这些值应该有效时,这可能会导致意外结果。

引入空值合并 (??) 运算符

Nullish Coalescing (??) 运算符是 JavaScript 的最新补充,在 ES2020 中引入。它旨在处理 null 或 undefined 明确意味着唯一考虑的空值的情况。

句法

result = operand1 ?? operand2;

怎么运行的

这 ??当左侧操作数为 null 或未定义时,运算符返回右侧操作数。否则,它返回左侧操作数。

示例 1:设置默认值

let userInput = '';
let defaultText = 'Hello, World!';

let message = userInput ?? defaultText;
console.log(message); // Output: ''

在本例中,userInput 是一个空字符串,不为 null 或未定义,因此返回。

示例 2:处理空值

let firstName = null;
let lastName = 'Doe';

let name = firstName ?? lastName ?? 'Anonymous';
console.log(name); // Output: 'Doe'

这里,firstName为null,因此lastName被返回,因为它既不是null也不是未定义的。

比较逻辑 OR (||) 和空合并 (??) 运算符

示例 1:比较虚假值

let value1 = 0;
let value2 = '';

let resultOR = value1 || 'default';
let resultNullish = value1 ?? 'default';

console.log(resultOR); // Output: 'default'
console.log(resultNullish); // Output: 0

在此示例中,|| 认为 0 为假。运算符,但它是 ?? 的有效值操作员。

示例 2:同时使用两个运算符

let userInput = null;
let fallbackText = 'Default Text';

let message = (userInput ?? fallbackText) || 'Fallback Message';
console.log(message); // Output: 'Default Text'

这里,userInput为空,所以fallbackText被??使用操作员。然后通过 || 检查结果运算符,但由于 FallbackText 为真,因此返回它。

逻辑 OR (||) 和空合并 (??) 运算符的复杂示例

示例 3:对象的嵌套操作

考虑一个场景,您需要为嵌套对象属性设置默认值。

let userSettings = {
  theme: {
    color: '',
    font: null
  }
};

let defaultSettings = {
  theme: {
    color: 'blue',
    font: 'Arial'
  }
};

let themeColor = userSettings.theme.color || defaultSettings.theme.color;
let themeFont = userSettings.theme.font ?? defaultSettings.theme.font;

console.log(themeColor); // Output: 'blue'
console.log(themeFont); // Output: 'Arial'

在这个例子中,userSettings.theme.color是一个空字符串,所以使用defaultSettings.theme.color。 userSettings.theme.font 为 null,因此使用 defaultSettings.theme.font。

示例 4:具有默认值的函数参数

处理函数参数时,您可能需要为缺少的参数提供默认值。

function greet(name, greeting) {
  name = name ?? 'Guest';
  greeting = greeting || 'Hello';

  console.log(`${greeting}, ${name}!`);
}

greet(); // Output: 'Hello, Guest!'
greet('Alice'); // Output: 'Hello, Alice!'
greet('Bob', 'Hi'); // Output: 'Hi, Bob!'
greet(null, 'Hey'); // Output: 'Hey, Guest!'

在此示例中,名称参数使用 ??如果 name 为 null 或未定义,则使用运算符设置默认值“Guest”。问候语参数使用 ||如果问候语是除 null 或未定义之外的任何虚假值,则运算符设置默认值“Hello”。

示例 5:与可选链结合

可选链接 (?.) 可以与 || 组合和 ??安全地处理深度嵌套的对象属性。

let user = {
  profile: {
    name: 'John Doe'
  }
};

let userName = user?.profile?.name || 'Anonymous';
let userEmail = user?.contact?.email ?? 'No Email Provided';

console.log(userName); // Output: 'John Doe'
console.log(userEmail); // Output: 'No Email Provided'

在此示例中,可选链接可确保如果属性路径的任何部分不存在,则返回未定义,从而防止错误。 ||和 ??然后运算符提供适当的默认值。

最佳实践和用例

  1. 使用||对于广泛违约:

    • 当您需要为一系列虚假条件(例如,空字符串、0、NaN)提供默认值时。
  2. 使用 ??精确的空值检查:

    • 当您特别想要处理 null 或 undefined 而不影响其他虚假值时。
  3. 两者结合:

    • 使用 || 的组合和 ??对于需要明确处理真值/假值和空值的复杂场景。

常见问题解答

逻辑或 (||) 运算符的作用是什么?
逻辑 OR (||) 运算符返回其操作数中的第一个真值,如果没有真值,则返回最后一个操作数。

什么时候应该使用 Nullish Coalescing (??) 运算符?
当您需要专门处理 null 或未定义而不将其他虚假值(如 0 或空字符串)视为 null 时,请使用 Nullish Coalescing (??) 运算符。

我可以同时使用两个运算符吗?
是的,您可以同时使用 ||和 ??一起处理不同类型的值并确保您的代码逻辑有效地涵盖各种情况。

怎么办||处理空字符串?
||运算符将空字符串视为假,因此如果第一个操作数是空字符串,它将返回下一个操作数。

所有浏览器都支持 Nullish Coalescing (??) 运算符吗?
这 ??支持 ES2020 的现代浏览器和环境支持运算符。对于较旧的环境,您可能需要使用像 Babel 这样的转译器。

|| 之间有什么区别和 ??运算符?
主要区别在于||将多个值视为假值(例如 0、''、false),而 ??仅将 null 和 undefined 视为空值。

结论

理解 JavaScript 中逻辑 OR (||) 和空合并 (??) 运算符之间的差异对于编写健壮且无错误的代码至关重要。 ||运算符非常适合广泛的默认场景,而 ??非常适合精确处理空值。通过适当地使用这些运算符,您可以确保您的代码有效地处理各种数据状态,从而提供无缝的用户体验。

版本声明 本文转载于:https://dev.to/itsshaikhaj/unlocking-javascript-logical-or-vs-nullish-coalescing-operator--21hb?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用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-07-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-07-12
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,可以更快地搜索这些前缀。了解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-07-12
  • 您如何在Laravel Blade模板中定义变量?
    您如何在Laravel Blade模板中定义变量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配变量对于存储以后使用的数据至关重要。在使用“ {{}}”分配变量的同时,它可能并不总是最优雅的解决方案。幸运的是,Blade通过@php Directive提供了更优雅的方法: $ old_section =“...
    编程 发布于2025-07-12
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-07-12
  • PHP SimpleXML解析带命名空间冒号的XML方法
    PHP SimpleXML解析带命名空间冒号的XML方法
    在php 很少,请使用该限制很大,很少有很高。例如:这种技术可确保可以通过遍历XML树和使用儿童()方法()方法的XML树和切换名称空间来访问名称空间内的元素。
    编程 发布于2025-07-12
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-07-12
  • 如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    编程 发布于2025-07-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-07-12
  • 图片在Chrome中为何仍有边框?`border: none;`无效解决方案
    图片在Chrome中为何仍有边框?`border: none;`无效解决方案
    在chrome 中删除一个频繁的问题时,在与Chrome and IE9中的图像一起工作时,遇到了一个频繁的问题。和“边境:无;”在CSS中。要解决此问题,请考虑以下方法: Chrome具有忽略“ border:none; none;”的已知错误,风格。要解决此问题,请使用以下CSS ID块创建带...
    编程 发布于2025-07-12
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-07-12
  • 同实例无需转储复制MySQL数据库方法
    同实例无需转储复制MySQL数据库方法
    在同一实例上复制一个MySQL数据库而无需转储在同一mySQL实例上复制数据库,而无需创建InterMediate sqql script。以下方法为传统的转储和IMPORT过程提供了更简单的替代方法。 直接管道数据 MySQL手动概述了一种允许将mysqldump直接输出到MySQL clie...
    编程 发布于2025-07-12
  • Python环境变量的访问与管理方法
    Python环境变量的访问与管理方法
    Accessing Environment Variables in PythonTo access environment variables in Python, utilize the os.environ object, which represents a mapping of envir...
    编程 发布于2025-07-12
  • Java中Lambda表达式为何需要“final”或“有效final”变量?
    Java中Lambda表达式为何需要“final”或“有效final”变量?
    Lambda Expressions Require "Final" or "Effectively Final" VariablesThe error message "Variable used in lambda expression shou...
    编程 发布于2025-07-12
  • 用户本地时间格式及时区偏移显示指南
    用户本地时间格式及时区偏移显示指南
    在用户的语言环境格式中显示日期/时间,并使用时间偏移在向最终用户展示日期和时间时,以其localzone and格式显示它们至关重要。这确保了不同地理位置的清晰度和无缝用户体验。以下是使用JavaScript实现此目的的方法。方法:推荐方法是处理客户端的Javascript中的日期/时间格式化和时...
    编程 发布于2025-07-12

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

Copyright© 2022 湘ICP备2022001581号-3