The logical AND assignment operator &&=
arrived alongside ??= in ECMAScript 2021. It combines logical AND &&
with assignment =
, offering a shorthand way to conditionally update values.
The &&=
operator is a logical assignment operator that updates values based on truthiness. It only assigns the new value if the existing value is truthy. Here’s how it works under the hood:
// Traditional if statementif (x) { x = y;}
// Using logical AND with assignmentx = x && y;
// Modern &&= operator (ES2021)x &&= y;
The behavior of &&=
becomes clear when we examine different initial values.
let access = true;access &&= 'granted'; // access becomes 'granted'
access = false;access &&= 'granted'; // access stays false
access = '';access &&= 'granted'; // access stays empty string
access = 0;access &&= 'granted'; // access stays 0
Starting with true
(truthy), the value changes to ‘granted’; but with false
, an empty string, or 0 (all falsy values), the original value stays unchanged.
This demonstrates how &&=
only performs assignment when the existing value is truthy, making it ideal for conditional updates where you want to preserve falsy states.
The &&=
operator excels at handling conditional updates where you want to respect falsy values. Here’s a common use case with user permissions:
function updateUserAccess(user) { // Only updates permissions if they already exist user.canEdit &&= checkPermissions(); user.canDelete &&= checkAdminStatus();
return user;}
The &&=
operator is also useful for managing application states and validation:
const form = { isValid: true, isSubmitted: false, hasErrors: false};
// Only validate if form is currently validform.isValid &&= validateFields(); // Runs validationform.isSubmitted &&= submitToServer(); // Skipped if not validform.hasErrors &&= checkErrors(); // Preserves false state
Or for an API response pattern:
const response = { isAuthenticated: true, hasPermission: true, isExpired: false};
// Each check only runs if previous checks passresponse.isAuthenticated &&= validateToken();response.hasPermission &&= checkAccess();response.isExpired &&= checkExpiration(); // Stays false if no permission
Keep in mind that the &&=
operator is about conditional updates based on truthiness. If you need to handle null
or undefined
specifically, consider using the ??=
operator instead.