2017-01-15 2 views
2

У меня есть вопрос, связанный с использованием функций es6, которые имеют параметры по умолчанию.Передача не определена как параметр в функции (ES6)

Вот пример:

const add = (a = 1, b = 2) => a + b; 

Как вы можете видеть, a и b по умолчанию 1 и 2 соответственно.

со значениями по умолчанию, можно вызвать функцию без каких-либо параметров, как так:

add(); // 3 

можно также опустить параметр b:

add(2); // 4 

И опустить параметр a, я могу передать в undefined:

add(undefined, 3); // 4 

Мой вопрос :

Неправильно ли передавать в undefined в качестве первого параметра функцию для вызова функции с первым параметром по умолчанию, который в данном случае равен 1?

+1

Это назначение предварительно определенных переменных. На мой взгляд, это совершенно нормально. – fubbe

+0

, если у него нет смысла не указывать его по умолчанию (то есть, пусть по умолчанию он «неопределен») – sweaver2112

ответ

1

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

feed_dict = {x: 1, y: 2} 

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

const add = (dict) => { 
for (var keys in dict) { 
    sum += dict[keys] 
} 
return sum 

add(feed_dict) 
+0

Спасибо! Я опубликовал ответ с этой реализацией. – Matthew

+1

Если вы открыты для этого многого рефакторинга, есть мало оснований использовать объект, когда вы можете просто использовать массив. Этот ответ также не объявлял «ключи» в любом месте, а использование «for ... in» - это плохая идея, поскольку перечислимые реквизиты в цепочке прототипов могут вызвать проблемы. – loganfsmyth

1

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

Не существует стандартного способа установить только значение для второго параметра, например. add({b: 5}), если вы не переопределите функцию для взятия объекта, поэтому переход к undefined представляется единственным вариантом.

MDN делает это в своей документации here, см. «Примеры/Передача не определена».

+0

Да, я понимаю, почему это не лучший выбор. В моем фактическом коде у меня есть функция 'const showPrompt = (duration = 0.667, timeout = 0) => ...'. Это на самом деле создатель действия Redux, который отправляет функцию для отображения части моего пользовательского интерфейса и имеет setTimeout для 'timeout'. Большую часть времени я нахожусь в той же продолжительности, поэтому просто хотел пропустить этот первый параметр. – Matthew

2

JonathanMitchell Благодаря предложившего параметр объекта.

const add = (args = {}) => { 
    const a = args.a || 1; 
    const b = args.b || 2; 
    return a + b; 
} 

Примеры:

add(); // 3 
add({a: 2}) // 4 
add({b: 3}); // 5 

Edit:

loganfsmyth предложили гораздо лучшее решение.

с использованием || это плохая форма, потому что если вы пройдете 0, она также будет использовать значение по умолчанию.

А лучше и более компактное решение:

const add = ({a = 1, b = 2} = {}) => a + b 

Logan используется deconstruction assignment (см значения «по умолчанию») ES6, чтобы назначить a и b значения по умолчанию в случае, если такие параметры оценки для undefined.

+1

Хороший ответ, определенно разумно использовать операцию ИЛИ, чтобы убедиться, что вы не ошибаетесь, как видно из args.a || 1 в этой реализации. – JonathanMitchell

+1

Если вы хотите установить значения по умолчанию, вы можете сделать '({a = 1, b = 2} = {}) => a + b', используя' || '- плохая форма, потому что если вы передадите' 0', она также будет использовать по умолчанию. – loganfsmyth

+0

@loganfsmyth Это работает намного лучше, и это более компактно. Поучаствуйте в объяснении '{a = 1, b = 2} = {}'? Я знаком с деконструкцией в es6, но я изо всех сил пытаюсь обвести голову вокруг этого. Или это не деконструкция? – Matthew