Как стать автором
Обновить

Комментарии 20

let { name = 'Спрятался в коробке', email = null } = getCustomer() || {};

IMHO, сейчас лучше использовать ??, а не ||

А не подскажите какой плагин для VSCode "понимает" Nullish? А то JS-CSS-HTML Formatter js-beautify нагло вносит кашу и ломает код. Ну или как его настроить...

Prettier пробовали?

Оказывается надо было принудительно обновить js-beautify внутри JS-CSS-HTML Formatter

Соглашусь. Но, кмк, в рамках статьи про одну из фичей es6 это бы добавило вопросов к примеру, поэтому в таком контексте я все-таки согласен с примером оригинала.

IMHO, || и ?? таки для разных целей. ?? может вернуть 0 или пустую строку, в отличии от. Так как || проверяет на истинность, а ?? на присвоение значение(всё, что не null || undefined).

И именно по этой причине надо привыкать использовать ?? для значений по умолчанию.

Это называется "деконструкция"

В чём Вы видите несогласие? Термин "деструктуризация" упомянут в двух учебниках по JS. В большинстве случаев употребляется термин деконструкция.

Речь идёт не о процессе лишения чего-то структуры (например, деструктуризация власти; сравните с реструктуризацией), а о процессе, обратном конструированию (например, деконструкция моста; сравните с реконструкцией). В теории языков программирования те процедуры, которые разбирают данные на части называют деконструкторами, в противоположность конструкторам (термин "деструктор" уже был занят). На английском, ведь, то же самое:

https://duckduckgo.com/?q=destructure+tuple
https://duckduckgo.com/?q=deconstruct+tuple

В JS речь идёт конкретно о destructuring assignment - о присваивании, забывающем структуру, но сам процесс разбора объекта на отдельные составляющие - это, всё же, деконструкция.

Во-первых, я бы не назвал ES6 "новым".

Во-вторых, слепое деструктурирование всего и вся очень быстро может привести к стрельбе себе в ногу, т.к., если уж взялись деструктурировать, всегда следует точно понимать, где вам необходима передача by reference, а где достаточно копирования by value.

В-третьих, также не забываем, если вы собираетесь использовать деструктурирование, особенно вместе с инициализаторами и spread, это не бесплатные операции. Без понимания этого люди пишут эпически тормозной код.

В ином случае они бы писали бы эпически нечитабельный код. Так что из двух зол меньшее.

Уже 7 лет как es6 вышел как официальный стандарт, 8 лет как лично я осознанно использовал его бетта-фичи, 9 лет как хром его частично реализовал, но ради кармы и, видимо, денег всё пишут и пишут о “новом синтаксесе es6”.

А что именно в деструктурировании тормозное?

const {name} = object
const name2 = object.name

у этих двух вызовов будет разница в скорости?

Нет, в таком случае никакой разницы в скорости не будет. А вот с rest-ом для длинных массивов я был бы более осторожен, т.к. это, как минимум, slice, т.е. копирование части массива в памяти. Если мы говорим не только о деструктурировании, но и о spread, который часто используют с ним в паре, то мне приходит в голову вот такой антипаттерн:

Пожалуйста, не делайте так

[1,2,3,4,5].reduce((acc, value, index) => ({...acc, [value]: index}), {});

Понял. Все же дополнительные операции не в деструктуризации как таковой, а именно в rest. Но если кто-то делает rest с деструктуризацией, то предполагается, что ему таки нужно это значение.

Кстати, ваш антипаттерн - он про spread syntax, тут вообще нет деструктуризации.

Кстати, ваш антипаттерн - он про spread syntax, тут вообще нет деструктуризации.

Я так и сказал. Сорри, если неточно выразился, надо, видимо, иногда спать... :)

С одной стороны как-то сложно и запутанно, и автор сам это отмечает. С другой стороны - подобные фичи в том или ином объеме представлены в других языках, например, Perl и его последователях.

У автора мелкая ошибка в подглаве "Базовая деструктуризация массива".

console.log(secondFruit); // Orange
console.log(secondFruit); // Apple (да, мы можем позволить себе и третий фрукт, потому что мы молодцы)

так как можем добавить в резюме что-то про DRY.

По-моему DRY немного не про это..

Кстати, а можно смаппить из объекта только свойства, имеющиеся в записывемом? Типа

let obj = {name: "Tmfs"}
let source = {name: "John",
              age:25};

obj = ... // копируем только name
Зарегистрируйтесь на Хабре, чтобы оставить комментарий