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

аюсь выяснить, возможно ли обрабатывать несколько уровней параметров по умолчанию с помощью деструктуризации. Поскольку это не легко объяснить словами, вот пошаговый пример ...

1 - Разрушение плоского объекта с параметрами по умолчанию

Уничтожить этот объект легко:

let obj = {
  foo: 'Foo',
  bar: 'Bar'
};

С{foo = 'Foo', bar = 'Bar'} = {} в сигнатуре функции будет создан объект, если при вызове функции не передан аргумент. Если объект передан, но некоторые ссылочные свойстваundefined, они будут заменены значениями по умолчанию. Этот код работает нормально:

function fn1({foo = 'Foo', bar = 'Bar'} = {}) {
  console.log(foo, bar);
}

// OK
fn1(); // Foo Bar
fn1({foo: 'Quux'}); // Quux Bar
fn1({bar: 'Quux'}); // Foo Quux
fn1({foo: 'Quux', bar: 'Quux'}); // Quux Quux

2 - Разрушение вложенного объекта с мелкими параметрами по умолчанию

Разрушить этот объект сложнее:

let obj = {
  foo: 'Foo',
  bar: {
    quux: 'Quux',
    corge: 'Corge'
  }
};

{foo = 'Foo', bar = 'Bar'} = {} больше не является жизнеспособным вариантом, но теперь мы можем использовать{foo = 'Foo', bar = {quux: 'Quux', corge: 'Corge'}} = {} в сигнатуре функции. Опять же, если аргумент не указан при вызове функции, создается объект и основные свойства (foo а такжеbar) извлекаются. Если объект передан, только неопределенные свойства (foo или жеbar) будет изменен со значениями по умолчанию.

Проблема в том, что свойства объектаbar (quux а такжеcorge) не являются частью «деструктуризации на высшем уровне». Это означаетquux или жеcorge будетundefined если они не установлены явно, когдаbar передается в качестве аргумента:

function fn2({foo = 'Foo', bar = {quux: 'Quux', corge: 'Corge'}} = {}) {
  console.log(foo, bar.quux, bar.corge);
}

// OK
fn2(); // Foo Quux Corge
fn2({foo: 'Quux'}); // Quux Quux Corge

// Oops!
fn2({bar: {quux: 'Baz'}}); // Foo Baz undefined
fn2({foo: 'Quux', bar: {corge: 'Baz'}}); // Quux undefined Baz

3 - Разрушение вложенного объекта с глубокими параметрами по умолчанию

Я хотел бы установить параметры по умолчанию на всех уровнях иерархии объектов, чтобы использовать своего рода «каскадную деструктуризацию». Я пробовал это, но это не работает:

function fn3({foo = 'Foo', bar = ({quux = 'Quux', corge = 'Corge'} = {})} = {}) {
  console.log(foo, bar.quux, bar.corge);
}

// Oops!
fn3(); // Foo undefined undefined
fn3({foo: 'Quux'}); // Quux undefined undefined
fn3({bar: {quux: 'Baz'}}); // Foo Baz undefined
fn3({foo: 'Quux', bar: {corge: 'Baz'}}); // Quux undefined Baz

Знаете ли вы, разрешена ли такая функция в ES6. Если да, как я могу это реализовать?

Ответы на вопрос(2)

Ваш ответ на вопрос