」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 解鎖 JavaScript:邏輯 OR (||) 與空合併運算子 (??)

解鎖 JavaScript:邏輯 OR (||) 與空合併運算子 (??)

發佈於2024-07-30
瀏覽:468

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]刪除
最新教學 更多>
  • 人臉檢測失敗原因及解決方案:Error -215
    人臉檢測失敗原因及解決方案:Error -215
    錯誤處理:解決“ error:((-215)!empty()in Function Multultiscale中的“ openCV 要解決此問題,必須確保提供給HAAR CASCADE XML文件的路徑有效。在提供的代碼片段中,級聯分類器裝有硬編碼路徑,這可能對您的系統不准確。相反,OPENCV提...
    程式設計 發佈於2025-07-03
  • 圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    在chrome 在使用Chrome and IE9中的圖像時遇到的一個頻繁的問題是圍繞圖像的持續薄薄邊框,儘管指定了圖像,儘管指定了;和“邊境:無;”在CSS中。要解決此問題,請考慮以下方法: Chrome具有忽略“ border:none; none;”的已知錯誤,風格。要解決此問題,請使用以下...
    程式設計 發佈於2025-07-03
  • 為什麼PYTZ最初顯示出意外的時區偏移?
    為什麼PYTZ最初顯示出意外的時區偏移?
    與pytz 最初從pytz獲得特定的偏移。例如,亞洲/hong_kong最初顯示一個七個小時37分鐘的偏移: 差異源利用本地化將時區分配給日期,使用了適當的時區名稱和偏移量。但是,直接使用DateTime構造器分配時區不允許進行正確的調整。 example pytz.timezone(&#...
    程式設計 發佈於2025-07-03
  • 為什麼我的CSS背景圖像出現?
    為什麼我的CSS背景圖像出現?
    故障排除:CSS背景圖像未出現 ,您的背景圖像儘管遵循教程說明,但您的背景圖像仍未加載。圖像和样式表位於相同的目錄中,但背景仍然是空白的白色帆布。 而不是不棄用的,您已經使用了CSS樣式: bockent {背景:封閉圖像文件名:背景圖:url(nickcage.jpg); 如果您的html,cs...
    程式設計 發佈於2025-07-03
  • 在Pandas中如何將年份和季度列合併為一個週期列?
    在Pandas中如何將年份和季度列合併為一個週期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 這個目標是通過組合“年度”和“季度”列來創建一個新列,以獲取以下結果: [python中的concate...
    程式設計 發佈於2025-07-03
  • 我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    將我的加密庫從mcrypt升級到openssl 問題:是否可以將我的加密庫從McRypt升級到OpenSSL?如果是這樣,如何? 答案:是的,可以將您的Encryption庫從McRypt升級到OpenSSL。 可以使用openssl。 附加說明: [openssl_decrypt()函數要求...
    程式設計 發佈於2025-07-03
  • 如何正確使用與PDO參數的查詢一樣?
    如何正確使用與PDO參數的查詢一樣?
    在pdo 中使用類似QUERIES在PDO中的Queries時,您可能會遇到類似疑問中描述的問題:此查詢也可能不會返回結果,即使$ var1和$ var2包含有效的搜索詞。錯誤在於不正確包含%符號。 通過將變量包含在$ params數組中的%符號中,您確保將%字符正確替換到查詢中。沒有此修改,PD...
    程式設計 發佈於2025-07-03
  • 如何使用PHP從XML文件中有效地檢索屬性值?
    如何使用PHP從XML文件中有效地檢索屬性值?
    從php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    程式設計 發佈於2025-07-03
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,可以更快地搜索這些前綴。 了解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-07-03
  • 用戶本地時間格式及時區偏移顯示指南
    用戶本地時間格式及時區偏移顯示指南
    在用戶的語言環境格式中顯示日期/時間,並使用時間偏移在向最終用戶展示日期和時間時,以其localzone and格式顯示它們至關重要。這確保了不同地理位置的清晰度和無縫用戶體驗。以下是使用JavaScript實現此目的的方法。 方法:推薦方法是處理客戶端的Javascript中的日期/時間格式化和...
    程式設計 發佈於2025-07-03
  • 如何在鼠標單擊時編程選擇DIV中的所有文本?
    如何在鼠標單擊時編程選擇DIV中的所有文本?
    在鼠標上選擇div文本單擊帶有文本內容,用戶如何使用單個鼠標單擊單擊div中的整個文本?這允許用戶輕鬆拖放所選的文本或直接複製它。 在單個鼠標上單擊的div元素中選擇文本,您可以使用以下Javascript函數: function selecttext(canduterid){ if(d...
    程式設計 發佈於2025-07-03
  • 如何簡化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-03
  • 如何處理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-07-03
  • 如何在Chrome中居中選擇框文本?
    如何在Chrome中居中選擇框文本?
    選擇框的文本對齊:局部chrome-inly-ly-ly-lyly solument 您可能希望將文本中心集中在選擇框中,以獲取優化的原因或提高可訪問性。但是,在CSS中的選擇元素中手動添加一個文本 - 對屬性可能無法正常工作。 初始嘗試 state)</option> < o...
    程式設計 發佈於2025-07-03
  • 如何修復\“常規錯誤: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-03

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

Copyright© 2022 湘ICP备2022001581号-3