Всего 4 часа назад TC39 добавил в ES2019 следующие функции. Давайте посмотрим, какие изменения принесут нам эти новые функции.
Что нового в ES2019:
➡️ Массив#{flat,flatMap}
➡️ Object.fromEntries
➡️ Строка#{trimStart,trimEnd}
➡️ Символ#описание
➡️ try { } catch {} // необязательная привязка
➡️ JSON ⊂ ECMAScript
➡️ правильно сформированный JSON.stringify
➡️ стабильная сортировка массива
➡️ переработана функция#toString
JSON ⊂ Ecmascript (JSON SuperSet)
Разделение Разделение (U + 2028) и символ разделителя сегментов (U + 2029) теперь позволяют сопоставлять JSON в тексте строки. Ранее эти символы трактовались в тексте строки как завершение строки, поэтому они использовали их для возникновения аномалии SyntaxError.
well-formed JSON.stringify
Более дружественный JSON.stringify (исправлена ошибка отображения для некоторых юникодов вне допустимого диапазона).
Если ввод в формате Unicode, но за пределами диапазона символов, JSON.stringify ранее возвращал искаженную строку Unicode:
JSON.stringify('\uD800');
// → '"�"'
Теперь реализует изменение JSON.stringify.Предложение этапа 3, поэтому он выводит escape-последовательности для него, делая его допустимым Unicode (и представленным в UTF-8):
JSON.stringify('\uD800');
// → '"\\ud800"'
在 chrome 控制台输出的是 '"\ud800"' ,但只是一个显示值, 真实值为'"\\ud800"'。
JSON.stringify('\uD800') === '"\\ud800"';
// → true
stable Array#sort
В предыдущем, в функции сортировки более 10 массивов V8 используется нестабильная Quicksort (быстрая строка. Теперь используйте стабильный алгоритм Timsort.)
Алгоритм TimSort:Что ж, Wikipedia.org/wiki/Тим или…
revised Function#toString
Function.prototype.toString()Теперь возвращаются точные символы, включая пробелы и комментарии. Сравнение старого и настоящего:
// Note the comment between the `function` keyword
// and the function name, as well as the space following
// the function name.
function /* a comment */ foo () {}
// Previously:
foo.toString();
// → 'function foo() {}'
// ^ no comment
// ^ no space
// Now:
foo.toString();
// → 'function /* comment */ foo () {}'
Array #{flat, flatMap}
Уменьшение размерности массива, рекурсивное сглаживание массива до указанной глубины, по умолчанию 1.
// Flatten one level:
const array = [1, [2, [3]]];
array.flat();
// → [1, 2, [3]]
// Flatten recursively until the array contains no more nested arrays:
array.flat(Infinity);
// → [1, 2, 3]
[2, 3, 4].flatMap((x) => [x, x * 2]);
// → [2, 4, 3, 6, 4, 8]
2019.1.31 Обновление
[2, 3, [2]].flatMap((x) => x + 1);
// [3, 4, "21"]
Я только что увидел, что кто-то сомневается в этом результате, думая, что внутри flatMap есть какая-то операция.
На самом деле этоaddition-operator-plus(+)
причина. + пройдетtoprimitive
Преобразуйте массив в базовый тип String. Итак, [2] + 1 переводится как «2» + 1 === «21». Вот доказательства:
Смена работы 39.GitHub.IO/ECcode262/#color… Смена работы 39.GitHub.IO/ECcode262/#color…
Object.fromEntries
Object.fromEntries(Object.entries(object)) ≈ объект
Это похоже на _.fromPairs в Lodash.
String#{trimStart,trimEnd}
Можно указать, что начальные и конечные пробелы должны быть удалены.
const string = ' hello world ';
string.trimStart();
// → 'hello world '
string.trimEnd();
// → ' hello world'
string.trim();
// → 'hello world'
Symbol.prototype.description
При создании символа с помощью фабричной функции Symbol() вы можете дополнительно указать строку в качестве описания через параметр:
const sym = Symbol('The description');
Раньше единственным способом доступа к описанию было преобразование символа в строку:
assert.equal(String(sym), 'Symbol(The description)');
Геттер Symbol.prototype.description теперь представлен для прямого доступа к описанию:
assert.equal(sym.description, 'The description');
try {} catch {}
Теперь try {} catch {} имеет более простой метод и становится необязательным.
До
try {} catch (e) {}
Сейчас