Подтвердить что ты не робот

Имена параметров с ES6?

Я определил такую ​​функцию, как:

function call_api(url, callback, query = {}, body = {})

Я ожидал синтаксиса, где я могу предоставить запрос тела и пропустить:

call_api('/api/clients/new', function(x){console.log(x)}, body={1:2})

Но я должен использовать это обходное решение:

call_api('/api/clients/new', function(x){console.log(x)}, {}, {1:2})

Даже если я предоставляю body=, он появляется как параметр query. Я использую Babel с Webpack. Я пробовал синтаксис в консоли Chrome и в источнике Webpack.

Является ли такой синтаксис поддержкой ES6? Как это работает?

4b9b3361

Ответ 1

Я рекомендую вам обойти это с передачей объекта и использованием деструктурирования для объектов:

function callApi({url, callback, query = {}, body = {}})

И затем назовите его как:

callAPI({url: "/api/..", callback: (x => console.log(x)), body: {a:2}})

Это даст вам синтаксис, похожий на тот, который вы хотите.

Именованные аргументы были рассмотрены и отклонены для JavaScript, в отличие от других языков, таких как С# и Python, которые их поддерживают. Вот недавняя дискуссия об этом из списка рассылки по языку.

Ответ 2

Вы не можете указать, какой параметр вы назначили в своем вызове.

call_api('/api/clients/new', function(x){console.log(x)}, body={1:2})

Является эквивалентом установки переменной с именем body вне функции, а затем передает ее значение в пятне параметра запроса.

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

function call_api(url, callback, {query = {}, body = {}} = {})

Тогда в вашем вызове вы сделаете это

call_api('/api/clients/new', function(x){console.log(x)}, {body:{1:2}})

Ответ 3

Как показано на этом сайте, значения по умолчанию предназначены только для параметров, которым требуется значение по умолчанию (например, параметр параметров), но не для ' пропуская "параметры.

Что вы пытаетесь сделать, это

// function definition
function hi(a,b,c,d)

// function call
hi(a,b,d)

ES6 по-прежнему будет думать, что ваш "d" - это определенный c, независимо от вашего значения по умолчанию.
Таким образом, нет, ES6 не имеет такого синтаксиса.

Ответ 4

Увидев, что значение параметра по умолчанию используется только в том случае, если параметр undefined, единственный способ "пропустить" параметр и вернуться к умолчанию - отправить undefined на нем:

call_api('/api/clients/new', function(x){console.log(x)}, undefined, {1:2})

Пример: Babel REPL

Значение query внутри функции будет в этом случае {} (или независимо от того, что вы задали по умолчанию).

Это было бы похоже на то, что Visual Basic делает, когда вы хотите использовать значение параметра по умолчанию, передав пустое значение. (например, sub name(argument 1, , , argument 4))

В противном случае, если вы хотите поддерживать именованные параметры, лучшим компромиссом будет ответ, предоставленный @Benjamin Gruenbaum.


Обновление: вы можете найти эта статья предоставляет опцию с использованием ключевого слова arguments, или еще лучше, вы могли бы итерации по коллекции параметров ES6 ...rest, чтобы имитировать перегруженную функцию в Javascript.