Это, по-видимому, правильное назначение деструктурирования, несмотря на то, что qux
зависит от bar
:
const { foo, bar, qux = () => bar } = myObject;
Как это работает, поскольку документация (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) не описывает, как работают зависимые назначения, подобные приведенному выше примеру.
@Etheryte Да, я знаю об этом. Возможно, мой пример немного сбивает с толку из-за этого?
Да, это работает слева направо, но поскольку это функция, она не вычисляет переменную сразу. const { foo, bar, qux = () => baz } = myObject;
столь же действителен, как и const { foo, bar, baz = bar } = myObject;
. Обратите внимание, что эти значения по умолчанию будут полностью игнорироваться для имен свойств, которые в любом случае разрешаются в undefined
. const { foo, bar = qux, qux } = myObject;
работает до тех пор, пока myObject.bar
не разрешается в undefined
. const { foo, baz = qux, qux } = myObject;
не получится.
@SebastianSimon Это имеет гораздо больше смысла, увидев ваш пример baz = qux
, а не мой пример, связанный с функцией.
qux: () => 'qux'
означает объявить const qux
, значение которого будет извлечено как свойство qux
из myObject
.
Однако, если myObject
не имеет такого свойства, константа объявляется так, как если бы вы только что написали const qux = () => bar
. Следовательно, значение по умолчанию qux
— это функция стрелки.
Обратите внимание, что для использования значения по умолчанию свойство qux
должно отсутствовать или иметь значение undefined в myObject
. Значение по умолчанию не будет использоваться, если qux
в myObject
равно нулю или любому другому значению.
Также обратите внимание, что это будет работать:
const { foo, qux = () => bar, bar, x=qux() } = {};
Но это выкинет ReferenceError: Cannot access 'bar' before initialization
:
const { foo, qux = () => bar, x=qux(), bar } = {};
Это потому, что когда вы делаете qux = () => bar
, он еще не пытается получить доступ к необъявленной переменной. Однако вызов qux()
пытается получить доступ к переменной bar
, поэтому важен порядок.
Правильно, предположим, что у нас есть const { foo, bar, qux = () => bar } = {};
, так что foo, bar = undefined
и qux = () => undefined
. Результат остается прежним, даже если у нас есть const { foo, qux = () => bar, bar } = {};
, несмотря на то, что bar
идет после qux
. Как здесь работает порядок?
@ fibol80270, это действительно интересный момент, я добавляю кое-что к своему ответу, который появится через несколько секунд.
Спасибо, это покрывает все основания для меня. Планирую использовать это с React для реквизита по умолчанию, поэтому я хотел убедиться, что полностью понял его поведение перед использованием.
Обратите внимание, что ваш пример немного вводит в заблуждение,
qux
все равно будет() => 'qux'
.