# ES2021 Features!

### Logical Assignment Operators

Logical Assignment Operators ðŸ“–.

``````//"Or Or Equals"
x ||= y;
x || (x = y);

// "And And Equals"
x &&= y;
x && (x = y);

// "QQ Equals"
x ??= y;
x ?? (x = y);``````
``````const updateID = user => {

// We can do this
if (!user.id) user.id = 1

// Or this
user.id = user.id || 1

// Or use logical assignment operator.
user.id ||= 1
}``````
``````function setOpts(opts) {
opts.cat ??= 'meow'
opts.dog ??= 'bow';
}

setOpts({ cat: 'meow' })``````

### Numeric Separators

Visual separation between groups of digits ðŸ“–

``````1_000_000_000           // Ah, so a billion
101_475_938.38          // And this is hundreds of millions

let fee = 123_00;       // \$123 (12300 cents, apparently)
let fee = 12_300;       // \$12,300 (woah, that fee!)
let amount = 12345_00;  // 12,345 (1234500 cents, apparently)
let amount = 123_4500;  // 123.45 (4-fixed financial)
let amount = 1_234_500; // 1,234,500``````
``````0.000_001 // 1 millionth
1e10_000  // 10^10000 -- granted, far less useful / in-range...
0xA0_B0_C0;``````

### Promise.any and AggregateError

Promise.any + AggregateError ðŸ“–

``````Promise.any([
fetch('https://v8.dev/').then(() => 'home'),
fetch('https://v8.dev/blog').then(() => 'blog'),
fetch('https://v8.dev/docs').then(() => 'docs')
]).then((first) => {
// Any of the promises was fulfilled.
console.log(first);
// â†’ 'home'
}).catch((error) => {
// All of the promises were rejected.
console.log(error);
});``````

^ In the above example `error` is an `AggregateError`

### String.prototype.replaceAll

replaceAll ðŸ“–

``````// String.prototype.replaceAll(searchValue, replaceValue)

'x'.replace('', '_');
// â†’ '_x'

'xxx'.replace(/(?:)/g, '_');
// â†’ '_x_x_x_'

'xxx'.replaceAll('', '_');
// â†’ '_x_x_x_'``````

### WeakRefs and FinalizationRegistry Objects

WeakRefs and FinalizationRegistry ðŸ“–

``````let target = {};
let wr = new WeakRef(target);

//wr and target aren't the same

// Creating a new registry
const registry = new FinalizationRegistry(heldValue => {
// ....
});

registry.register(myObject, "some value", myObject);
// ...some time later, if you don't care about `myObject` anymore...
registry.unregister(myObject);``````

With â™¥ Hemanth.HM