Skip to content

Commit c56b8e3

Browse files
committed
update module 2 default parameters
1 parent 9c908b5 commit c56b8e3

2 files changed

Lines changed: 81 additions & 50 deletions

File tree

02-languages/02-apuntes/01-javascript/107 default arguments.js

Lines changed: 0 additions & 50 deletions
This file was deleted.
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
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

Comments
 (0)