πŸ”

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ ES2021

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ ES2021

НиТС я ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡŽ список Ρ‚Π΅Ρ… ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ достигли стадии 4 ΠΈ ΠΊΠΎΠΌΠΈΡ‚Π΅Ρ‚ TC39 Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ» Π² послСдний Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊ спСцификации.

ΠΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ список ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π½Π° GitHub ΠΊΠΎΠΌΠΈΡ‚Π΅Ρ‚Π° TC39

String.replaceAll

String.replaceAll() замСняСт всС экзСмпляры подстроки Π² строкС Π΄Ρ€ΡƒΠ³ΠΈΠΌ строковым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π±Π΅Π· использования глобального рСгулярного выраТСния.

Π”ΠΎ сих ΠΏΠΎΡ€ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнный способ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ глобальноС рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для Π·Π°ΠΌΠ΅Π½Ρ‹ символа "+" Π½Π° ΠΏΡ€ΠΎΠ±Π΅Π»:

const fullname = 'fullname=John+Hannibal+Smith';
const fullnameFormated = fullname.replace(/\+/g, ' ');

console.log(fullnameFormated) // John Hannibal Smith

Π’ Π±ΠΎΠ»Π΅Π΅ слоТных случаях ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ нСпросто ΠΈ поэтому ΡΠ²Π»ΡΡŽΡ‚ΡΡ частым источником ошибок.

Π•ΡΡ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ β€” это строку Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Array.split ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π΅Ρ‘ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Array.join:

const fullname = 'fullname=John+Hannibal+Smith';
const fullnameFormated = fullname.split('+').join(' ');

console.log(fullnameFormated) // John Hannibal Smith

Π­Ρ‚Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ использования рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ раздСлСния строки Π½Π° массив частСй ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΈΡ… склСивания, Ρ‡Ρ‚ΠΎ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы.

ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Mathias Bynens Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ Π΄Π°Π΅Ρ‚ простой способ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ Π·Π°ΠΌΠ΅Π½Ρƒ подстроки:

const fullname = 'fullname=Jhon+Hannibal+Smith';
const fullnameFormated = fullname.replaceAll('+', ' ');

console.log(fullnameFormated) // John Hannibal Smith

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ поддСрТиваСтся Π² NodeJs, начиная с вСрсии 15.0.0. А Ρ‚Π°ΠΊΠΆΠ΅ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ² ΡƒΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ.

πŸ“Œ ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ для согласованности с Ρ€Π°Π½Π΅Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Π²ΡˆΠΈΠΌΠΈ API Π½Π° языкС String.replaceAll(searchValue, newvalue) Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΊΠ°ΠΊ String.replace(searchValue, newvalue) с двумя основными особСнностями:

  • Если searchValue являСтся строкой, Ρ‚ΠΎ String.replaceAll замСняСт всС вхоТдСния, Π° String.replace замСняСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ подстроки.
  • Если searchValue - Π½Π΅ глобальноС рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, String.replace замСняСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ совпадСниС. String.replaceAll, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π² этом случаС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ отсутствиСм глобального Ρ„Π»Π°Π³Π° ΠΈ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

Promise.any

Promise.any() рассчитываСтся, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π»ΡŽΠ±Ρ‹Π΅ Promise Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ (resolved), ΠΈΠ»ΠΈ всС ΠΎΠ½ΠΈ ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΡΡŽΡ‚ΡΡ (rejected). Π’ случаС, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ всС ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½Ρ‹ (rejected) Promise.any() отклоняСтся с ошибкой AggregateError.

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => resolve("P1"), Math.floor(Math.random() * 100));
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(() => resolve("P2"), Math.floor(Math.random() * 100));
});

(async function() {
  const result = await Promise.any([promise1, promise2]);

  console.log(result); // P1 or P2
})();

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ любой ΠΈΠ· ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… (resolved) Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Promise.any().

