Новые функции ES2020 (также известные как ES11) уже доработаны, и у нас есть время поэкспериментировать с ними. Продолжайте читать, чтобы проверить их и проверить совместимость браузера, пока мы пишем эту статью.

Строка.прототип.matchAll()

Метод matchAll() возвращает итератор всех результатов, совпадающих со строкой и регулярным выражением, включая захваченные группы.

const regex = /t(e)(st(\d?))/g;
const string = 'test1test2';
const matches = string.matchAll(regex);
for (const match of matches) {
  console.log(match);
}
// ['test1', 'e', 'st1', '1', index: 0, input: 'test1test2', groups: undefined]
// ['test2', 'e', 'st2', '2', index: 5, input: 'test1test2', groups: undefined]

Динамический импорт

import() теперь возвращает обещание для объекта пространства имен модулей запрошенного модуля. Теперь вы можете назначить их переменной, используя async/await.

// Example 1 - using async/await
if (aCondition) {
  const dynamicModule = await import('./module');
  dynamicModule.amazingFunction('2');
}
// Example 2 - using promises
Promise.all([
    import('./module1.js'),
    import('./module2.js'),
    import('./module3.js'),
])
.then(([module1, module2, module3]) => {
    ···
});

BigInt

BigInt — это новый примитивный тип, который следует использовать только тогда, когда ожидаются значения больше 2^53.

BigInts — это не совсем число, но они ведут себя одинаково и их можно сравнивать друг с другом. Обратите внимание, что BigInt будет округлен до 0.

const theBiggestInt = 9007199254740991n
const alsoHuge = BigInt(9007199254740991)
const rounded = 5n / 2n
// returns 2n, not 2.5n

//Compare to a Number
0n === 0
// false

0n == 0
// true

Promise.allSettled

Метод Promise.allSettled() возвращает обещание, которое разрешается после выполнения всех заданных обещаний. По сравнению с Promise.all() не имеет значения, были ли промисы разрешены правильно или они были отклонены.

const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'foo'));
const promises = [promise1, promise2];
// Promise.all()
Promise.all(promises).
  then(response => console.log(response))
  then(error => console.log(error))
// expected output:
// foo

// Promise.allSettled()
Promise.allSettled(promises).
  then(response => console.log(response))
// expected output:
[ {status: 'fulfilled', value: 3},
  {status: 'rejected', reason: 'foo'} ]

глобальныйЭто

Исторически сложилось так, что когда мы хотели повторно использовать код через среды и получить доступ к глобальному объекту, нам приходилось делать некоторые хаки, например:

var getGlobal = function () { 
  if (typeof self !== 'undefined') { return self; } 
  if (typeof window !== 'undefined') { return window; } 
  if (typeof global !== 'undefined') { return global; } 
  throw new Error('unable to locate global object'); 
}; 

var globals = getGlobal(); 

if (typeof globals.setTimeout !== 'function') { 
  // no setTimeout in this environment! 
}

Однако с недавно представленным объектом globalThis доступ к глобальному объекту стандартизирован:

if (typeof globalThis.setTimeout !== 'function') {
  // no setTimeout in this environment!
}

Нулевое слияние

Чтобы объяснить это, нам нужно провести различие между двумя понятиями: ложными и нулевыми значениями.

+-----------+-----------+
|  falsy    | nullish   |
+-----------+-----------+
| undefined | undefined |
| null      | null      |
| NaN       |           |
| 0         |           |
| ""        |           |
| false     |           |
+-----------+-----------+

Новый Оператор нулевого объединения (??) будет возвращать левое значение, когда оно не является нулевым, по сравнению с логическим оператором ИЛИ (||), который возвращает левое значение, когда оно не является нулевым. фальшивая.

const foo = null ?? 'default string';
console.log(foo);
// expected output: "default string"
const logicFoo = null || 'default string';
console.log(logicFoo);
// expected output: "default string"
const baz = 0 ?? 42;
console.log(baz);
// expected output: 0
const logicBaz = 0 || 42;
console.log(logicBaz);
// expected output: 42

Для… по порядку

ECMA-262 оставляет порядок for (a in b) неуказанным, но почти каждый движок и браузер это сделали. Теперь разные движки согласовали порядок итерации свойств, чтобы иметь стандартизированное поведение.

Необязательная цепочка

Необязательная цепочка (?.)синтаксис позволяет получить доступ к глубоко вложенным свойствам объекта, не беспокоясь о том, существует ли свойство или нет. Если свойство не существует, оно вернет значение undefined.

const player = {
  name: 'Alex',
  cat: {
    name: 'Kitty'
  }
};
const dogName = player.dog?.name;
// undefined
const catName = player.cat?.name;
// Kitty

Совместимость с браузером:

Рабочий стол:

+------------------+--------+------+---------+----+-------+--------+
|                  | Chrome | Edge | Firefox | IE | Opera | Safari |
+------------------+--------+------+---------+----+-------+--------+
| matchAll()       |   73   |  79  |    67   |  X |   60  |    X   |
| import           |   63   |  79  |    67   |  X |   50  |  11.1  |
| BigInt           |   67   |  79  |    68   |  X |   54  |    X   |
|Promise.allSettled|   76   |  79  |    71   |  X |   63  |   13   |
| globalThis       |   71   |  79  |    65   |  X |   58  |  12.1  |
|Nullish Coalescing|   80   |  80  |    72   |  X |    X  |  13.1  |
|Optional Chaining |   80   |  80  |    74   |  X |   67  |    X   |
+------------------+--------+------+---------+----+-------+--------+

Мобильный:

+------------------+------------------------------------+--------+
|                  |            Android                 |   iOS  |
+------------------+---------+--------+---------+-------+--------+
|                  | Webview | Chrome | Firefox | Opera | Safari |
+------------------+---------+--------+---------+-------+--------+
| matchAll()       |    73   |   73   |    67   |   52  |    X   |
| import           |    63   |   63   |    67   |   46  |  11.3  |
| BigInt           |    67   |   67   |    68   |   48  |    X   |
|Promise.allSettled|    76   |   76   |     X   |   54  |   13   |
| globalThis       |    71   |   71   |    65   |   50  |  12.2  |
|Nullish Coalescing|    80   |   80   |     X   |    X  |  13.4  | |Optional Chaining |    80   |   80   |     X   |    X  |    X   |
+------------------+---------+--------+---------+-------+--------+

Node.js:

+------------------+---------+
|                  | Node.js |
+------------------+---------+
| matchAll()       |  12.0.0 |
| import           |  13.2.0 |
| BigInt           |  10.4.0 |
|Promise.allSettled|  12.9.0 |
| globalThis       |  12.0.0 |
|Nullish Coalescing|     X   |
|Optional Chaining |     X   |
+------------------+---------+