本篇文章帶大家深入探討 JavaScript 邏輯賦值運算子。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
邏輯賦值是對現有數學和二進位邏輯運算子的擴充。我們先複習一下,然後看看把它們結合在一起能得到什麼。
首先,我們來看 JS 中條件運算子
與無條件運算子
之間的差異。
無條件 vs 有條件
數學運算符,例如
是無條件的。
在const x = 1 2
中,無論如何,我們總是將LHS
新增到RHS
中,並將結果分配給x
。
LHS 和 RHS 是數學領域內的概念,意為等式左邊和等式右邊的意思,在我們現在的場景下就是賦值運算子的左邊和右邊。當變數出現在賦值運算子的左邊時,就進行 LHS 查詢;反之進行 RHS 查詢。
我們甚至可以寫一些奇怪的程式碼,例如const x = false 2
。 JS 先將false
的LHS 轉換為Number
,因此得到const x = Number(false) 2
,其結果為const x = 0 2
。它將 LHS 新增至RHS,最後將其指派給x
,得出2
。
邏輯運算符,例如&&
是有條件的
在const x = true && 0 2
中,首先計算LHS,它為true
。因為 LHS 的值為true
,所以我們接下來執行 RHS 操作,它的值為2,同時也執行賦值操作,結果是2
。
與const x = false && 0 2
相比,LHS 為 false
,因此 RHS 被完全忽略。
你可能想知道為什麼要避免計算RHS? 兩個常見的原因是獲得更好的性能和避免副作用
。
二元邏輯運算子
&& || ??
在JSX 中我們經常使用&&
和||
來有條件地渲染介面。 ??
是nullish(空值)
合併運算符,它是最近剛通過提案的,很快就會普及。它們都是 二元邏輯運算子。
- 使用
&&
測試 LHS 的結果是否為真值。 - 使用
||
測試 LHS 的結果是否為虛值。 - 用
??
測試 LHS 是否無效。
虛值 vs Nullish
在 JS 中有哪些算是虛值呢?
- null
- undefined
- false
- NaN
- 0
- "" (空字串)
下面這兩個姊妹被認為是nullish 值。
- null
- undefined
值得注意的是,使用二元邏輯運算子不一定會傳回布林值
,而是傳回表達式的LHS
或RHS
值。為了明確這些表達式類型的要點,重看一下ECMAScript 文件中的這句話是有幫助的:
&&
或||
產生的值不一定是布林型的,而是兩個操作數表達式之中的一個值。
一些例子
// && / /如果 LHS 是真值,计算并返回 RHS,否则返回 LHS true && 100**2 // 10000 "Joe" && "JavaScript" // "JavaScript" false && 100**2 // false "" && 100**2 // "" NaN && 100**2 // NaN null && 100**2 // null undefined && 100**2 // undefined
邏輯賦值運算子
&&= ||= ??=
這個運算子將賦值與條件邏輯運算子結合在一起,因此命名為「邏輯賦值」。它們只是一種簡寫, 例如,x && = y
是x && (x = y)
的簡寫。
從邏輯賦值傳回的值不是更新的賦值,而是已計算表達式的值。
由於先前的ECMAScript特性,例如預設參數和nullish合併操作符,你可以說在邏輯賦值所提供的功能中肯定存在一些冗餘。雖然這種速記看起來很流暢,而且我相信當我們發現更多的用例時,它會派上用場的。
邏輯與賦值( &&= )
// 逻辑与 LHS &&= RHS // 等价于 LHS && (LHS = RHS) // 事例 // if x is truthy, assign x to y, otherwise return x // 如果 x 为真值,则将 y 赋值给 x, 否则返回 x let x = 1 const y = 100 x &&= y // x 为 100 // 与上面对应的长的写法 x && (x = y)
邏輯或賦值( ||= )
// 逻辑或 LHS ||= RHS // 等价于 LHS || (LHS = RHS) // 事例 // 如果 x 为真值,返回 x,否则将 y 赋值给 x let x = NaN const y = 100 x ||= y // x 为 100 // 与上面对应的长的写法 x || (x = y)
#邏輯nullish 賦值( ??= )
// 逻辑 nullish LHS ??= RHS // 等价于 LHS ?? (LHS = RHS) // 事例 // if x.z is nullish, assign x.z to y let x = {} let y = 100; x.z ??= y // x 为 { z: 100 } // 与上面对应的长的写法 x.z ?? (x.z = y)
實作中邏輯賦值的範例
React中的JSX
#let loading = true const spinner = <Spinner /> loading &&= spinner
DOM
el.innerHTML ||= 'some default'
物件
// 如果对象没有 onLoad 方法,则设置一个方法 const config = {}; config.onLoad ??= () => console.log('loaded!')
const myObject = { a: {} } myObject.a ||= 'A'; // 被忽略,因为 myObject 中 a 的值为真值 myObject.b ||= 'B'; // myObject.b 会被创建,因为它不丰 myObject 中 // { // "a": {} // "b": "B" // } myObject.c &&= 'Am I seen?'; // 这里的 myObject.c 为虚值,所以什么都不会做
如何在專案中使用邏輯賦值
## Chrome 已支援邏輯賦值。為了向後相容,請使用 transformer。如果您使用的是Babel,請安裝外掛:
npm install @babel/plugin-proposal-logical-assignment-operators
並在.babelrc
中加入發佈內容:
{ "plugins": ["@babel/plugin-proposal-logical-assignment-operators"] }
邏輯賦值是一個全新的概念,所以還沒有太多相關的知識。如果你有其他關於邏輯賦值的好用法的例子,請在下面留下評論。
原文網址:https://seifi.org/javascript/javascript-logical-assignment-operators-deep-dive.html
作者:Joe Seifi
#譯文地址:https://segmentfault.com/a/1190000039923017
更多程式相關知識,請造訪:程式設計影片! !
以上是深入淺析JS中的邏輯賦值運算符的詳細內容。更多資訊請關注PHP中文網其他相關文章!

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

禪工作室 13.0.1
強大的PHP整合開發環境

WebStorm Mac版
好用的JavaScript開發工具