МногиС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ ΡƒΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Π’ NodeJS ΠΎΠ½ доступСн, начиная с вСрсии 15.0.0.

πŸ“Œ ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅ ΠΎ различиях с Promise.race(), Π³Π΄Π΅ выполняСтся расчСт, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ выполняСтся ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ· Promise, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ ΠΎΠ½ΠΈ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½Ρ‹.

WeakRefs

ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Dean Tribble, Till Schneidereit, Sathya Gunasekaran

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ WeakRef позволяСт ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΡΠ»Π°Π±ΡƒΡŽ ссылку Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π΅ прСпятствуя сборкС мусора для этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Блабая ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ β€” это ссылка, которая Π½Π΅ прСпятствуСт ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° сборщиком мусора. Напротив, обычная (ΠΈΠ»ΠΈ сильная) ссылка сохраняСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² памяти. Когда ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ большС Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΈΠ»ΡŒΠ½Ρ‹Ρ… ссылок Π½Π° Π½Π΅Π³ΠΎ, сборщик мусора Π΄Π²ΠΈΠΆΠΊΠ° JavaScript ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Если это ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Π²Ρ‹ большС Π½Π΅ смоТСтС ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ· слабой ссылки.

Для Ρ‡Π΅Π³ΠΎ Π½Π°ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ WeakRefs? НапримСр, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Map для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ кСша со мноТСством ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ трСбуСтся ΠΌΠ½ΠΎΠ³ΠΎ памяти. Π’ этом случаС Π½Π°ΠΌ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ скорСС ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡƒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠΈ Β«ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β», ΠΈ WeakRefs позволяСт Π½Π°ΠΌ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

На Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π² JavaScript Π΅ΡΡ‚ΡŒ WeakMap() ΠΈ WeakSet(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ WeakRefs.

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

const myObj = {...};

Ѐункция, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚:

function useTheObj(obj) {
   doSomethingWith(obj);
}

Π― Ρ…ΠΎΡ‡Ρƒ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ, сколько Ρ€Π°Π· ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±Ρ‹Π» Π²Ρ‹Π·Π²Π°Π½ с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΈ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ, Ссли это происходит Π±ΠΎΠ»Π΅Π΅ 1000 Ρ€Π°Π·:

let map = new Map();

function useTheObj(obj){
  doSomethingWith(obj);

  // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ количСство Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈΠ»ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0
  let called = map.get(obj) || 0;

  // ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΠΌ счётчик
  called++;

  if (called > 1000) {
    console.log("called more than 1000 times");
  };

  map.set(obj, called);
}

Π­Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, навсСгда остаСтся Π² map ΠΈ Π½Π΅ собираСтся сборщиком мусора. РСшСниС β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ WeakMap:

let wmap = new WeakMap();

function useTheObj(obj){
  doSomethingWith(obj);
  // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ количСство Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈΠ»ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0
  let called = wmap.get(obj) || 0;


  // ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΠΌ счётчик
  called++;

  if (called > 1000) {
    console.log("called more than 1000 times");
  };

  wmap.set(obj, called);
}

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° WeakRefs Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ Π²Π΅Π·Π΄Π΅, Π½ΠΎ NodeJS доступно, начиная с вСрсии 14.6.0.

πŸ“Œ ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ссылки слабыС, ΠΊΠ»ΡŽΡ‡ΠΈ WeakMap нСльзя ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ.

πŸ“Œ WeakSet ΠΏΠΎΡ…ΠΎΠΆ Π½Π° WeakMap, Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈ Π² случаС с коллСкциями, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² WeakSet ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. ВсС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ WeakSet ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹.

πŸ“Œ Богласно MDN использованиС Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ понимания WeakRef ΠΈ рСкомСндуСтся ΠΏΠΎ возмоТности ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ Π΅Π³ΠΎ использования.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ логичСского присваивания (Logical Assignment Operators)

ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° логичСского присваивания (ДТастина РидТуэлла ΠΈ Π₯Π΅ΠΌΠ°Π½Ρ‚Π° HM) ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ (&&, ||, ??) ΠΈ выраТСния присваивания.

Π”ΠΎ сих ΠΏΠΎΡ€ Π² JavaScript Π±Ρ‹Π»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присваивания:

= // присваиваниС
/= // присваиваниС с Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ
*= // присваиваниС с ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ
&&= // присваиваниС с логичСским И 
||= // присваиваниС с логичСским Π˜Π›Π˜ 
??= // логичСскоС Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ присваиваниС
**= // присваиваниС с Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ
%= // присваиваниС ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ
+= // присваиваниС со слоТСниСм
-= // присваиваниС с Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ΠΌ
<<= // присваиваниС с Π»Π΅Π²Ρ‹ΠΌ сдвигом
>>= // присваиваниС с ΠΏΡ€Π°Π²Ρ‹ΠΌ сдвигом
>>>= // присваиваниС с Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΌ сдвигом Π²ΠΏΡ€Π°Π²ΠΎ
&= // присваиваниС с ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ AND
^= // присваиваниС с ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ XOR
|= // присваиваниС с ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ OR

/** Π”Π΅ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ присваиваниС: */
[a, b] = [10, 20]
{a, b} = {a: 10, b: 20}

И с этим ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΌΡ‹ объСдиним логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ выраТСния присваивания:

a ||= b // Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΠΎ: a || (a = b), присваиваСтся, Ссли a - Π»ΠΎΠΆΠ½ΠΎΠ΅
a &&= b // Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΠΎ: a && (a = b), присваиваСтся, Ссли a - истина
a ??= b // Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΠΎ: a ?? (a = b), присваиваСтся, Ссли a - null ΠΈΠ»ΠΈ undefined

На Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅ всС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ². Π’ NodeJS доступно, начиная с вСрсии 15.0.0

ЧисловыС Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ (Numeric separators)

ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Christophe Porteneuve числовых Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΉ Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ NumericLiteral, позволяя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ символ-Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ†ΠΈΡ„Ρ€Π°ΠΌΠΈ.

Благодаря этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ числовыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌΠΈ, создав Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ Ρ†ΠΈΡ„Ρ€.

НапримСр Ρƒ нас Π΅ΡΡ‚ΡŒ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ числовой Π»ΠΈΡ‚Π΅Ρ€Π°Π»:

const money = 1000000000000;

Π’Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹ΠΉ числовой Π»ΠΈΡ‚Π΅Ρ€Π°Π» слоТно Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Π½ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ символы подчСркивания Π² качСствС Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅:

const money = 1_000_000_000_000;

Π’Π΅ΠΏΠ΅Ρ€ΡŒ константа money стала Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΠΉ.

ЧисловыС Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ для чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ:

const money = 1_000_000.123_456;

Numeric separators ΡƒΠΆΠ΅ поддСрТиваСтся Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ² ΠΈ Π² NodeJs, начиная с вСрсии 12.5.0.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

JavaScript постоянно развиваСтся ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹Π΅ инструмСнты. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрСли Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· этих инструмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, скорСС всСго, Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² JavaScript ES2021 (ES12).

Бпасибо, Ρ‡Ρ‚ΠΎ Π΄ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°. Если ΠΆΠ΅ Π²Π°ΠΌ интСрСсно, Ρ‡Ρ‚ΠΎ вошло Π² ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ES2020, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π²ΠΎΡ‚ эту ΡΡ‚Π°Ρ‚ΡŒΡŽ.

Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘:

← 7 совСтов ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ свой ΠΊΠΎΠ΄ Ρ‡ΠΈΡ‰Π΅

7 совСтов ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ свой ΠΊΠΎΠ΄ Ρ‡ΠΈΡ‰Π΅

Π Π°Π±ΠΎΡ‚Π° с асинхронными Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ β†’

Π Π°Π±ΠΎΡ‚Π° с асинхронными Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