Вызов функции с определенным аргументом по умолчанию в JavaScript?

Итак, у меня есть такая функция:

function foo(a, b, c=0, d=10, e=false) {
  // ...
}

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

foo("bar", "skurr", e=true);

Я знаю, что в python вы можете вызывать функции таким образом, но, похоже, есть еще один метод, о котором я не знаю для js.

Я попытался ввести объект, но это не сработало, поскольку он просто использует объект в качестве первого параметра функции.

foo({a: "bar", b: "skurr", e: true});

Как мне вызывать функции таким образом в JavaScript?


person Jurij    schedule 05.08.2020    source источник


Ответы (1)


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

function foo({a, b=0}) { console.log(a,b); }

Это определяет функцию, которая требует объект в качестве первого аргумента и накладывает структурные ограничения на этот объект. В частности, будет работать следующее:

foo({a:1});            // output: 1 0
foo({a:1, b:2});       // output: 1 2
foo({});               // output: undefined 0
foo({a:1, b:2, c: 3}); // output: 1 2 /* c is ignored */

В то время как следующее вызовет ошибку:

foo(); // TypeError: Cannot destructure property `a` of 'undefined' or 'null'

Другой вариант, который часто встречается, — это идиоматическая форма:

function foo(some_object) { let {a,b} = some_object; console.log(a,b); }

Оба они являются примерами деструктуризации. Насколько мне известно, это самый близкий к Python синтаксис (этот ответ, возможно, дает больше пояснений, и я даю, возможно, слишком тщательный анализ формального языка, который объясняет наблюдаемые эффекты Значение параметра функции назначения объекта деструктурирования ES6 по умолчанию)

person Nathan Chappell    schedule 05.08.2020