為什么 &&= 成了我更新 JavaScript 值的新寵?
有一天盯著自己的 JavaScript 代碼,手指懸在鍵盤上,苦思有沒有一種更干凈的條件更新方式,不至于把邏輯寫得臃腫又難讀。
你肯定也遇到過:一邊做 truthy 檢查一邊賦值,代碼很快就纏成一團。
最近我注意到 &&=。它簡潔、現代,承諾能給腳本“瘦身”。我也擔心它會不會變脆?一起看看這個運算符如何在減少樣板代碼的同時,保持可預期與安全。
讓 JavaScript 更精瘦的運算符
&&= 只在左側值為 truthy 時更新變量,而且一行就能寫完。它是個讓代碼更緊湊、而不犧牲可讀性的捷徑。
它解決了冗長 if 檢查塞滿邏輯的痛點。
邏輯與賦值(&&=):它到底做了什么?
&&= 只有在左側變量為 truthy 時才把右側值賦給它。可以把它想成一個“守門員”:合法(truthy)才允許更新。
拆解對比如下:
// 傳統 if 語句
if (x) {
x = y;
}
// 使用邏輯與配合賦值
x = x && y;
// 現代寫法(ES2021 起)
x &&= y;&&= 如何保持“緊湊而安全”
它會先檢查左值是否為 truthy,再決定是否賦右值。 這意味著當左值是 null、undefined、false 等 falsy 時,不會發生賦值。對可讀性與可預期性都是好事。
let access = true;
access &&= 'granted'; // access 變為 'granted'
access = false;
access &&= 'granted'; // access 仍為 false(不更新)
access = '';
access &&= 'granted'; // access 仍為空字符串(不更新)
access = 0;
access &&= 'granted'; // access 仍為 0(不更新)規律?只有當左值是 truthy 時,&&= 才會更新;遇到 falsy 則完全跳過。
常見使用場景示例
來看看在真實代碼里它能如何派上用場。
示例 1:更新用戶權限
function updateUserAccess(user) {
// 僅當字段已為 truthy 時才更新權限(避免把 false/空值誤改)
user.canEdit &&= checkPermissions();
user.canDelete &&= checkAdminStatus();
return user;
}示例 2:表單校驗
const form = {
isValid: true,
isSubmitted: false,
hasErrors: false
};
// 只有在當前判定有效時才繼續深入校驗
form.isValid &&= validateFields(); // 運行校驗并更新 isValid
form.isSubmitted &&= submitToServer(); // 若還未提交(falsy)則跳過
form.hasErrors &&= checkErrors(); // 保持 false,不誤觸發為 true示例 3:API 響應驗證鏈
const response = {
isAuthenticated: true,
hasPermission: true,
isExpired: false
};
// 各步驟僅在前置條件為 truthy 時才繼續
response.isAuthenticated &&= validateToken();
response.hasPermission &&= checkAccess();
response.isExpired &&= checkExpiration(); // 保持 false(不更新)Pro tip: 別把 &&= 和 ||= 搞混了。||= 是“左值為 falsy 才賦值”,而 &&= 是“左值為 truthy 才賦值”。
小心這些細節(順手避坑)
- 不是“布爾賦值”:&&= 不是把變量變成布爾值,它只是按短路規則決定“是否進行賦值”。右側可以是任意類型。
- 保留有意義的 falsy:像 0、''、NaN、false 等在業務里可能是有意義的狀態。&&= 會跳過更新,從而保留原值。
- 副作用:右側表達式只有在左值為 truthy 時才會執行;如果右側有副作用(如函數調用),記得這一點。
- 可讀性:對團隊而言,x &&= y 往往比 x = x && y 更直觀,但請確保團隊成員都熟悉這一語法(ES2021)。


























