Estaba aprendiendo de un curso esencial de ES6 y probando los parámetros predeterminados y el operador de descanso para las funciones. He definido una función sayHi como se muestra a continuación con parámetros predeterminados y luego restar al operador que no da el resultado deseado.
const sayHi = (greetings, ...names) => { names.forEach(item => { console.log(`${greetings} ${item}`); }); } sayHi('Hi', 'Ahsan', 'Awais', 'Haseeb'); El fragmento anterior funciona como se desea. pero cuando traté de establecer un valor de parámetro predeterminado para la variable de greetings , funciona pero da un resultado no deseado, es decir, la variable de greetings toma el valor 'Ahsan' .
const sayHi = (greetings = ' Hi', ...names) => { names.forEach(item => { console.log(`${greetings} ${item}`); }); } sayHi('Ahsan', 'Awais', 'Haseeb');¿Hay alguna manera de establecer parámetros predeterminados en funciones como la anterior antes del operador de descanso?
No puedes, no. El parámetro resto solo recoge el "resto" de los parámetros no consumidos por ningún parámetro formal anterior, por lo que greeting siempre recibirá el valor del primer argumento.
Por separado, dado que tanto los nombres como el saludo tienen el mismo tipo, no puede proporcionar ningún valor predeterminado si desea aceptar los nombres de esa manera.
Un par de opciones para ti:
Podría tener una función que acepte el saludo y devuelva una función que lo use con lo que sea que le pase:
const greet = (greeting = "Hi") => (...names) => { for (const name of names) { console.log(`${greeting} ${name}`); } }; greet()("Ahsan", "Awais", "Haseeb"); greet("Hello")("Ahsan", "Awais", "Haseeb");Tenga en cuenta cómo lo llamamos:
greet()("Ahsan", "Awais", "Haseeb"); greet() crea la función utilizando el saludo predeterminado. Luego llamamos a esa función usando ("Ahsan", "Awais", "Haseeb") en ella. greet("Hello") crea una función que usa el saludo "Hello" (y luego lo llamamos).
(También me tomé la libertad de usar for..of en lugar de forEach , pero es una cuestión de estilo).
Otra opción es aceptar los nombres como una matriz. De esa forma, podemos saber dentro de la función si recibimos un saludo o no:
const greet = (greeting, names) => { 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"]);solo tiene que pasar indefinido en el primer parámetro para omitir el argumento opcional
piénsalo así greetings = typeof greetings != 'undefined' ? greetings : "hi" , lo que significa que verifique el valor de los greetings y, si no está definido (no proporcionado), use el valor predeterminado
editar: aquí está el fragmento de código
const sayHi = (greetings = ' Hi', ...names) => { names.forEach(item => { console.log(`${greetings} ${item}`); }); } sayHi(undefined, 'Ahsan', 'Awais', 'Haseeb');