Можно ли задать параметры по умолчанию с помощью оператора rest

#javascript #ecmascript-6 #parameters

#язык JavaScript #ecmascript-6 #параметры

Вопрос:

Я учился на основном курсе ES6 и пробовал параметры по умолчанию и оператор rest для функций. Я определил функцию sayHi , как показано ниже, с параметрами по умолчанию, а затем оператором rest, который не дает желаемого результата.

 const sayHi = (greetings, ...names) =gt; {   names.forEach(item =gt; {  console.log(`${greetings} ${item}`);  });  }  sayHi('Hi', 'Ahsan', 'Awais', 'Haseeb'); 

Приведенный выше фрагмент работает по желанию. но когда я попытался установить значение параметра по умолчанию для greetings переменной, это работает, но дает нежелательный результат, т. е. Значение 'Ahsan' принимается greetings переменной.

 const sayHi = (greetings = ' Hi', ...names) =gt; {   names.forEach(item =gt; {  console.log(`${greetings} ${item}`);  });  }  sayHi('Ahsan', 'Awais', 'Haseeb'); 

Есть ли способ установить параметры по умолчанию в функции, как указано выше, перед оператором rest?

Ответ №1:

Ты не можешь, нет. Параметр rest принимает только «остальные» параметры, не использованные никакими предыдущими формальными параметрами, поэтому greeting всегда будет получать значение первого аргумента.

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

Несколько вариантов для вас:

Функция карри

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

 const greet = (greeting = "Hi") =gt; (...names) =gt; {  for (const name of names) {  console.log(`${greeting} ${name}`);  } };  greet()("Ahsan", "Awais", "Haseeb"); greet("Hello")("Ahsan", "Awais", "Haseeb"); 

Обратите внимание, как мы это назвали:

 greet()("Ahsan", "Awais", "Haseeb");  

greet() создает функцию, используя приветствие по умолчанию. Затем мы вызываем эту функцию, используя ("Ahsan", "Awais", "Haseeb") ее. greet("Hello") создает функцию, которая использует приветствие "Hello" (а затем мы ее вызываем).

(Я также взял на себя смелость использовать for..of вместо forEach этого , но это вопрос стиля.)

Принимайте имена в виде массива

Другой вариант-принять имена в виде массива. Таким образом, мы можем определить внутри функции, получили ли мы приветствие или нет:

 const greet = (greeting, names) =gt; {  if (Array.isArray(greeting)) {  names = greeting;  greeting = "Hi";  }  for (const name of names) {  console.log(`${greeting} ${name}`);  } };  greet(["Ahsan", "Awais", "Haseeb"]); greet("Hello", ["Ahsan", "Awais", "Haseeb"]); 

Комментарии:

1. 1-я альтернатива кажется намного чище. 1

Ответ №2:

вам просто нужно передать неопределенное в 1-м параметре, чтобы пропустить необязательный аргумент
, подумайте об этом так, что это greetings = typeof greetings != 'undefined' ? greetings : "hi" означает, что проверьте значение greetings и, если оно не определено (не указано), используйте значение по умолчанию
изменить: вот фрагмент кода

 const sayHi = (greetings = ' Hi', ...names) =gt; {   names.forEach(item =gt; {  console.log(`${greetings} ${item}`);  });  }  sayHi(undefined, 'Ahsan', 'Awais', 'Haseeb');  

Комментарии:

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

2. я только что отредактировал ответ

3. Но что делать, если вы хотите указать «Приветствие», «Привет» или «Бонжур» в качестве значения. Я не думаю, что это сработает в данном случае.

4. @Ahsan — Это было бы. Для значения по умолчанию вам потребуется sayHi(undefined, "Ahsan", "Awais", "Haseeb") , что , опять же, довольно легко ошибиться. Ибо "Hello" так оно и было бы sayHi("Hello", "Ahsan", "Awais", "Haseeb") .

5. да, вы можете здесь: js sayHi(undefined, 'Ahsan', 'Awais', 'Haseeb') // def sayHi('Bonjour', 'Ahsan', 'Awais', 'Haseeb') // customized вы это имеете в виду??