1+ ///-- DEFAULT PARAMETERS *************************************************************************
2+
3+ // OBJETOS
4+
5+ // A partir de ES6 podemos asignar valores por defecto a los parámetros de una función:
6+ const greet = ( name = "Unknown" ) => console . log ( `Hello, ${ name } !` ) ;
7+
8+ greet ( ) ; // "Hello, Unknown!"
9+ greet ( "Jake" ) ; // "Hello, Jake!"
10+
11+ // Los valores por defecto se aplican para argumentos explicita o implicitamente undefined
12+ // pero null se excluye:
13+ greet ( undefined ) ; // "Hello, Unknown!"
14+ greet ( null ) ; // "Hello, null!"
15+
16+ // DESTRUCTURING ASSIGNMENT en OBJETOS
17+
18+ // Se pueden aplicar valores por defecto a variables asignadas por destructuring
19+ const greet = ( { name = "Unknown" } ) => console . log ( `Hello, ${ name } !` ) ;
20+ greet ( { age : 24 } ) ; // "Hello, Unknown!"
21+ greet ( { name : "Carl" } ) ; // "Hello, Carl!"
22+ greet ( { } ) ; // "Hello, Unknown!"
23+
24+ // PREGUNTA: Pero ¿que creeis que pasaría si llamo a la función sin argumento?
25+ // ¿o con argumento null?
26+
27+ greet ( ) ; // ⚠ Si no inicializamos el parametro a {} esto daría TypeError.
28+
29+ // Para evitar esos errores tenemos que inicializar también el parámetro completo como objeto
30+ // vacío, no solo su propiedad name.
31+ const greet = ( { name = "Unknown" } = { } ) => console . log ( `Hello, ${ name } !` ) ;
32+
33+ greet ( ) ; // Hello, Unknown! Ahora si!
34+
35+ // Este sería el único caso todavía problemático.
36+ // Al ser null un objeto no se toma la inicialización por defecto, el problema es que no se puede
37+ // hacer destructuring sobre null.
38+ greet ( null ) ; // ⚠ Uncaught TypeError.
39+
40+ // No obstante, ahora que ya conocemos el destructuring y el operador nullish coalescing, tenemos
41+ // una alternativa igual de elegante y concisa. La solución para cubrirnos todos los casos sería
42+ // la siguiente:
43+ const greet = user => {
44+ const { name = "Unknown" } = user ?? { } ;
45+ console . log ( `Hello, ${ name } !` ) ;
46+ }
47+ greet ( { } ) ; // "Hello, Unknown!"
48+ greet ( ) ; // "Hello, Unknown!"
49+ greet ( null ) ; // "Hello, Unknown!"
50+
51+ // Si por último quisieramos considerar posibles casos donde name sea null, se puede
52+ // reemplazar el destructuring por una combinación de optional chaining y nullish coalescing:
53+ const greet = user => {
54+ const name = user ?. name ?? "Unknown" ;
55+ console . log ( `Hello, ${ name } !` ) ;
56+ } ;
57+
58+ greet ( { name : null } ) ; // Hello, Unknown!
59+
60+ // ARRAYS
61+
62+ // Ejemplo con arrays:
63+ const sumDice = ( [ d1 = 0 , d2 = 0 ] = [ ] ) => d1 + d2 ;
64+ console . log ( sumDice ( ) ) ; // 0
65+ console . log ( sumDice ( [ ] ) ) ; // 0
66+ console . log ( sumDice ( [ 3 ] ) ) ; // 3
67+
68+ // CURIOSIDAD
69+
70+ // Los inicializadores por defecto de los parámetros de una función pueden ser expresiones.
71+ // Además estas expresiones viven en un ámbito propio, superior al ámbito de función. Esto
72+ // permite algo curioso:
73+ // Los parámetros a la izquierda están disponibles para las expresiones de inicialización
74+ // por defecto de los parámetros a la derecha.
75+
76+ const greetWithMessage = ( name = "Unknown" , message = `Nice to see you ${ name } ` ) =>
77+ console . log ( `Hello, ${ name } !` , message ) ;
78+
79+ greetWithMessage ( "Javi" , "Good morning!" ) ; // Hello, Javi! Good morning!
80+ greetWithMessage ( "Javi" ) ; // Hello, Javi! Nice to see you Javi
81+ greetWithMessage ( ) ; // Hello, Unknown! Nice to see you Unknown
0 commit comments