├── Readme.md
├── Sesion-01
├── Ejemplo-01
│ ├── Readme.md
│ └── assets
│ │ └── typeof.png
├── Ejemplo-02
│ ├── Readme.md
│ └── assets
│ │ ├── operators-1.png
│ │ └── operators-2.png
├── Ejemplo-03
│ ├── Readme.md
│ └── assets
│ │ └── precedence.png
├── Readme.md
├── Reto-01
│ └── Readme.md
└── assets
│ ├── back-end.png
│ ├── companies.jpg
│ ├── front-end.png
│ ├── most-popular-technologies.png
│ └── variables.png
├── Sesion-02
├── Ejemplo-01
│ ├── Readme.md
│ └── assets
│ │ ├── if-else.png
│ │ └── if.png
├── Ejemplo-02
│ ├── Readme.md
│ └── assets
│ │ └── switch.png
├── Ejemplo-03
│ ├── Readme.md
│ └── assets
│ │ └── for-loop.png
├── Readme.md
├── Reto-01
│ └── Readme.md
├── Reto-02
│ └── Readme.md
├── Reto-03
│ └── Readme.md
└── Soluciones
│ └── Readme.md
├── Sesion-03
├── Ejemplo-01
│ ├── Readme.md
│ └── assets
│ │ └── doubleNumbers.png
├── Ejemplo-02
│ ├── Readme.md
│ └── assets
│ │ └── keyValuePairs.png
├── Ejemplo-03
│ ├── Readme.md
│ └── assets
│ │ └── destructuring.png
├── Readme.md
├── Reto-01
│ └── Readme.md
├── Reto-02
│ └── Readme.md
├── Reto-03
│ └── Readme.md
├── Soluciones
│ └── Readme.md
└── assets
│ └── array.png
├── Sesion-04
├── Ejemplo-01
│ ├── Readme.md
│ └── assets
│ │ ├── calculateAge.png
│ │ └── yearsUntilRetirement.png
├── Ejemplo-02
│ ├── Readme.md
│ └── assets
│ │ └── whatDoYouDo.png
├── Ejemplo-03
│ ├── Readme.md
│ └── assets
│ │ ├── IIFE-args.png
│ │ ├── IIFE.png
│ │ └── logName.png
├── Postwork
│ └── Readme.md
├── Readme.md
├── Reto-01
│ └── Readme.md
├── Reto-02
│ └── Readme.md
├── Reto-03
│ └── Readme.md
└── Soluciones
│ └── Readme.md
├── Sesion-05
├── Ejemplo-01
│ └── Readme.md
├── Ejemplo-02
│ ├── Readme.md
│ └── assets
│ │ ├── execution-context-phases.png
│ │ ├── scope-chain-example.png
│ │ ├── scope-chain.png
│ │ ├── this-keyword.png
│ │ └── variable-object.png
├── Ejemplo-03
│ ├── Readme.md
│ └── assets
│ │ └── this-arrow.png
├── Readme.md
├── Reto-01
│ └── Readme.md
├── Reto-02
│ └── Readme.md
├── Reto-03
│ └── Readme.md
├── Soluciones
│ └── Readme.md
└── assets
│ ├── execution-context.png
│ ├── this-browser.png
│ └── this-node.png
├── Sesion-06
├── Ejemplo-01
│ ├── Readme.md
│ └── assets
│ │ ├── function-constructor.png
│ │ └── instances.png
├── Ejemplo-02
│ ├── Readme.md
│ └── assets
│ │ └── inheritance.png
├── Ejemplo-03
│ ├── Readme.md
│ └── assets
│ │ ├── prototype-2.png
│ │ ├── prototype-3.png
│ │ └── prototype.png
├── Readme.md
├── Reto-01
│ └── Readme.md
├── Reto-02
│ └── Readme.md
├── Reto-03
│ └── Readme.md
├── Soluciones
│ └── Readme.md
└── assets
│ ├── constructor.png
│ ├── inheritance.png
│ ├── instances.png
│ └── prototype-chain.png
├── Sesion-07
├── Ejemplo-01
│ ├── Readme.md
│ └── assets
│ │ ├── immutable.png
│ │ └── mutable.png
├── Ejemplo-02
│ ├── Readme.md
│ └── assets
│ │ └── pure-function.png
├── Ejemplo-03
│ ├── Readme.md
│ └── assets
│ │ └── sum-digits.png
├── Readme.md
├── Reto-01
│ └── Readme.md
├── Reto-02
│ └── Readme.md
├── Reto-03
│ └── Readme.md
├── Soluciones
│ └── Readme.md
└── assets
│ └── pure-function.png
├── Sesion-08
├── Ejemplo-01
│ ├── Readme.md
│ └── assets
│ │ ├── npm-init.png
│ │ └── npm-run-build.png
├── Ejemplo-02
│ ├── Readme.md
│ └── assets
│ │ └── dev-server.png
├── Ejemplo-03
│ └── Readme.md
├── Postwork
│ └── Readme.md
├── Readme.md
├── Reto-01
│ └── Readme.md
├── Reto-02
│ └── Readme.md
├── Soluciones
│ └── Readme.md
└── assets
│ ├── babel.png
│ └── webpack.png
├── Sesion-09
├── Ejemplo-01
│ ├── Readme.md
│ └── assets
│ │ ├── document-1.png
│ │ └── document-2.png
├── Ejemplo-02
│ ├── Readme.md
│ └── assets
│ │ ├── nodes.png
│ │ └── paragraphs.png
├── Ejemplo-03
│ ├── Readme.md
│ └── assets
│ │ └── create-nodes.png
├── Readme.md
├── Reto-01
│ └── Readme.md
├── Reto-02
│ └── Readme.md
├── Soluciones
│ └── Readme.md
└── assets
│ ├── document.png
│ ├── links.png
│ └── tree.png
├── Sesion-10
├── Ejemplo-01
│ ├── Readme.md
│ └── assets
│ │ └── colors.gif
├── Ejemplo-02
│ ├── Readme.md
│ └── assets
│ │ └── changing-text.gif
├── Ejemplo-03
│ ├── Readme.md
│ └── assets
│ │ └── pressing-keys.gif
├── Readme.md
├── Reto-01
│ ├── Readme.md
│ └── assets
│ │ └── balloon.gif
├── Reto-02
│ ├── Readme.md
│ └── assets
│ │ └── modal.gif
├── Reto-03
│ ├── Readme.md
│ └── assets
│ │ └── tabs.gif
└── Soluciones
│ └── Readme.md
├── Sesion-11
├── Ejemplo-01
│ ├── Readme.md
│ └── assets
│ │ └── callback-hell.png
├── Ejemplo-02
│ ├── Readme.md
│ └── assets
│ │ └── chaining-promises.png
├── Readme.md
├── Reto-01
│ └── Readme.md
├── Reto-02
│ └── Readme.md
├── Reto-03
│ └── Readme.md
├── Soluciones
│ └── Readme.md
└── assets
│ └── control-io.svg
└── Sesion-12
├── Ejemplo-01
├── Readme.md
└── assets
│ └── nasa-api.png
├── Ejemplo-02
├── Readme.md
└── assets
│ └── giphy.png
├── Postwork
└── Readme.md
├── Readme.md
├── Reto-01
├── Readme.md
└── assets
│ └── challenge-1.png
├── Reto-02
├── Readme.md
└── assets
│ └── challenge-2.png
├── Reto-03
└── Readme.md
├── Soluciones
└── Readme.md
└── assets
├── api.png
└── rest-api.png
/Readme.md:
--------------------------------------------------------------------------------
1 |
2 | ## Módulo: Programación con JavaScript
3 |
4 | ### Objetivo
5 |
6 | Conocer los fundamentos del lenguaje para poder interactuar con la web.
7 |
8 | ### Organización Del Módulo
9 |
10 | - [Sesión 1: Fundamentos de JS](./Sesion-01)
11 |
12 | - [Sesión 2: Controles de flujo](./Sesion-02)
13 |
14 | - [Sesión 3: Objetos y arreglos](./Sesion-03)
15 |
16 | - [Sesión 4: Funciones](./Sesion-04)
17 |
18 | - [Sesión 5: Scope y this](./Sesion-05)
19 |
20 | - [Sesión 6: Programación orientada a objetos](./Sesion-06)
21 |
22 | - [Sesión 7: Programación funcional](./Sesion-07)
23 |
24 | - [Sesión 8: Webpack y Babel](./Sesion-08)
25 |
26 | - [Sesión 9: Manipulación del DOM](./Sesion-09)
27 |
28 | - [Sesión 10: Eventos en el DOM](./Sesion-10)
29 |
30 | - [Sesión 11: Programación Asíncrona](./Sesion-11)
31 |
32 | - [Sesión 12: API](./Sesion-12)
33 |
--------------------------------------------------------------------------------
/Sesion-01/Ejemplo-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 01`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 1: Tipos de datos y operador `typeof`
6 |
7 | ### Objetivo
8 |
9 | Usaremos el operador `typeof` para distinguir los distintos tipos de datos de manera práctica.
10 |
11 | #### Requisitos
12 |
13 | Puedes hacer el siguiente ejemplo directo en la consola de Chrome.
14 |
15 | #### Desarrollo
16 |
17 | ```javascript
18 | // Numbers
19 | typeof 10; // "number"
20 | typeof 12.5; // "number"
21 | typeof 2.5e+6; // "number"
22 | typeof Infinity; // "number"
23 | typeof NaN; // "number"
24 |
25 | // Strings
26 | typeof ' '; // "string" - Espacios en blanco cuentan como caracteres
27 | typeof 'Hello World'; // "string"
28 | typeof '12'; // "string" - Números dentro de comillas son strings
29 |
30 | // Booleans
31 | typeof true; // "boolean"
32 | typeof false; // "boolean"
33 |
34 | // Undefined
35 | typeof undefined; // "undefined"
36 |
37 | var name;
38 | typeof name; // "undefined" - Aún no se asigna un valor
39 |
40 | // Null
41 | typeof null; // "object"
42 | ```
43 |
44 | > Cuando usamos el operador `typeof` con `null` obtenemos como resultado `object` en lugar de `null`. Esto es
45 | > considerado como un bug en JavaScript que está presente desde su creación, debido a que hay mucho código escrito
46 | > tomando en cuenta este comportamiento, la idea de corregir este bug fue abandonada, ya que causaría más problemas.
47 |
48 | 
49 |
--------------------------------------------------------------------------------
/Sesion-01/Ejemplo-01/assets/typeof.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-01/Ejemplo-01/assets/typeof.png
--------------------------------------------------------------------------------
/Sesion-01/Ejemplo-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 01`](../Readme.md) > `Ejemplo 02`
2 |
3 | ---
4 |
5 | ## Ejemplo 2: Operadores
6 |
7 | ### Objetivo
8 |
9 | Practicar los distintos operadores básicos que proporciona JavaScript.
10 |
11 | #### Requisitos
12 |
13 | Puedes hacer el siguiente ejemplo directo en la consola de Chrome.
14 |
15 | #### Desarrollo
16 |
17 | ```javascript
18 | var a = 5;
19 | var b = 10;
20 | var c = 15;
21 |
22 | a + b; // 15
23 |
24 | b - a; // 5
25 |
26 | a * c; // 75
27 |
28 | c / a; // 3
29 |
30 | b % a; // 0
31 | ```
32 |
33 | 
34 |
35 | Este tipo de operaciones no cambia el valor de las variables `a`, `b` y `c` ya que no estamos usando el operador de asignación `=`. Sin embargo, los operadores de incremento y decremento sí cambian el valor de las variables.
36 |
37 | ```javascript
38 | var a = 5;
39 | var b = 10;
40 | var c = 15;
41 |
42 | c++; // 16
43 |
44 | b--; // 9
45 | ```
46 |
47 | 
48 |
49 | > Es bueno aclarar sobre la separación de cada línea en JavaScript con punto y coma `;`. JavaScript no requiere estrictamente usar puntos y comas al final de cada línea, sin embargo vale la pena colocarlos. Ahora, en algún punto, cuando alcances un mejor nivel, podrías considerarlos opcional mientras cumplas con ciertos criterios. [Te compartimos un artículo que habla sobre este tema.](https://flaviocopes.com/javascript-automatic-semicolon-insertion/)
50 |
--------------------------------------------------------------------------------
/Sesion-01/Ejemplo-02/assets/operators-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-01/Ejemplo-02/assets/operators-1.png
--------------------------------------------------------------------------------
/Sesion-01/Ejemplo-02/assets/operators-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-01/Ejemplo-02/assets/operators-2.png
--------------------------------------------------------------------------------
/Sesion-01/Ejemplo-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 01`](../Readme.md) > `Ejemplo 03`
2 |
3 | ---
4 |
5 | ## Ejemplo 3: Precedencia de operadores
6 |
7 | ### Objetivo
8 |
9 | Practicar el orden de precedencia de los operadores en JavaScript.
10 |
11 | #### Requisitos
12 |
13 | Puedes hacer el siguiente ejemplo directo en la consola de Chrome.
14 |
15 | #### Desarrollo
16 |
17 | ```javascript
18 | var a = 5;
19 | var b = 10;
20 | var c = 15;
21 |
22 | a + b * c; // 155
23 |
24 | (a + b) * c; // 255
25 |
26 | b / a * c; // 30
27 |
28 | b / (a * c); // 0.1333
29 |
30 | a - b + c; // 10
31 |
32 | a - (b + c); // -20
33 | ```
34 |
35 | Cuando hay distintos operadores con el mismo orden de precedencia se sigue el orden de asociatividad, que puede ir de izquierda a derecha o derecha a izquierda dependiendo del tipo de operador. El uso de paréntesis nos permite controlar el orden de precedencia agrupando las operaciones que queremos que se realicen primero.
36 |
37 | 
38 |
--------------------------------------------------------------------------------
/Sesion-01/Ejemplo-03/assets/precedence.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-01/Ejemplo-03/assets/precedence.png
--------------------------------------------------------------------------------
/Sesion-01/Reto-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 01`](../Readme.md) > `Reto 01`
2 |
3 | ---
4 |
5 | ## Reto 1: Precedencia de operadores
6 |
7 | ### Objetivo
8 |
9 | Practicar el orden de precedencia de los operadores en JavaScript.
10 |
11 | #### Requisitos
12 |
13 | Puedes hacer el siguiente ejemplo directo en la consola de Chrome.
14 |
15 | #### Desarrollo
16 |
17 | Intenta calcular el resultado de las siguientes operaciones antes de ver el resultado en la consola.
18 |
19 | ```javascript
20 | var a = 5;
21 | var b = 10;
22 | var c = 15;
23 |
24 | (3 + b) * c / a * 2;
25 |
26 | ((a + b * c) / 5) * 2;
27 |
28 | b / a + 2 * c;
29 |
30 | (a + b + c / c) * a;
31 |
32 | ((3 * a) / c) + a + b + c;
33 |
34 | a - (b + c) * a / 1;
35 | ```
36 |
37 | Puedes consultar la tabla de precedencia si no estás seguro de qué operación hacer primero.
38 |
39 |
40 | Solución
41 |
42 | ```javascript
43 | (3 + b) * c / a * 2; // 78
44 |
45 | ((a + b * c) / 5) * 2; // 62
46 |
47 | b / a + 2 * c; // 32
48 |
49 | (a + b + c / c) * a; // 80
50 |
51 | ((3 * a) / c) + a + b + c; // 31
52 |
53 | a - (b + c) * a / 1; // -120
54 | ```
55 |
56 |
--------------------------------------------------------------------------------
/Sesion-01/assets/back-end.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-01/assets/back-end.png
--------------------------------------------------------------------------------
/Sesion-01/assets/companies.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-01/assets/companies.jpg
--------------------------------------------------------------------------------
/Sesion-01/assets/front-end.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-01/assets/front-end.png
--------------------------------------------------------------------------------
/Sesion-01/assets/most-popular-technologies.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-01/assets/most-popular-technologies.png
--------------------------------------------------------------------------------
/Sesion-01/assets/variables.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-01/assets/variables.png
--------------------------------------------------------------------------------
/Sesion-02/Ejemplo-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 02`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 1: Primeras condicionales
6 |
7 | ### Objetivo
8 |
9 | Implementar operadores lógicos y condicionales tipo `if`/`else`.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-2.js` que es donde se trabajarán los ejemplos de esta
24 | sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
25 |
26 | #### Desarrollo
27 |
28 | Vamos a dar un saludo adecuado dependiendo de la hora.
29 |
30 | ```javascript
31 | const time = 13;
32 | let greeting;
33 |
34 | if (time < 12) {
35 | greeting = "Good morning";
36 | }
37 |
38 | if (time < 20) {
39 | greeting = "Good afternoon";
40 | }
41 |
42 | if (time >= 20) {
43 | greeting = "Good evening";
44 | }
45 |
46 | console.log(greeting) // Good afternoon
47 | ```
48 |
49 | 
50 |
51 | En lugar de tener distintos bloques con la condicional `if`, podemos concatenarlos todos con `else if`.
52 |
53 | ```javascript
54 | const time = 13;
55 | let greeting;
56 |
57 | if (time < 12) {
58 | greeting = "Good morning";
59 | } else if (time < 20) {
60 | greeting = "Good afternoon";
61 | } else if (time >= 20) {
62 | greeting = "Good evening";
63 | }
64 |
65 | console.log(greeting) // Good afternoon
66 | ```
67 |
68 | 
69 |
--------------------------------------------------------------------------------
/Sesion-02/Ejemplo-01/assets/if-else.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-02/Ejemplo-01/assets/if-else.png
--------------------------------------------------------------------------------
/Sesion-02/Ejemplo-01/assets/if.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-02/Ejemplo-01/assets/if.png
--------------------------------------------------------------------------------
/Sesion-02/Ejemplo-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 02`](../Readme.md) > `Ejemplo 02`
2 |
3 | ---
4 |
5 | ## Ejemplo 2: Usando `switch`
6 |
7 | ### Objetivo
8 |
9 | Analizar la sintaxis de `switch` y determinar en qué casos es mejor usarlo en lugar de `if`/`else`.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-2.js` que es donde se trabajarán los ejemplos de esta
24 | sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
25 |
26 | #### Desarrollo
27 |
28 | Vamos a calcular el día de la semana dependiendo de su valor numérico empezando en cero.
29 |
30 | ```javascript
31 | const day = 2;
32 | let text;
33 |
34 | switch (day) {
35 | case 0:
36 | text = "Sunday";
37 | break;
38 | case 1:
39 | text = "Monday";
40 | break;
41 | case 2:
42 | text = "Tuesday";
43 | break;
44 | case 3:
45 | text = "Wednesday";
46 | break;
47 | case 4:
48 | text = "Thursday";
49 | break;
50 | case 5:
51 | text = "Friday";
52 | break;
53 | case 6:
54 | text = "Saturday";
55 | break;
56 | default:
57 | text = "Error";
58 |
59 | }
60 |
61 | console.log(text); // Tuesday
62 | ```
63 |
64 | 
65 |
--------------------------------------------------------------------------------
/Sesion-02/Ejemplo-02/assets/switch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-02/Ejemplo-02/assets/switch.png
--------------------------------------------------------------------------------
/Sesion-02/Ejemplo-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 02`](../Readme.md) > `Ejemplo 03`
2 |
3 | ---
4 |
5 | ## Ejemplo 2: Ciclo `for`
6 |
7 | ### Objetivo
8 |
9 | Analizar el funcionamiento de los ciclos o bucles para ejecutar código que queremos repetir `n` cantidad de veces.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-2.js` que es donde se trabajarán los ejemplos de esta
24 | sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
25 |
26 | #### Desarrollo
27 |
28 | Pensemos que queremos repetir un texto 5 veces y que aparezca en consola:
29 |
30 | ```javascript
31 | console.log("Hello World");
32 | console.log("Hello World");
33 | console.log("Hello World");
34 | console.log("Hello World");
35 | console.log("Hello World");
36 | ```
37 |
38 | Excelente, funcionará y se reflejarán en la consola.
39 |
40 | Ahora bien, si te dijera que queremos repetirlo 200 veces, entonces copiar y pegar cada línea se volvería ineficiente (
41 | aparte de odiar al que te dio la instrucción).
42 |
43 | ¿Qué podemos hacer?
44 |
45 | ```javascript
46 | for(let i = 0; i<=200; i++){
47 | console.log("Hello World");
48 | }
49 | ```
50 |
51 | Con esto, obtendremos de retorno los 200 `"Hello World"`.
52 |
53 | 
54 |
--------------------------------------------------------------------------------
/Sesion-02/Ejemplo-03/assets/for-loop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-02/Ejemplo-03/assets/for-loop.png
--------------------------------------------------------------------------------
/Sesion-02/Reto-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 02`](../Readme.md) > `Reto 01`
2 |
3 | ---
4 |
5 | ## Reto 1: Operadores condicionales
6 |
7 | ### Objetivos
8 |
9 | Implementar adecuadamente los operadores condicionales necesarios para controlar el flujo del código.
10 |
11 | #### Requisitos
12 |
13 | Vamos a empezar con el último código generado en el [Ejemplo 01](../Ejemplo-01/):
14 |
15 | ```javascript
16 | const time = 13;
17 | let greeting;
18 |
19 | if (time < 12) {
20 | greeting = "Good morning";
21 | } else if (time < 20) {
22 | greeting = "Good afternoon";
23 | } else if (time >= 20) {
24 | greeting = "Good evening";
25 | }
26 |
27 | console.log(greeting) // Good afternoon
28 | ```
29 |
30 | #### Desarrollo
31 |
32 | Nuestro código tiene una pequeña falla, el día solo tiene 24 horas y no se está tomando en cuenta el caso en el
33 | que `time` sea una hora inválida.
34 |
35 | Utilizando lo visto hasta el momento sobre operadores lógicos y condicionales, debes crear un nuevo mensaje que será
36 | usado cuando `time` sea una hora que no existe en el día.
37 |
--------------------------------------------------------------------------------
/Sesion-02/Reto-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 02`](../Readme.md) > `Reto 02`
2 |
3 | ---
4 |
5 | ## Reto 2: Números pares
6 |
7 | ### Objetivos
8 |
9 | Dominar el uso de ciclos y operadores lógicos.
10 |
11 | #### Requisitos
12 |
13 | `N/A`
14 |
15 | #### Desarrollo
16 |
17 | - Crear un ciclo desde 0 hasta 100.
18 | - Mostrar todos los números pares en este ciclo con `console.log()`
19 |
--------------------------------------------------------------------------------
/Sesion-02/Reto-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 02`](../Readme.md) > `Reto 03`
2 |
3 | ---
4 |
5 | ## Reto 3: Números primos
6 |
7 | ### Objetivos
8 |
9 | Dominar el uso de ciclos y operadores lógicos.
10 |
11 | #### Requisitos
12 |
13 | Haber terminado el [reto 2](../Reto-02).
14 |
15 | #### Desarrollo
16 |
17 | - Crear un ciclo desde 0 hasta 100.
18 | - Mostrar todos los números primos en este ciclo con `console.log()`
19 |
20 | > Un número primo es número natural mayor a 1 que sólo es divisible entre 1 y sí mismo.
21 |
--------------------------------------------------------------------------------
/Sesion-02/Soluciones/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 02`](../Readme.md) > `Soluciones`
2 |
3 | ---
4 |
5 | ## Reto 1: Operadores condicionales
6 |
7 | ```javascript
8 | const time = 27;
9 | let greeting;
10 |
11 | if (time >= 0 && time < 12) {
12 | greeting = "Good morning";
13 | } else if (time >= 12 && time < 20) {
14 | greeting = "Good afternoon";
15 | } else if (time >= 20 && time < 24) {
16 | greeting = "Good evening";
17 | } else {
18 | greeting = "Unknown hour";
19 | }
20 |
21 | console.log(greeting) // Unknown hour
22 | ```
23 |
24 | ---
25 |
26 | ## Reto 2: Números pares
27 |
28 | ```javascript
29 | for(let i = 0; i <= 100; i++) {
30 | if(i % 2 === 0) console.log( i )
31 | }
32 | ```
33 |
34 | ---
35 |
36 | ## Reto 3: Números primos
37 |
38 | ```javascript
39 | for (let counter = 2; counter <= 100; counter++) {
40 | let isPrime = true;
41 |
42 | for (let i = 2; i <= counter; i++) {
43 | if (counter % i === 0 && i !== counter) {
44 | isPrime = false;
45 | }
46 | }
47 |
48 | if(isPrime) console.log(counter)
49 | }
50 | ```
51 |
--------------------------------------------------------------------------------
/Sesion-03/Ejemplo-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 03`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 1: Arreglos
6 |
7 | ### Objetivo
8 |
9 | Distinguir la sintaxis y correcta implementación de los arreglos en JavaScript.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-4.js` que es donde se trabajarán los ejemplos de esta
24 | sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados
25 |
26 | #### Desarrollo
27 |
28 | Vamos a empezar con un arreglo de enteros llamado `numbers` y otro arreglo `doubled`, este segundo arreglo será
29 | inicializado vacío. Nuestro objetivo será llenar `doubled` con todos los números que se encuentren en `numbers`
30 | multiplicados por dos.
31 |
32 | ```javascript
33 | const numbers = [1, 3, 4, 7, 2, 1, 9, 0]
34 |
35 | const doubled = []
36 | ```
37 |
38 | Vamos a recorrer cada elemento del arreglo `numbers` con un ciclo `for`, multiplicando el número por dos y lo
39 | agregaremos al arreglo vacío.
40 |
41 | ```javascript
42 | for(let i = 0; i < numbers.length; i++) {
43 | doubled.push(numbers[i] * 2)
44 | }
45 | ```
46 |
47 | > El método `push()` agrega un nuevo elemento al final de un arreglo. Contrario al método `pop()` que elimina el último
48 | > elemento del arreglo cambiando su longitud.
49 |
50 | Como estamos comparando que `i < numbers.length` el ciclo va a terminar con el último elemento del arreglo.
51 |
52 | ```javascript
53 | const numbers = [1, 3, 4, 7, 2, 1, 9, 0]
54 |
55 | const doubled = []
56 |
57 | for(let i = 0; i < numbers.length; i++) {
58 | doubled.push(numbers[i] * 2)
59 | }
60 |
61 | console.log(numbers) // [1, 3, 4, 7, 2, 1, 9, 0]
62 | console.log(doubled) // [2, 6, 8, 14, 4, 2, 18, 0]
63 | ```
64 |
65 | 
66 |
--------------------------------------------------------------------------------
/Sesion-03/Ejemplo-01/assets/doubleNumbers.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-03/Ejemplo-01/assets/doubleNumbers.png
--------------------------------------------------------------------------------
/Sesion-03/Ejemplo-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 03`](../Readme.md) > `Ejemplo 02`
2 |
3 | ---
4 |
5 | ## Ejemplo 2: Transformando objetos en arreglos
6 |
7 | ### Objetivo
8 |
9 | Distinguir la sintaxis y correcta implementación de los arreglos en JavaScript.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-4.js` que es donde se trabajarán los ejemplos de esta
24 | sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
25 |
26 | #### Desarrollo
27 |
28 | Vamos a convertir un objeto en un arreglo con los pares `[key, value]` por cada propiedad.
29 |
30 | ```javascript
31 | const car = {
32 | brand: 'Nissan',
33 | model: 'Versa',
34 | year: 2020
35 | }
36 |
37 | // [['brand', 'Nissan'], ['model', 'Versa'], ['year', 2020]]
38 | ```
39 |
40 | Para resolver este ejercicio haremos uso del
41 | método [`Object.keys()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys)
42 | el cual retorna un arreglo con el nombre de las propiedades de un objeto.
43 |
44 | ```javascript
45 | const obj = {
46 | a: 'some string',
47 | b: 42,
48 | c: false
49 | };
50 |
51 | console.log( Object.keys(obj) ); // ['a', 'b', 'c']
52 | ```
53 |
54 | Después usaremos un ciclo para ir recorriendo todas las propiedades del objeto e ir obteniendo sus respectivos valores.
55 |
56 | ```javascript
57 | const car = {
58 | brand: 'Nissan',
59 | model: 'Versa',
60 | year: 2020
61 | }
62 |
63 | const keys = Object.keys(car)
64 | const pairs = []
65 |
66 | for(let i = 0; i < keys.length; i++) {
67 | pairs.push( [keys[i], car[keys[i]]] )
68 | }
69 |
70 | console.log(pairs)
71 |
72 | // [['brand', 'Nissan'], ['model', 'Versa'], ['year', 2020]]
73 | ```
74 |
75 | 
76 |
--------------------------------------------------------------------------------
/Sesion-03/Ejemplo-02/assets/keyValuePairs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-03/Ejemplo-02/assets/keyValuePairs.png
--------------------------------------------------------------------------------
/Sesion-03/Ejemplo-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 03`](../Readme.md) > `Ejemplo 02`
2 |
3 | ---
4 |
5 | ## Ejemplo 3: Object Destructuring
6 |
7 | ### Objetivo
8 |
9 | Extraer propiedades de un objeto mediante asignación por destructuring.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-4.js` que es donde se trabajarán los ejemplos de esta
24 | sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
25 |
26 | #### Desarrollo
27 |
28 | Si la propiedad que queremos extraer no existe en el objeto se retorna `undefined`. Podemos usar asignar un valor por
29 | default en caso de no encontrar la propiedad que buscamos. Para esto debemos asignar (`=`) un valor dentro de las llaves.
30 |
31 | ```javascript
32 | const person = {
33 | firstName: 'John',
34 | lastName: 'Doe'
35 | };
36 |
37 | const { firstName, country = 'Unknown' } = person;
38 |
39 | console.log(firstName, country); // John Unknown
40 | ```
41 |
42 | En ocasiones no queremos usar el mismo nombre de la propiedad del objeto, por ejemplo cuando estamos consumiendo
43 | información de un recurso externo o de una base de datos. Usando `:` podemos renombrar una variable.
44 |
45 | ```javascript
46 | const person = {
47 | firstName: 'John',
48 | lastName: 'Doe'
49 | };
50 |
51 | const { firstName: name } = person;
52 |
53 | console.log(name); // John
54 | ```
55 |
56 | La asignación de un valor default y el cambio de nombre de la variable se pueden mezclar para casos de usos un poco más
57 | complejos.
58 |
59 | ```javascript
60 | const person = {
61 | firstName: 'John',
62 | lastName: 'Doe'
63 | };
64 |
65 | const { firstName: name, country: ctry = 'Unknown'} = person;
66 |
67 | console.log(name, ctry); // John Unknown
68 | ```
69 |
70 | 
71 |
--------------------------------------------------------------------------------
/Sesion-03/Ejemplo-03/assets/destructuring.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-03/Ejemplo-03/assets/destructuring.png
--------------------------------------------------------------------------------
/Sesion-03/Reto-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 04`](../Readme.md) > `Reto 01`
2 |
3 | ---
4 |
5 | ## Reto 1: Calcular promedio
6 |
7 | ### Objetivos
8 |
9 | Implementar adecuadamente los conceptos vistos hasta el momento sobre ciclos y arreglos para solucionar un problema.
10 |
11 | #### Requisitos
12 |
13 | `N/A`
14 |
15 | #### Desarrollo
16 |
17 | Dado el arreglo `numbers` compuesto solamente por números enteros mayores que cero, obtener el promedio de todos sus
18 | elementos.
19 |
20 | ```javascript
21 | const numbers = [5, 3, 4, 7, 2, 1, 9, 7, 7]
22 | ```
23 |
24 | > Para calcular el promedio se divide la suma de todos los elementos entre el número total de elementos.
25 |
--------------------------------------------------------------------------------
/Sesion-03/Reto-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 03`](../Readme.md) > `Reto 02`
2 |
3 | ---
4 |
5 | ## Reto 2: Arreglo a objeto
6 |
7 | ### Objetivos
8 |
9 | Implementar adecuadamente los conceptos vistos hasta el momento de arreglos y ciclos para solucionar un problema.
10 |
11 | #### Requisitos
12 |
13 | En el ejemplo 2 transformamos un objeto a un arreglo con los pares `[key, value]` por cada propiedad y valor del objeto.
14 |
15 | ```javascript
16 | const car = {
17 | brand: 'Nissan',
18 | model: 'Versa',
19 | year: 2020
20 | }
21 |
22 | const keys = Object.keys(car)
23 | const pairs = []
24 |
25 | for(let i = 0; i < keys.length; i++) {
26 | pairs.push( [keys[i], car[keys[i]]] )
27 | }
28 |
29 | console.log(pairs)
30 |
31 | // [['brand', 'Nissan'], ['model', 'Versa'], ['year', 2020]]
32 | ```
33 |
34 | #### Desarrollo
35 |
36 | Para este reto vamos a realizar lo opuesto. Es decir, tomar un arreglo con pares `[key, value]` y crear un objeto con
37 | sus respectivas propiedades y valores.
38 |
39 | ```javascript
40 | const car = [['brand', 'Nissan'], ['model', 'Versa'], ['year', 2020]]
41 | ```
42 |
--------------------------------------------------------------------------------
/Sesion-03/Reto-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 03`](../Readme.md) > `Reto 03`
2 |
3 | ---
4 |
5 | ## Reto 3: Objetos anidados
6 |
7 | ### Objetivos
8 |
9 | Extraer propiedades de un objeto anidado mediante asignación por destructuring.
10 |
11 | #### Requisitos
12 |
13 | `N/A`
14 |
15 | #### Desarrollo
16 |
17 | Dado el siguiente objeto:
18 |
19 | ```javascript
20 | const person = {
21 | firstName: 'John',
22 | lastName: 'Doe',
23 | links: {
24 | web: {
25 | blog: 'https://johndoe.com'
26 | },
27 | social: {
28 | facebook: 'https://facebook.com/john.doe',
29 | instagram: 'https://instagram.com/john.doe'
30 | }
31 | }
32 | }
33 | ```
34 |
35 | Extraer las URLs de `facebook` e `instagram` y renombrar las variables por `fb` e `ig` respectivamente.
36 |
--------------------------------------------------------------------------------
/Sesion-03/Soluciones/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 03`](../Readme.md) > `Soluciones`
2 |
3 | ---
4 |
5 | ## Reto 1: Calcular promedio
6 |
7 | ```javascript
8 | const numbers = [5, 3, 4, 7, 2, 1, 9, 7, 7]
9 | let sum = 0;
10 |
11 | for (const num of numbers) {
12 | sum += num; // Same as: sum = sum + numbers[i];
13 | }
14 |
15 | const average = sum / numbers.length
16 |
17 | console.log(average) // 5
18 | ```
19 |
20 | ---
21 |
22 | ## Reto 2: Arreglo a objeto
23 |
24 | ```javascript
25 | const car = [['brand', 'Nissan'], ['model', 'Versa'], ['year', 2020]]
26 | const obj = {}
27 |
28 | for(const keyValue of car) {
29 | obj[keyValue[0]] = keyValue[1]
30 | }
31 |
32 | console.log(obj)
33 | ```
34 |
35 | ---
36 |
37 | ## Reto 3: Objetos anidados
38 |
39 | ```javascript
40 | const person = {
41 | firstName: 'John',
42 | lastName: 'Doe',
43 | links: {
44 | web: {
45 | blog: 'https://johndoe.com'
46 | },
47 | social: {
48 | facebook: 'https://facebook.com/john.doe',
49 | instagram: 'https://instagram.com/john.doe'
50 | }
51 | }
52 | }
53 |
54 | const { facebook: fb, instagram: ig } = person.links.social
55 | ```
56 |
--------------------------------------------------------------------------------
/Sesion-03/assets/array.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-03/assets/array.png
--------------------------------------------------------------------------------
/Sesion-04/Ejemplo-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 04`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 1: Funciones
6 |
7 | ### Objetivo
8 |
9 | Distinguir la sintaxis de las funciones y su correcta implementación.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-3.js` que es donde se trabajarán los ejemplos de esta
24 | sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
25 |
26 | #### Desarrollo
27 |
28 | Vamos a dar calcular la edad mediante una función que reciba el año de nacimiento.
29 |
30 | ```javascript
31 | function calculateAge(birthYear) {
32 | const age = 2020 - birthYear;
33 | return age;
34 | }
35 | ```
36 |
37 | Cuando vemos `return` en una función significa que va a retornar un valor al final de la ejecución de la función. Este
38 | valor puede ser guardado en una variable.
39 |
40 | ```javascript
41 | const ageJohn = calculateAge(1995);
42 | ```
43 |
44 | Para ejecutar una función colocamos el nombre de la función seguido de `()` con los argumentos necesarios. En este
45 | ejemplo la variable `ageJohn` contiene el resultado que retorne `calculateAge()`.
46 |
47 | ```javascript
48 | function calculateAge(birthYear) {
49 | const age = 2020 - birthYear;
50 | return age;
51 | }
52 |
53 | const ageJohn = calculateAge(1995);
54 |
55 | console.log(ageJohn); // 25
56 | ```
57 |
58 | 
59 |
60 | Ahora podemos llamar la misma función las veces que queramos sin necesidad de repetir las mismas líneas de código una y
61 | otra vez. Las funciones también pueden llamar a otras funciones.
62 |
63 | ```javascript
64 | function yearsUntilRetirement(year, name) {
65 | const age = calculateAge(year);
66 | const retirement = 65 - age;
67 | console.log(`${name} retires in ${retirement} years.`);
68 | }
69 | ```
70 |
71 | Algunas funciones no retornan valor alguno, como `yearsUntilRetirement` qué solo muestra un mensaje en consola. En este
72 | caso no podemos guardar el resultado en una variable como hicimos con `ageJohn`.
73 |
74 | ```javascript
75 | yearsUntilRetirement(1995, 'John Doe');
76 | // John Doe retires in 40 years.
77 | ```
78 |
79 | 
80 |
--------------------------------------------------------------------------------
/Sesion-04/Ejemplo-01/assets/calculateAge.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-04/Ejemplo-01/assets/calculateAge.png
--------------------------------------------------------------------------------
/Sesion-04/Ejemplo-01/assets/yearsUntilRetirement.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-04/Ejemplo-01/assets/yearsUntilRetirement.png
--------------------------------------------------------------------------------
/Sesion-04/Ejemplo-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 04`](../Readme.md) > `Ejemplo 02`
2 |
3 | ---
4 |
5 | ## Ejemplo 2: Expresión de Función
6 |
7 | ### Objetivo
8 |
9 | Analizar la diferencia entre declaración de función y expresión de función.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-4.js` que es donde se trabajarán los ejemplos de esta
24 | sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
25 |
26 | #### Desarrollo
27 |
28 | Ya vimos cómo en las declaraciones de funciones comenzamos con `function` después el nombre y los argumentos de la
29 | función dentro de paréntesis.
30 |
31 | ```javascript
32 | function whatDoYouDo(job, name) {
33 | ...
34 | }
35 | ```
36 |
37 | La sintaxis cambia un poco en una expresión de función.
38 |
39 | ```javascript
40 | const whatDoYouDo = function(job, name) {
41 | switch (job) {
42 | case 'developer':
43 | return name + ' develops cool apps.';
44 | case 'designer':
45 | return name + ' designs awesome websites.';
46 | default:
47 | return name + ' does something else.'
48 | }
49 | }
50 |
51 | console.log(whatDoYouDo('developer', 'John Doe'));
52 | console.log(whatDoYouDo('designer', 'Jane Doe'));
53 | console.log(whatDoYouDo('retired', 'Mark Doe'));
54 | ```
55 |
56 | > No es necesario incluir `break` en cada caso del `switch` porque `return` finaliza la función, el siguiente código no es ejecutado.
57 |
58 | 
59 |
--------------------------------------------------------------------------------
/Sesion-04/Ejemplo-02/assets/whatDoYouDo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-04/Ejemplo-02/assets/whatDoYouDo.png
--------------------------------------------------------------------------------
/Sesion-04/Ejemplo-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 04`](../Readme.md) > `Ejemplo 03`
2 |
3 | ---
4 |
5 | ## Ejemplo 3: IIFE
6 |
7 | ### Objetivo
8 |
9 | Evaluar otra forma de utilizar expresiones de función al ejecutarlas inmediatamente.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-4.js` que es donde se trabajarán los ejemplos de esta
24 | sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
25 |
26 | #### Desarrollo
27 |
28 | Supongamos que tenemos una función que muestra en consola un nombre cualquiera.
29 |
30 | ```javascript
31 | function logName() {
32 | const name = "John Doe";
33 | console.log(name);
34 | }
35 |
36 | logName(); // John Doe
37 | ```
38 |
39 | 
40 |
41 | Para convertir esta función en una IIFE debemos envolver toda la función en paréntesis, eso lo hace una expresión,
42 | posteriormente usamos `()` para ejecutar la función justo después de ser definida.
43 |
44 | ```javascript
45 | (function() {
46 | const name = "John Doe";
47 | console.log(name);
48 | })();
49 | ```
50 |
51 | 
52 |
53 | Como ya fue ejecutada y es anónima, no hay forma de que podamos volver a llamar la función de nuevo.
54 |
55 | También se pueden pasar argumentos a este tipo de funciones, de la misma forma que lo hacemos con las funciones
56 | normales.
57 |
58 | ```javascript
59 | (function(lastName) {
60 | const firstName = "John";
61 | console.log(`${firstName} ${lastName}`);
62 | })('Doe');
63 | ```
64 |
65 | 
66 |
--------------------------------------------------------------------------------
/Sesion-04/Ejemplo-03/assets/IIFE-args.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-04/Ejemplo-03/assets/IIFE-args.png
--------------------------------------------------------------------------------
/Sesion-04/Ejemplo-03/assets/IIFE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-04/Ejemplo-03/assets/IIFE.png
--------------------------------------------------------------------------------
/Sesion-04/Ejemplo-03/assets/logName.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-04/Ejemplo-03/assets/logName.png
--------------------------------------------------------------------------------
/Sesion-04/Postwork/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 04`](../Readme.md) > `Postwork`
2 |
3 | ---
4 |
5 | ## Postwork
6 |
7 | ### Objetivos
8 |
9 | Implementar adecuadamente los conceptos vistos hasta el momento para solucionar un problema.
10 |
11 | #### Requisitos
12 |
13 | `N/A`
14 |
15 | #### Desarrollo
16 |
17 | Escribir una función llamada `deepEqual` que reciba dos argumentos y retorne `true` si son el mismo valor o si son
18 | objetos con las mismas propiedades, en este último caso los valores de las propiedades deben ser comparados con una
19 | llamada recursiva de `deepEqual`.
20 |
21 | Usando el operador `typeof` puedes determinar si ambas variables son objetos, de ser así se debe llamar nuevamente
22 | `deepEqual` para comparar las propiedades de dichos objetos, en caso contrario solo es necesario revisar si ambas
23 | variables son estrictamente iguales.
24 |
25 | La función `Object.keys()` es útil para obtener las propiedades de los objetos.
26 |
27 | ```javascript
28 | function deepEqual(a, b) {
29 | // Code goes here
30 | }
31 |
32 | var john = {
33 | firstName: 'John',
34 | lastName: 'Doe'
35 | }
36 |
37 | console.log('Test 1:', deepEqual(1, 1)) // true
38 | console.log('Test 2:', deepEqual(1, '1')) // false
39 | console.log('Test 3:', deepEqual(john, john)) // true
40 | console.log('Test 4:', deepEqual(john, { firstName: 'John', lastName: 'Doe' })) // true
41 | console.log('Test 5:', deepEqual(john, { firstName: 'John' })) // false
42 | ```
43 |
44 | ---
45 |
46 | Escribir una función `chunk` que recibe un arreglo y un número entero `size`. La función debe dividir el arreglo en
47 | múltiples arreglos del tamaño determinado por `size`.
48 |
49 | ```javascript
50 | function chunk(array, size) {
51 | // Code goes here
52 | };
53 |
54 | var data = [1, 2, 3, 4, 5, 6, 7, 8]
55 |
56 | console.log('Test 1:', chunk(data, 1)) // [[1], [2], [3], [4], [5], [6], [7], [8]]
57 | console.log('Test 2:', chunk(data, 2)) // [[1, 2], [3, 4], [5, 6], [7, 8]]
58 | console.log('Test 3:', chunk(data, 3)) // [[1, 2, 3], [4, 5, 6], [7, 8]]
59 | ```
60 |
61 | ---
62 |
63 | Escribir una función `frequency` que recibe un string como argumento. Esta función debe contar la frecuencia o el número
64 | de veces que se repite cada carácter. El resultado debe mostrarse en un objeto donde las propiedades sean los
65 | caracteres, y los valores sean la frecuencia. Los resultados deben ordenarse ascendentemente por los caracteres y no la
66 | frecuencia.
67 |
68 | ```javascript
69 | function frequency(string) {
70 | // Code goes here
71 | }
72 |
73 | console.log('Test 1:', frequency('cccbbbaaa'))
74 | // {a: 3, b: 3, c: 3}
75 | console.log('Test 2:', frequency('www.bedu.org'))
76 | // {.: 2, b: 1, d: 1, e: 1, g: 1, o: 1, r: 1, u: 1, w: 3}
77 | console.log('Test 3:', frequency('john.doe@domain.com'))
78 | // {.: 2, @: 1, a: 1, c: 1, d: 2, e: 1, h: 1, i: 1, j: 1, m: 2, n: 2, o: 4}
79 | ```
80 |
--------------------------------------------------------------------------------
/Sesion-04/Readme.md:
--------------------------------------------------------------------------------
1 |
2 | [`Programación con JavaScript`](../Readme.md) > `Sesión 04`
3 |
4 | # Sesión 4: Funciones
5 |
6 | ## Objetivos
7 |
8 | Dividir el trabajo que realiza un programa mediante tareas más pequeñas aisladas del flujo principal.
9 |
10 | ---
11 |
12 | ## Tabla de Contenidos
13 |
14 | - **[¿Qué es una función?](#qué-es-una-función)**
15 |
16 | - [Ejemplo 1: Funciones](./Ejemplo-01)
17 |
18 | - [Reto 1: Potenciación](./Reto-01)
19 |
20 | - **[Expresiones de función](#expresiones-de-función)**
21 |
22 | - [Ejemplo 2: Expresión de función](./Ejemplo-02)
23 |
24 | - **[Expresión de función ejecutada inmediatamente](#expresión-de-función-ejecutada-inmediatamente)**
25 |
26 | - [Ejemplo 3: IIFE](./Ejemplo-03)
27 |
28 | - **[Arrow functions](#arrow-functions)**
29 |
30 | - [Sintaxis](#sintaxis)
31 |
32 | - [Paréntesis](#paréntesis)
33 |
34 | - [Return Implícito](#return-implícito)
35 |
36 | - [Reto 2: Número mayor](./Reto-02)
37 |
38 | - [Reto 3: Fibonacci](./Reto-03)
39 |
40 | ---
41 |
42 | ## ¿Qué es una función?
43 |
44 | Uno de los conceptos más importantes en JavaScript. Una función es un conjunto de sentencias que realizan una tarea o
45 | calculan un valor. En lugar de repetir el mismo código una y otra vez, podemos crear una función la cual se puede llamar
46 | las veces que sea necesario.
47 |
48 | ```javascript
49 | function myFunction(parameter1, parameter2) {
50 | // Código a ejecutar
51 | }
52 | ```
53 |
54 | - `function` - La palabra clave que usamos para definir una función.
55 |
56 | - `myFunction` - Es el nombre que le damos a la función. Puede contener letras, números, guion bajo y el signo de dólar.
57 |
58 | - `(parameter1, parameter2)` - Dentro de los paréntesis colocamos los parámetros de la función separados por coma. Los
59 | parámetros son variables que se van a usar dentro de la función y no es necesario declararlas nuevamente dentro de la
60 | función. Algunas funciones no reciben parámetros, por lo que los paréntesis pueden ir vacíos.
61 |
62 | #### [Ejemplo 1: Funciones](./Ejemplo-01)
63 |
64 | #### [Reto 1: Potenciación](./Reto-01)
65 |
66 | ---
67 |
68 | ## Expresiones de función
69 |
70 | La sintaxis que hemos visto hasta ahora se le conoce como **declaración de función** o **sentencia de función**. Las
71 | funciones también pueden ser creadas mediante una **expresión de función**.
72 |
73 | #### [Ejemplo 2: Expresión de función](./Ejemplo-02)
74 |
75 | Como vimos en el ejemplo anterior, las funciones son anónimas, es decir no tienen nombre.
76 |
77 | ```javascript
78 | const square = function(number) {
79 | return number * number;
80 | }
81 |
82 | const squareOfFour = square(4);
83 |
84 | console.log(squareOfFour); // 16
85 | ```
86 |
87 | Pero las expresiones de funciones también pueden tener un nombre para referirse a sí mismas, como en una función
88 | recursiva.
89 |
90 | ```javascript
91 | const factorial = function fac(num) {
92 | return num < 2 ? 1 : num * fac(num - 1)
93 | }
94 |
95 | console.log(factorial(5)); // 120
96 | ```
97 |
98 | ---
99 |
100 | ## Expresión de función ejecutada inmediatamente
101 |
102 | Las expresiones de funciones ejecutadas inmediatamente o **IIFE** por sus siglas en inglés (Immediately Invoked Function
103 | Expression) son funciones que se ejecutan inmediatamente después de definirlas. Son útiles cuando queremos ejecutar una
104 | función una sola vez y no queremos que otras partes del programa puedan ejecutar dicha función accidentalmente.
105 |
106 | #### [Ejemplo 3: IIFE](./Ejemplo-03)
107 |
108 | Es común ver este patrón en frameworks o librerías de JavaScript. Al envolver el código en un IIFE están aislando las
109 | variables del resto del código y se aseguran que se ejecuta sin necesidad de que el usuario lo tenga que hacer.
110 |
111 | ---
112 |
113 | ## Arrow functions
114 |
115 | Este tipo de funciones presenta una sintaxis más concisa comparada con las funciones normales. Antes de ver la sintaxis
116 | veamos un ejemplo más con funciones normales.
117 |
118 | Tenemos un arreglo `firstNames`.
119 |
120 | ```javascript
121 | const firstNames = [ 'John', 'Jane', 'Mark'];
122 | ```
123 |
124 | A cada nombre le vamos a agregar el apellido `Doe` y crear un nuevo arreglo `fullNames`. Para esto usaremos un ciclo y
125 | aprovecharemos la flexibilidad de template strings.
126 |
127 | ```javascript
128 | const firstNames = [ 'John', 'Jane', 'Mark'];
129 |
130 | function getFullNames(names) {
131 | const fullNames = []
132 |
133 | for(const name of names) {
134 | fullNames.push(`${name} Doe`)
135 | }
136 |
137 | return fullNames
138 | }
139 |
140 | const fullNames = getFullNames(firstNames)
141 |
142 | console.log(fullNames); // ["John Doe", "Jane Doe", "Mark Doe"]
143 | ```
144 |
145 | Ahora veamos cómo podemos sobreescribir esta función para usar arrow functions.
146 |
147 | ### Sintaxis
148 |
149 | Lo primero que debemos tomar en cuenta es que las arrow functions son funciones anónimas. Significa que el primer paso
150 | es usar una expresión de función.
151 |
152 | ```javascript
153 | const firstNames = [ 'John', 'Jane', 'Mark'];
154 |
155 | const getFullNames = function(names) {
156 | const fullNames = []
157 |
158 | for(const name of names) {
159 | fullNames.push(`${name} Doe`)
160 | }
161 |
162 | return fullNames
163 | }
164 |
165 | const fullNames = getFullNames(firstNames)
166 |
167 | console.log(fullNames); // ["John Doe", "Jane Doe", "Mark Doe"]
168 | ```
169 |
170 | Ahora bien, para escribir un arrow function solo debemos quitar el keyword `function` y agregar lo que se conoce como _
171 | fat arrow_ (`=>`) justo después de los paréntesis que contienen los parámetros de la función.
172 |
173 | ```javascript
174 | const firstNames = [ 'John', 'Jane', 'Mark'];
175 |
176 | const getFullNames = (names) => {
177 | const fullNames = []
178 |
179 | for(const name of names) {
180 | fullNames.push(`${name} Doe`)
181 | }
182 |
183 | return fullNames
184 | }
185 |
186 | const fullNames = getFullNames(firstNames)
187 |
188 | console.log(fullNames); // ["John Doe", "Jane Doe", "Mark Doe"]
189 | ```
190 |
191 | ### Paréntesis
192 |
193 | Adicionalmente, cuando contamos con un único parámetro los paréntesis pueden ser eliminados.
194 |
195 | ```javascript
196 | const firstNames = [ 'John', 'Jane', 'Mark'];
197 |
198 | const getFullNames = names => {
199 | const fullNames = []
200 |
201 | for(const name of names) {
202 | fullNames.push(`${name} Doe`)
203 | }
204 |
205 | return fullNames
206 | }
207 |
208 | const fullNames = getFullNames(firstNames)
209 |
210 | console.log(fullNames); // ["John Doe", "Jane Doe", "Mark Doe"]
211 | ```
212 |
213 | Eliminar los paréntesis es opcional. Algunos [Style Guides](https://github.com/airbnb/javascript#arrows--one-arg-parens)
214 | sugieren no hacerlo por claridad y consistencia en el código.
215 |
216 | ### Return implícito
217 |
218 | Cuando escribimos `return` estamos definiendo explícitamente lo que debe retornar la función. Muchas veces las funciones
219 | solo retornan un valor sin hacer alguna otra operación antes. Cuando este es el caso podemos omitir el `return` pues el
220 | arrow function asume que se va a retornar lo que sigue después del fat arrow.
221 |
222 | ```javascript
223 | const logName = (name) => console.log(`Hello ${name}!`);
224 |
225 | logName('John Doe'); // Hello John Doe!
226 | ```
227 |
228 | De esta manera podemos eliminar las llaves, ya que estas definen un bloque de líneas, y eliminar también el
229 | keyword `return`
230 |
231 | #### [Reto 2: Número mayor](./Reto-02)
232 |
233 | #### [Reto 3: Fibonacci](./Reto-03)
234 |
--------------------------------------------------------------------------------
/Sesion-04/Reto-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 04`](../Readme.md) > `Reto 01`
2 |
3 | ---
4 |
5 | ## Reto 1: Potenciación
6 |
7 | ### Objetivos
8 |
9 | Implementar adecuadamente los conceptos vistos hasta el momento de funciones y ciclos para solucionar un problema.
10 |
11 | #### Requisitos
12 |
13 | `N/A`
14 |
15 | #### Desarrollo
16 |
17 | Crear una función `power` que recibe dos argumentos `base` y `exponent`. La función debe retornar el resultado de
18 | elevar `base` a la potencia `exponent`.
19 |
20 | ```javascript
21 | function power(base, exponent) {
22 | ...
23 | }
24 | ```
25 |
26 | Recuerda que en la potenciación el `exponent` indica cuántas veces se debe multiplicar `base` por sí mismo.
27 |
28 | ```javascript
29 | 3 ^ 3 = 3 * 3 * 3
30 | 3 ^ 3 = 27
31 | ```
32 |
33 | > Evitar usar el operador de potenciación `**` o la función `Math.pow()`
34 |
--------------------------------------------------------------------------------
/Sesion-04/Reto-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 04`](../Readme.md) > `Reto 02`
2 |
3 | ---
4 |
5 | ## Reto 2: Número mayor
6 |
7 | ### Objetivos
8 |
9 | Implementar adecuadamente los conceptos vistos hasta el momento de funciones y ciclos para solucionar un problema.
10 |
11 | #### Requisitos
12 |
13 | Haber terminado el [reto 1](../Reto-01).
14 |
15 | #### Desarrollo
16 |
17 | Completar la función `getLargerInt` la cual recibe dos números enteros. La función debe retornar el número mayor.
18 |
19 | ```javascript
20 | function getLergerInt(number1, number2) {
21 | ...
22 | }
23 | ```
24 |
--------------------------------------------------------------------------------
/Sesion-04/Reto-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 04`](../Readme.md) > `Reto 03`
2 |
3 | ---
4 |
5 | ## Reto 3: Fibonacci
6 |
7 | ### Objetivos
8 |
9 | Implementar adecuadamente los conceptos vistos hasta el momento de funciones y ciclos para solucionar un problema.
10 |
11 | #### Requisitos
12 |
13 | Haber terminado el [reto 2](../Reto-02).
14 |
15 | #### Desarrollo
16 |
17 | En la serie de Fibonacci:
18 |
19 | `1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144...`
20 |
21 | Cada elemento se obtiene sumando los dos valores anteriores.
22 |
23 | Completar la función `fibonacciSequence` la cuál recibe `limit`, un entero positivo que representa la cantidad de
24 | elementos de la serie que queremos.
25 |
26 | ```javascript
27 | function fibonacciSequence(limit) {
28 | ...
29 | }
30 | ```
31 |
32 | La función debe mostrar en consola los elementos de la serie hasta que `limit` sea alcanzado.
33 |
34 | ```javascript
35 | fibonacciSequence(1); // 1
36 | fibonacciSequence(2); // 1, 1
37 | fibonacciSequence(5); // 1, 1, 2, 3, 5
38 | ```
39 |
--------------------------------------------------------------------------------
/Sesion-04/Soluciones/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 04`](../Readme.md) > `Soluciones`
2 |
3 | ---
4 |
5 | ## Reto 1: Potenciación
6 |
7 | ```javascript
8 | function power(base, exponent) {
9 | let result = 1;
10 |
11 | for(var i = 0; i < exponent; i++) {
12 | result *= base; // Same as: result = result * base;
13 | }
14 |
15 | return result;
16 | }
17 | ```
18 |
19 | ---
20 |
21 | ## Reto 2: Número mayor
22 |
23 | ```javascript
24 | function getLergerInt(number1, number2) {
25 | if(number1 > number2) {
26 | return number1
27 | } else {
28 | return number2
29 | }
30 | }
31 | ```
32 |
33 | ---
34 |
35 | ## Reto 3: Fibonacci
36 |
37 | ```javascript
38 | function fibonacci(num) {
39 | if (num <= 1) return 1;
40 |
41 | return fibonacci(num - 1) + fibonacci(num - 2);
42 | }
43 |
44 | function fibonacciSequence(limit) {
45 | if(limit < 1) return console.log('Limit must be greater than 0');
46 |
47 | for(var i = 0; i < limit; i++ ) {
48 | console.log( fibonacci(i) );
49 | }
50 | }
51 | ```
52 |
--------------------------------------------------------------------------------
/Sesion-05/Ejemplo-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 05`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 1: Block scope
6 |
7 | ### Objetivo
8 |
9 | Diferenciar function scope de block scope
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 | Ejemplo 1: Block Scope
20 |
21 |
22 |
23 |
24 |
25 | ```
26 |
27 | Dentro de la misma carpeta creamos un archivo `ejemplo-1.js` que es donde se trabajarán los ejemplos de esta sesión.
28 | Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
29 |
30 | #### Desarrollo
31 |
32 | Cuando agrupamos una o varias sentencias dentro de un par de llaves decimos que tenemos Block Statements o bloque de
33 | sentencias. Esto lo usamos todo el tiempo, en funciones por ejemplo, lo usamos para delimitar el cuerpo de la función.
34 | También lo usamos en condicionales como `if/else` o `switch`, e incluso en bucles como `for` o `while`.
35 |
36 | Aquí encontramos otra diferencia entre `var` y `let/const`. Un bloque de sentencias no genera un nuevo scope local
37 | cuando estamos usando `var`.
38 |
39 | ```javascript
40 | if(true) {
41 | var foo = "John Doe"
42 |
43 | console.log(foo) // "John Doe"
44 | }
45 |
46 | console.log(foo) // "John Doe"
47 | ```
48 |
49 | En este bloque `if` creamos una variable `foo`, como `var` no tiene block scope se encuentra en el scope global, es por
50 | eso que podemos llamar a `foo` desde afuera del bloque.
51 |
52 | ```javascript
53 | var numbers = [1, 2, 3, 4, 5]
54 | var doubles = []
55 |
56 | for(var i = 0; i < numbers.length; i++) {
57 | doubles.push(numbers[i] * 2)
58 | }
59 |
60 | console.log(numbers) // [1, 2, 3, 4, 5]
61 | console.log(doubles) // [2, 4, 6, 8, 10]
62 | console.log(i) // 5
63 | ```
64 |
65 | Este es otro ejemplo, en este bloque `for` creamos un contador `i` que cuenta con scope global por lo que es accesible
66 | desde otras partes del código.
67 |
68 | Ahora bien, las variables creadas con `let/const` cuentan con block scope, es decir, su scope está limitado al bloque
69 | donde son creadas dichas variables.
70 |
71 | ```javascript
72 | if(true) {
73 | const foo = "John Doe"
74 |
75 | console.log(foo) // "John Doe"
76 | }
77 |
78 | console.log(foo) // Uncaught ReferenceError: foo is not defined
79 | ```
80 |
81 | Ahora `foo` no puede leerle fuera del `if` en el que fue creado. Lo mismo sucede para el ciclo `for` que hicimos
82 | anteriormente.
83 |
84 | ```javascript
85 | const numbers = [1, 2, 3, 4, 5]
86 | const doubles = []
87 |
88 | for(let i = 0; i < numbers.length; i++) {
89 | doubles.push(numbers[i] * 2)
90 | }
91 |
92 | console.log(numbers) // [1, 2, 3, 4, 5]
93 | console.log(doubles) // [2, 4, 6, 8, 10]
94 | console.log(i) // Uncaught ReferenceError: i is not defined
95 | ```
96 |
--------------------------------------------------------------------------------
/Sesion-05/Ejemplo-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 05`](../Readme.md) > `Ejemplo 02`
2 |
3 | ---
4 |
5 | ## Ejemplo 2: Execution Context a detalle
6 |
7 | ### Objetivo
8 |
9 | Diferenciar Scope de Context y entender a detalle el Execution Context
10 |
11 | #### Requisitos
12 |
13 | `N/A`
14 |
15 | #### Desarrollo
16 |
17 | Scope, Context y Execution Context son conceptos que muy fácilmente se confunden entre sí por lo que es bastante
18 | complejo entender la diferencia y cómo funcionan cuando estamos aprendiendo JavaScript. Ya vimos que _Scope_ se refiere
19 | al alcance que tienen las variables, es decir, limita desde dónde podemos acceder a una variable. Por otro lado,
20 | _Context_ se refiere al valor que tiene `this` el cual puede cambiar.
21 |
22 | ---
23 |
24 | ### Execution Context a detalle
25 |
26 | En la sesión vimos al Execution Context como una caja que envuelve variables donde parte de nuestro código es evaluado y
27 | ejecutado. Podemos asociar el Execution Context con un objeto que tiene tres propiedades: **Variable Object**, el cual
28 | contiene los argumentos de la función, declaraciones de variables internas y declaraciones de funciones.
29 | **Scope Chain**, este contiene el Variable Object del Execution Context actual así como el de los padres. Por último la
30 | variable **this**.
31 |
32 | 
33 |
34 | Empecemos con lo que ya sabemos. Cuando una función es llamada un nuevo Execution Context se coloca encima del
35 | Execution Stack y esto sucede en dos fases. La fase de creación que básicamente es crear o inicializar las propiedades
36 | descritas más arriba: Variable Object, Scope Chain y `this`. La segunda fase es la fase de ejecución, aquí se ejecuta
37 | el código de la función línea por línea.
38 |
39 | ---
40 |
41 | ### Variable Object
42 |
43 | 
44 |
45 | Cuando se crea el Variable Object se genera un objeto que contiene todos los argumentos que se pasaron a la función.
46 | Después, por cada declaración de función se crea una nueva propiedad dentro del VO que apunta a la función en sí. Por
47 | último, por cada declaración de variable se crea una propiedad en el VO y se inicializa la variable como `undefined`.
48 |
49 | Los últimos dos pasos es lo que se conoce como Hoisting. En este punto aún no llegamos a la fase de ejecución, es decir,
50 | el código de nuestra función aún no se ejecuta, sin embargo, ya tenemos acceso a las funciones y las variables son
51 | inicializadas con `undefined`.
52 |
53 | ---
54 |
55 | ### Scope Chain
56 |
57 | 
58 |
59 | En esta fase se crea un nuevo scope por cada función. Además del scope global y el scope local que vimos durante la
60 | sesión, existe el scope léxico. Toda función que se encuentre dentro de otra función tiene acceso al scope de la
61 | función más externa.
62 |
63 | 
64 |
65 | De esta forma la función `second` tiene acceso tanto al scope de la función `first` como el scope global. Por lo tanto
66 | tiene acceso a las variables `a` y `b`.
67 |
68 | ---
69 |
70 | ### `this` variable
71 |
72 | 
73 |
74 | Por último se determina cuál será el valor de `this`. Cuando hablamos de llamadas de funciones regulares, `this` apunta
75 | al objeto global `window` en caso de los navegadores y `global` para el caso de Node.js. Cuando hablamos de un método
76 | entonces `this` apunta al objeto que está llamando el método.
77 |
78 | Es importante tomar en cuenta que a `this` no se le asigna valor alguno hasta que la función que lo define es ejecutada.
79 |
--------------------------------------------------------------------------------
/Sesion-05/Ejemplo-02/assets/execution-context-phases.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-05/Ejemplo-02/assets/execution-context-phases.png
--------------------------------------------------------------------------------
/Sesion-05/Ejemplo-02/assets/scope-chain-example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-05/Ejemplo-02/assets/scope-chain-example.png
--------------------------------------------------------------------------------
/Sesion-05/Ejemplo-02/assets/scope-chain.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-05/Ejemplo-02/assets/scope-chain.png
--------------------------------------------------------------------------------
/Sesion-05/Ejemplo-02/assets/this-keyword.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-05/Ejemplo-02/assets/this-keyword.png
--------------------------------------------------------------------------------
/Sesion-05/Ejemplo-02/assets/variable-object.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-05/Ejemplo-02/assets/variable-object.png
--------------------------------------------------------------------------------
/Sesion-05/Ejemplo-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 05`](../Readme.md) > `Ejemplo 02`
2 |
3 | ---
4 |
5 | ## Ejemplo 3: Arrow function y this
6 |
7 | Diferenciar el valor de this entre arrow functions y funciones normales
8 |
9 | #### Requisitos
10 |
11 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
12 |
13 | ```html
14 |
15 |
16 |
17 | Ejemplo 3: Arrow function y this
18 |
19 |
20 |
21 |
22 |
23 | ```
24 |
25 | Dentro de la misma carpeta creamos un archivo `ejemplo-2.js` que es donde se trabajarán los ejemplos de esta sesión.
26 | Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
27 |
28 | #### Desarrollo
29 |
30 | Una característica de los arrow functions que no mencionamos la sesión anterior es que no modifican el valor de `this`,
31 | es decir dentro de un arrow function `this` sigue haciendo referencia a la global `window`.
32 |
33 | ```javascript
34 | const john = {
35 | firstName: 'John',
36 | lastName: 'Doe',
37 | birthYear: 1990,
38 | calculateAge: function() {
39 | const today = new Date()
40 | const year = today.getFullYear()
41 | this.age = year - this.birthYear
42 | }
43 | }
44 | ```
45 |
46 | Retomemos este ejemplo. Ya vimos que al llamar `john.calculateAge()` se agrega una nueva propiedad `age` al
47 | objeto `john`. Ahora veamos qué sucede si usamos un arrow function.
48 |
49 | ```javascript
50 | const john = {
51 | firstName: 'John',
52 | lastName: 'Doe',
53 | birthYear: 1990,
54 | calculateAge: () => {
55 | const today = new Date()
56 | const year = today.getFullYear()
57 | this.age = year - this.birthYear
58 | }
59 | }
60 | ```
61 |
62 | Si reescribimos este ejemplo con arrow function no vamos a obtener el mismo resultado. En este caso `this` deja de
63 | apuntar al objeto `john` y toma el valor de más arriba, en este caso el objeto `window`. Esto implica que la
64 | propiedad `age` será agregada a `window` en lugar de `john`.
65 |
66 | 
67 |
--------------------------------------------------------------------------------
/Sesion-05/Ejemplo-03/assets/this-arrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-05/Ejemplo-03/assets/this-arrow.png
--------------------------------------------------------------------------------
/Sesion-05/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../Readme.md) > `Sesión 05`
2 |
3 | # Sesión 5: Scope y this
4 |
5 | ## Objetivos
6 |
7 | Diferenciar scope global de local y cómo this cambia dependiendo del execution context
8 |
9 | ---
10 |
11 | ## Tabla de Contenidos
12 |
13 | - **[¿Qué es scope?](#qué-es-scope)**
14 |
15 | - **[Scope global](#scope-global)**
16 |
17 | - **[Scope local](#scope-local)**
18 |
19 | - [Ejemplo 1: Block Scope](./Ejemplo-01)
20 |
21 | - **[Execution context](#execution-context)**
22 |
23 | - [Ejemplo 2: Execution Context a detalle](./Ejemplo-02)
24 |
25 | - **[¿Cuál es el valor de `this`?](#cuál-es-el-valor-de-this)**
26 |
27 | - **[`this` como método](#this-como-método)**
28 |
29 | - [Ejemplo 3: Arrow function y this](./Ejemplo-03)
30 |
31 | - [Reto 1: Extraer una lista de propiedades](./Reto-01)
32 |
33 | - [Reto 2: Crear un número de teléfono](./Reto-02)
34 |
35 | - [Reto 3: Encontrar elementos faltantes](./Reto-03)
36 |
37 | ---
38 |
39 | ## ¿Qué es scope?
40 |
41 | Scope es la accesibilidad que tienen las variables, funciones y objetos en partes específicas del código durante el
42 | tiempo de ejecución. En otras palabras, el scope determina la visibilidad de las variables en áreas del código.
43 |
44 | JavaScript cuenta con dos tipos de scope: global y local. Las variables dentro de una función se encuentran en un scope
45 | local, aquellas definidas fuera de una función están en un scope global.
46 |
47 | ---
48 |
49 | ## Scope global
50 |
51 | Al momento de empezar a escribir en un documento de JavaScript ya estás en un scope global y solamente existe uno todo
52 | el documento. Todas las variables que estén definidas fuera de una función se encuentran en el scope global. Esto
53 | significa que se puede acceder a dichas variables e incluso modificarlas desde cualquier otra parte del código, incluso
54 | dentro de una función.
55 |
56 | ```javascript
57 | const name = "John Doe";
58 |
59 | console.log(name); // "John Doe"
60 |
61 | function foo() {
62 | console.log(name);
63 | }
64 |
65 | foo(); // "John Doe"
66 | ```
67 |
68 | ---
69 |
70 | ## Scope local
71 |
72 | Las variables definidas dentro de una función se encuentran en un scope local, esto significa que solo se puede acceder
73 | a ellas dentro de la función donde se definió la variable. Esto te permite tener variables con el mismo nombre en
74 | distintas funciones, cada una de esas variables estará ligada a su respectiva función.
75 |
76 | ```javascript
77 | function foo() {
78 | const bar = "John Doe";
79 | console.log(bar);
80 | }
81 |
82 | foo(); // "John Doe"
83 |
84 | console.log(bar); // Uncaught ReferenceError: name is not defined
85 | ```
86 |
87 | #### [Ejemplo 1: Block scope](./Ejemplo-01)
88 |
89 | ---
90 |
91 | ## Execution context
92 |
93 | El ambiente en el cual cada línea de código es ejecutada se conoce como Execution Context. Cada vez que se llama o
94 | ejecuta una nueva función, JavaScript crea un nuevo execution context, estos se van apilando en lo que se conoce como
95 | Execution Stack.
96 |
97 | 
98 |
99 | Todas las variables y declaraciones de funciones por default forman parte del Global Execution Context, como es el caso
100 | de `name`, `first`, `second`, y `third`. Al momento de ejecutar `first()` se crea un nuevo execution context encima del
101 | global, después de crear `var a` en este nuevo contexto se ejecuta `second()` y el proceso se repite. El contexto que
102 | esté hasta arriba en la pila es el que se está ejecutando en el momento, una vez que la ejecución finalice se elimina de
103 | la pila y se procede a ejecutar el que sigue, así hasta terminar.
104 |
105 | Para evitar confusiones, el **scope se refiere a la visibilidad de variables** mientras que el **contexto se refiere al
106 | valor de `this`**. Es decir, conforme cambia el execution context también lo hace el objeto `this`.
107 |
108 | #### [Ejemplo 2: Execution Context a detalle](./Ejemplo-02)
109 |
110 | ---
111 |
112 | ## ¿Cuál es el valor de `this`?
113 |
114 | Ya mencionamos que la ejecución de un execution context por default es global. Esto significa que `this` por default
115 | está haciendo referencia a un objeto global.
116 |
117 | En un navegador o browser este objeto global es `window`.
118 |
119 | 
120 |
121 | Mientras que en un ambiente de Node.js `this` hace referencia al objeto `global`.
122 |
123 | 
124 |
125 | ---
126 |
127 | ## `this` como método
128 |
129 | Ya mencionamos que las propiedades de los objetos pueden contener cualquier tipo de dato, esto incluye expresiones de
130 | funciones, en cuyo caso deja de llamarse propiedad y se conoce como método.
131 |
132 | ```javascript
133 | const john = {
134 | firstName: 'John',
135 | lastName: 'Doe',
136 | birthYear: 1990,
137 | calculateAge: function(birthYear) {
138 | const today = new Date()
139 | const year = today.getFullYear()
140 | return year - birthYear
141 | }
142 | }
143 | ```
144 |
145 | El objeto `john` contiene el método `calculateAge`. Este método es una expresión de función que recibe `birthYear` como
146 | argumento y retorna la edad actual de `john`.
147 |
148 | ```javascript
149 | console.log(john.calculateAge(1990)) // 31
150 | ```
151 |
152 | Ahora bien, como vimos anteriormente por default `this` hace referencia a la global `window`.
153 |
154 | ```javascript
155 | console.log(this) // Window { … }
156 | ```
157 |
158 | Incluso dentro de una función `this` sigue apuntando a la global `window`.
159 |
160 | ```javascript
161 | function foo() {
162 | console.log(this)
163 | }
164 |
165 | foo() // Window { … }
166 | ```
167 |
168 | Pero no es el caso cuando se trata de un método de un objeto. Veamos un ejemplo:
169 |
170 | ```javascript
171 | function logThis () {
172 | console.log("Is this === window? " + (this === window))
173 | }
174 |
175 | const foo = {
176 | logThis: logThis
177 | }
178 |
179 | logThis() // Is this === window? true
180 |
181 | foo.logThis() // Is this === window? false
182 | ```
183 |
184 | Cuando ejecutamos `logThis()` directamente `this` sigue haciendo referencia a `window`. Al llamar `logThis()` como
185 | método de un objeto el valor de `this` cambia, ahora hace referencia al objeto que lo contiene, en este caso el
186 | objeto `foo`.
187 |
188 | De esta manera los métodos pueden modificar o agregar nuevas propiedades a los objetos. Podemos reescribir el ejemplo
189 | anterior para usar la propiedad `birthYear` del objeto en lugar de pasarlo al método `calculateAge`.
190 |
191 | ```javascript
192 | const john = {
193 | firstName: 'John',
194 | lastName: 'Doe',
195 | birthYear: 1990,
196 | calculateAge: function() {
197 | const today = new Date()
198 | const year = today.getFullYear()
199 | this.age = year - this.birthYear
200 | }
201 | }
202 | ```
203 |
204 | Ahora el método `calculateAge` en lugar de retornar la edad la va a guardar en una nueva propiedad llamada `age.`
205 |
206 | ```javascript
207 | console.log( john );
208 | /*
209 | Valor actual
210 | {
211 | firstName: "John",
212 | lastName: "Doe",
213 | birthYear: 1990,
214 | calculateAge: ƒ
215 | }
216 | */
217 |
218 | john.calculateAge();
219 |
220 | console.log( john );
221 | /*
222 | Después de llamar el método calculateAge()
223 | {
224 | firstName: "John",
225 | lastName: "Doe",
226 | birthYear: 1990,
227 | age: 31,
228 | calculateAge: ƒ
229 | }
230 | */
231 | ```
232 |
233 | #### [Ejemplo 3: Arrow function y this](./Ejemplo-03)
234 |
235 | #### [Reto 1: Extraer una lista de propiedades](./Reto-01)
236 |
237 | #### [Reto 2: Crear un número de teléfono](./Reto-02)
238 |
239 | #### [Reto 3: Encontrar elementos faltantes](./Reto-03)
240 |
--------------------------------------------------------------------------------
/Sesion-05/Reto-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 05`](../Readme.md) > `Reto 01`
2 |
3 | ---
4 |
5 | ## Reto 1: Extraer una lista de propiedades
6 |
7 | ### Objetivos
8 |
9 | Implementar adecuadamente los conceptos vistos hasta el momento de funciones y ciclos para solucionar un problema.
10 |
11 | #### Requisitos
12 |
13 | `N/A`
14 |
15 | #### Desarrollo
16 |
17 | Completar la función `pluck` que extrae una lista de propiedades de un arreglo de objetos.
18 |
19 | ```javascript
20 | var singers = [
21 | { name: 'Steven Tyler', band: 'Aerosmith', born: 1948 },
22 | { name: 'Karen Carpenter', band: 'The Carpenters', born: 1950 },
23 | { name: 'Kurt Cobain', band: 'Nirvana', born: 1967 },
24 | { name: 'Chris Cornell', band: 'Soundgarden', born: 1964 },
25 | ];
26 |
27 | function pluck(list, propertyName) {
28 | // Code goes here...
29 | }
30 |
31 | console.log( pluck(singers, 'name') );
32 | // ["Steven Tyler", "Karen Carpenter", "Kurt Cobain", "Chris Cornell"]
33 |
34 | console.log( pluck(singers, 'band') );
35 | // ["Aerosmith", "The Carpenters", "Nirvana", "Soundgarden"]
36 |
37 | console.log( pluck(singers, 'born') );
38 | // [1948, 1950, 1967, 1964]
39 | ```
40 |
--------------------------------------------------------------------------------
/Sesion-05/Reto-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 05`](../Readme.md) > `Reto 02`
2 |
3 | ---
4 |
5 | ## Reto 2: Crear un número de teléfono
6 |
7 | ### Objetivos
8 |
9 | Implementar ciclos o funciones de alto orden para producir un string con formato especificado
10 |
11 | #### Requisitos
12 |
13 | `N/A`
14 |
15 | #### Desarrollo
16 |
17 | Escribir una función que reciba un arreglo de 10 enteros entre 0 - 9, y retorne un string en forma de número telefónico.
18 |
19 | ```javascript
20 | createPhoneNumber([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]); // "(123) 456-7890"
21 | ```
22 |
23 | La función debe retornar el mismo formato, incluyendo el espacio después del paréntesis.
24 |
--------------------------------------------------------------------------------
/Sesion-05/Reto-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 05`](../Readme.md) > `Reto 03`
2 |
3 | ---
4 |
5 | ## Reto 3: Encontrar elementos faltantes
6 |
7 | ### Objetivos
8 |
9 | Implementar ciclos o funciones de alto orden para producir un arreglo con los elementos faltantes de otro
10 |
11 | #### Requisitos
12 |
13 | `N/A`
14 |
15 | #### Desarrollo
16 |
17 | Escribir una función que reciba un arreglo de _n_ cantidad de enteros positivos que pueden no estar ordenados. La
18 | función debe retornar un nuevo arreglo con los elementos faltantes del primer arreglo.
19 |
20 | ```javascript
21 | findMissingNumbers([2, 1, 9, 5, 7, 3, 10]); // [4, 6, 8]
22 | ```
23 |
--------------------------------------------------------------------------------
/Sesion-05/Soluciones/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 05`](../Readme.md) > `Soluciones`
2 |
3 | ---
4 |
5 | ## Reto 1: Extraer una lista de propiedades
6 |
7 | ```javascript
8 | function pluck(list, propertyName) {
9 | const values = [];
10 |
11 | for (let i = 0; i < list.length; i++) {
12 | values.push( list[i][propertyName] );
13 | }
14 |
15 | return values;
16 | }
17 | ```
18 |
19 | ---
20 |
21 | ## Reto 2: Crear un número de teléfono
22 |
23 | ```javascript
24 | function createPhoneNumber(numbers) {
25 | let format = '(xxx) xxx-xxxx'
26 | for (let num of numbers) {
27 | format = format.replace('x', num)
28 | }
29 | return format
30 | }
31 | ```
32 |
33 | ---
34 |
35 | ## Reto 3: Encontrar elementos faltantes
36 |
37 | ```javascript
38 | function findMissingNumbers(numbers) {
39 | const sortedArray = numbers.sort((a, b) => a - b)
40 | let missing = []
41 | for (let i = numbers[0]; i < numbers[sortedArray.length - 1]; i++) {
42 | if (sortedArray.indexOf(i) < 0) {
43 | missing.push(i);
44 | }
45 | }
46 | return missing
47 | }
48 | ```
49 |
--------------------------------------------------------------------------------
/Sesion-05/assets/execution-context.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-05/assets/execution-context.png
--------------------------------------------------------------------------------
/Sesion-05/assets/this-browser.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-05/assets/this-browser.png
--------------------------------------------------------------------------------
/Sesion-05/assets/this-node.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-05/assets/this-node.png
--------------------------------------------------------------------------------
/Sesion-06/Ejemplo-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 06`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 1: Function constructor
6 |
7 | ### Objetivo
8 |
9 | Crear constructores para instanciar objetos.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 | Ejemplo 1: Function Constructor
20 |
21 |
22 |
23 | ```
24 |
25 | Dentro de la misma carpeta creamos un archivo `ejemplo-1.js` que es donde se trabajarán los ejemplos de esta
26 | sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
27 |
28 | #### Desarrollo
29 |
30 | Ya mencionamos que podemos usar un constructor para crear múltiples objetos como:
31 |
32 | ```javascript
33 | const john = {
34 | name: 'John',
35 | birthYear: 1990,
36 | job: 'Developer'
37 | }
38 | ```
39 |
40 | La forma más común de hacer esto es mediante un `function constructor`, el cual es una expresión de función como la
41 | siguiente:
42 |
43 | ```javascript
44 | const Person = function(name, birthYear, job) {
45 | this.name = name;
46 | this.birthYear = birthYear;
47 | this.job = job;
48 | }
49 | ```
50 |
51 | > Cuando estamos creando constructores una convención es nombrarlas con la primera letra mayúscula para diferenciar el
52 | > constructor de las instancias.
53 |
54 | Vemos que este constructor recibe tres argumentos los cuales son las propiedades que queremos que tenga nuestro objeto.
55 |
56 | ```javascript
57 | const john = new Person('John', 1990, 'Developer');
58 | ```
59 |
60 | El operador `new` crea un nuevo objeto vacío, después se ejecuta la función `Person()`, esta es la razón por la que el
61 | constructor utiliza `this`, está haciendo referencia al nuevo objeto vacío para asignarle las propiedades.
62 |
63 | ```javascript
64 | console.log( john );
65 | /*
66 | * {
67 | * name: 'John',
68 | * birthYear: 1990,
69 | * job: 'Developer'
70 | * }
71 | */
72 | ```
73 |
74 | Hemos creado un objeto `john` el cuál es una instancia del constructor `Person`.
75 |
76 | 
77 |
78 | De esta manera podemos crear todas las instancias que sean necesarias a partir del mismo constructor.
79 |
80 | ```javascript
81 | const mark = new Person('Mark', 1985, 'Teacher');
82 |
83 | const jane = new Person('Jane', 1975, 'Designer');
84 | ```
85 |
86 | 
87 |
--------------------------------------------------------------------------------
/Sesion-06/Ejemplo-01/assets/function-constructor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-06/Ejemplo-01/assets/function-constructor.png
--------------------------------------------------------------------------------
/Sesion-06/Ejemplo-01/assets/instances.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-06/Ejemplo-01/assets/instances.png
--------------------------------------------------------------------------------
/Sesion-06/Ejemplo-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 06`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 2: Heredando propiedades
6 |
7 | ### Objetivo
8 |
9 | Crear constructores para instanciar objetos y heredar propiedades entre constructores.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 | Ejemplo 2: Heredando propiedades
20 |
21 |
22 |
23 | ```
24 |
25 | Dentro de la misma carpeta creamos un archivo `ejemplo-2.js` que es donde se trabajarán los ejemplos de esta
26 | sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
27 |
28 | #### Desarrollo
29 |
30 | Ya vimos cómo podemos instanciar objetos a partir del mismo constructor.
31 |
32 | ```javascript
33 | const Person = function(name) {
34 | this.name = name;
35 | }
36 |
37 | const john = new Person('John');
38 | ```
39 |
40 | En ocasiones necesitamos que un constructor tenga las propiedades de otro.
41 |
42 | ```javascript
43 | const Developer = function(skills, yearsOfExperience) {
44 | this.skills = skills;
45 | this.yearsOfExperience = yearsOfExperience;
46 | }
47 | ```
48 |
49 | Con este constructor `Developer` podemos instanciar múltiples objetos que tendrán las propiedades `skils`
50 | y `yearsOfExperience`. Pero también necesitamos la propiedad `name` del constructor `Person`, pues un desarrollador
51 | también es una persona que tiene nombre. Para esto usamos el método `call()` el cual ejecuta el constructor padre.
52 |
53 | ```javascript
54 | const Person = function(name) {
55 | this.name = name;
56 | }
57 |
58 | const Developer = function(name, skills, yearsOfExperience) {
59 | Person.call(this, name);
60 |
61 | this.skills = skills;
62 | this.yearsOfExperience = yearsOfExperience;
63 | }
64 | ```
65 |
66 | Decimos que el constructor `Developer` es hijo del constructor `Person` porque queremos que `Developer` herede la
67 | propiedad `name` de `Person`.
68 |
69 | `Person.call(this, name);` llama al constructor padre y retorna un objeto con todas sus propiedades. `this` en este
70 | contexto está haciendo referencia a `Developer`.
71 |
72 | ```javascript
73 | const Person = function(name) {
74 | this.name = name;
75 | }
76 |
77 | const Developer = function(name, skills, yearsOfExperience) {
78 | Person.call(this, name);
79 |
80 | this.skills = skills;
81 | this.yearsOfExperience = yearsOfExperience;
82 | }
83 |
84 | const john = new Developer('John', 'JavaScript', 10);
85 |
86 | console.log( john );
87 | ```
88 |
89 | De esta forma creamos un objeto `john` que es una instancia de `Developer`. Es importante tomar en cuenta que `john` no es una instancia de `Person` aunque tenga sus mismas propiedades, estas sólo fueron prestadas o heredadas durante la creación del objeto.
90 |
91 | 
92 |
--------------------------------------------------------------------------------
/Sesion-06/Ejemplo-02/assets/inheritance.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-06/Ejemplo-02/assets/inheritance.png
--------------------------------------------------------------------------------
/Sesion-06/Ejemplo-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 06`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 3: Heredando métodos
6 |
7 | ### Objetivo
8 |
9 | Crear constructores para instanciar objetos y heredar métodos.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 | Ejemplo 3: Heredando métodos
20 |
21 |
22 |
23 | ```
24 |
25 | Dentro de la misma carpeta creamos un archivo `ejemplo-3.js` que es donde se trabajarán los ejemplos de esta
26 | sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
27 |
28 | #### Desarrollo
29 |
30 | En el [Ejemplo 1](../Ejemplo-01) creamos el siguiente constructor:
31 |
32 | ```javascript
33 | const Person = function(name, birthYear, job) {
34 | this.name = name;
35 | this.birthYear = birthYear;
36 | this.job = job;
37 | }
38 | ```
39 |
40 | Vamos a agregar un método `calculateAge()` similar al que hicimos la sesión anterior, pero no lo vamos a poner en el
41 | constructor, en su lugar lo vamos a crear dentro del prototype.
42 |
43 | ```javascript
44 | Person.prototype.calculateAge = function() {
45 | const today = new Date();
46 | const year = today.getFullYear();
47 |
48 | console.log( year - this.birthYear );
49 | }
50 | ```
51 |
52 | Ahora vamos a crear múltiples instancias de `Person`.
53 |
54 | ```javascript
55 | const john = new Person('John', 1990, 'Developer');
56 |
57 | const mark = new Person('Mark', 1985, 'Teacher');
58 |
59 | const jane = new Person('Jane', 1975, 'Designer');
60 | ```
61 |
62 | Si inspeccionamos en consola estos tres objetos nos damos cuenta de que ninguno de ellos tiene el método `calculateAge()`.
63 |
64 | 
65 |
66 | Aun así podemos llamar `calculateAge()` en los tres objetos.
67 |
68 | ```javascript
69 | john.calculateAge();
70 |
71 | mark.calculateAge();
72 |
73 | jane.calculateAge();
74 | ```
75 |
76 | 
77 |
78 | Si inspeccionamos más a detalle estos objetos podemos encontrar el método `calculateAge()` dentro de `__proto__` que es
79 | el prototype del objeto. Incluso nos muestra cuál es el contructor del que fue instanciado. De hecho, podemos
80 | inspeccionar todo el prototype chain.
81 |
82 | 
83 |
--------------------------------------------------------------------------------
/Sesion-06/Ejemplo-03/assets/prototype-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-06/Ejemplo-03/assets/prototype-2.png
--------------------------------------------------------------------------------
/Sesion-06/Ejemplo-03/assets/prototype-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-06/Ejemplo-03/assets/prototype-3.png
--------------------------------------------------------------------------------
/Sesion-06/Ejemplo-03/assets/prototype.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-06/Ejemplo-03/assets/prototype.png
--------------------------------------------------------------------------------
/Sesion-06/Reto-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 06`](../Readme.md) > `Reto 01`
2 |
3 | ---
4 |
5 | ## Reto 1: Vectores
6 |
7 | ### Objetivos
8 |
9 | Crear un constructor, agregar métodos al prototype e instanciar múltiples objetos a partir de dicho constructor.
10 |
11 | #### Requisitos
12 |
13 | `N/A`
14 |
15 | #### Desarrollo
16 |
17 | Crear un function constructor `Vec` el cual representa un vector en dos dimensiones. Recibe dos parámetros `x` y `y`,
18 | ambos valores numéricos que deben ser las propiedades del objeto.
19 |
20 | Agregar los siguientes métodos al `prototype` de `Vec`:
21 |
22 | 1. `plus`: Recibe otro vector como parámetro y retorna un nuevo vector con la suma de ambos vectores.
23 |
24 | 2. `minus`: Recibe otro vector como parámetro y retorna un nuevo vector con la diferencia de ambos vectores.
25 |
26 | 3. `length`: Retorna la longitud del vector, es decir, la distancia del punto _(x, y)_ desde el origen _(0, 0)_.
27 |
28 | ```javascript
29 | const Vec = function(x, y) {
30 | // Code goes here...
31 | }
32 |
33 | const vec1 = new Vec(1, 2);
34 | const vec2 = new Vec(2, 3);
35 |
36 | console.log(vec1.plus(vec2)); // Vec { x: 3, y: 5 }
37 | console.log(vec1.minus(vec2)); // Vec { x: -1, y: -1 }
38 | console.log(vec1.length()); // 2.23606797749979
39 | ```
40 |
41 | > Para calcular la distancia desde (0, 0) hasta (x, y) se puede usar el teorema de Pitágoras: √(x2 + y2).
42 | > En JavaScript existe el método `Math.sqrt` para calcular raíces cuadradas.
43 |
--------------------------------------------------------------------------------
/Sesion-06/Reto-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 06`](../Readme.md) > `Reto 02`
2 |
3 | ---
4 |
5 | ## Reto 2: Group
6 |
7 | ### Objetivos
8 |
9 | Crear un constructor, agregar métodos al prototype e instanciar múltiples objetos a partir de dicho constructor.
10 |
11 | #### Requisitos
12 |
13 | Haber terminado el [Reto 1](../Reto-01/Readme.md).
14 |
15 | #### Desarrollo
16 |
17 | Crear un function constructor `Group` el cual crea una lista (arreglo) vacía.
18 |
19 | Agregar los siguientes métodos a `Group`:
20 |
21 | 1. `add`: Agrega un nuevo valor al grupo solo si no existe.
22 |
23 | 2. `has`: Retorna un booleano indicando si el valor es un miembro del grupo.
24 |
25 | 3. `from`: Método estático que recibe un arreglo y crea un grupo con todos los elementos de dicho arreglo.
26 |
27 | ```javascript
28 | const Group = function() {
29 | // Code goes here...
30 | }
31 |
32 | const group = Group.from([1, 2, 3, 4, 5]);
33 | console.log(group); // Group { members: [ 1, 2, 3, 4, 5 ] }
34 | console.log(group.has(5)); // true
35 | console.log(group.has(10)); // false
36 |
37 | group.add(10);
38 | console.log(group.has(10)); // true
39 | ```
40 |
41 | > Los métodos estáticos son llamados sin instanciar su clase. Cuando se usan function constructors se pueden definir
42 | > como método de la instancia sin necesidad de colocarlo en el prototype.
43 |
--------------------------------------------------------------------------------
/Sesion-06/Reto-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 06`](../Readme.md) > `Reto 03`
2 |
3 | ---
4 |
5 | ## Reto 3: Perímetro
6 |
7 | ### Objetivos
8 |
9 | Crear un constructor, agregar métodos al prototype e instanciar múltiples objetos a partir de dicho constructor.
10 |
11 | #### Requisitos
12 |
13 | Haber terminado el [Reto 2](../Reto-02/Readme.md).
14 |
15 | #### Desarrollo
16 |
17 | Crear un function constructor `Triangle` con tres parámetros `a`, `b` y `c`. Cada uno representa un lado del triángulo.
18 |
19 | Agregar el método `getPerimeter` al `prototype` de `Triangle`, el cual retorna el perímetro del triángulo.
20 |
21 | ```javascript
22 | const Triangle = function(a, b, c) {
23 | // Code goes here...
24 | }
25 |
26 | const triangle = new Triangle(1, 2, 3);
27 |
28 | console.log(triangle); // Triangle { a: 1, b: 2, c: 3 }
29 | console.log(triangle.getPerimeter()); // 6
30 | ```
31 |
--------------------------------------------------------------------------------
/Sesion-06/Soluciones/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 06`](../Readme.md) > `Soluciones`
2 |
3 | ---
4 |
5 | ## Reto 1: Vectores
6 |
7 | ```javascript
8 | const Vec = function(x, y) {
9 | this.x = x;
10 | this.y = y;
11 | }
12 |
13 | Vec.prototype.plus = function(other) {
14 | return new Vec(this.x + other.x, this.y + other.y);
15 | }
16 |
17 | Vec.prototype.minus = function(other) {
18 | return new Vec(this.x - other.x, this.y - other.y);
19 | }
20 |
21 | Vec.prototype.length = function() {
22 | return Math.sqrt(this.x * this.x + this.y * this.y);
23 | }
24 | ```
25 |
26 | ---
27 |
28 | ## Reto 2: Group
29 |
30 | ```javascript
31 | const Group = function() {
32 | this.members = [];
33 | }
34 |
35 | Group.prototype.add = function(value) {
36 | if (!this.has(value)) {
37 | this.members.push(value);
38 | }
39 | }
40 |
41 | Group.prototype.has = function(value) {
42 | return this.members.includes(value);
43 | }
44 |
45 | Group.from = function(collection) {
46 | const group = new Group();
47 |
48 | for(let i = 0; i < collection.length; i++) {
49 | group.add(collection[i]);
50 | }
51 | return group;
52 | }
53 | ```
54 |
55 | ---
56 |
57 | ## Reto 3: Perímetro
58 |
59 | ```javascript
60 | const Triangle = function(a, b, c) {
61 | this.a = a;
62 | this.b = b;
63 | this.c = c;
64 | }
65 |
66 | Triangle.prototype.getPerimeter = function() {
67 | return this.a + this.b + this.c;
68 | }
69 | ```
70 |
--------------------------------------------------------------------------------
/Sesion-06/assets/constructor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-06/assets/constructor.png
--------------------------------------------------------------------------------
/Sesion-06/assets/inheritance.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-06/assets/inheritance.png
--------------------------------------------------------------------------------
/Sesion-06/assets/instances.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-06/assets/instances.png
--------------------------------------------------------------------------------
/Sesion-06/assets/prototype-chain.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-06/assets/prototype-chain.png
--------------------------------------------------------------------------------
/Sesion-07/Ejemplo-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 07`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 1: Mutando objetos
6 |
7 | ### Objetivo
8 |
9 | Crear una función que inmutable.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 | Ejemplo 1: Mutando Objetos
19 |
20 |
21 |
22 | ```
23 |
24 | Dentro de la misma carpeta creamos un archivo `ejemplo-1.js` que es donde se trabajarán los ejemplos de esta
25 | sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
26 |
27 | #### Desarrollo
28 |
29 | Para ver cómo funciona la inmutabilidad vamos a empezar creando un objeto que represente un carro.
30 |
31 | ```javascript
32 | const car = {
33 | brand: 'Nissan',
34 | model: 'Sentra',
35 | year: 2020
36 | }
37 | ```
38 |
39 | Ahora vamos a crear una función que agregue la propiedad color al auto.
40 |
41 | ```javascript
42 | function addColor(car) {
43 | car.color = 'Black';
44 | return car;
45 | }
46 | ```
47 |
48 | Ahora llamamos a la función pasándole el objeto `car` y guardamos en resultado en otra variable.
49 |
50 | ```javascript
51 | console.log('Before calling addColor()', car);
52 |
53 | const sameCar = addColor(car);
54 |
55 | console.log('After calling addColor()', car);
56 | console.log('After calling addColor()', sameCar);
57 |
58 | console.log('Same car?', car === sameCar); // true
59 | ```
60 |
61 | La función `addColor` muta el objeto `car` que recibe. La primera vez que mostramos en consola vemos que no existe la
62 | propiedad `color`, después de llamar a la función vemos la propiedad en ambos objetos.
63 |
64 | El objeto retornado por `addColor` es el mismo que recibió. Ambas variables, tanto `car` como `sameCar` están apuntando
65 | al mismo objeto en memoria.
66 |
67 | 
68 |
69 | Tenemos que hacer unos cambios para que `addColor` no mute el objeto que recibe.
70 |
71 | ```javascript
72 | function addColor(car) {
73 | const newCar = Object.assign({}, car, {
74 | color: 'Black'
75 | });
76 | return newCar;
77 | }
78 | ```
79 |
80 | `Object.assign()` asigna las propiedades de un objeto a otro sin modificar el objeto original. En este ejemplo está
81 | copiando todas las propiedades de `car` en un nuevo objeto vacío `{}` y agregando la propiedad `color`.
82 |
83 | ```javascript
84 | console.log('Before calling addColor()', car);
85 |
86 | const newCar = addColor(car);
87 |
88 | console.log('After calling addColor()', car);
89 | console.log('After calling addColor()', newCar);
90 |
91 | console.log('Same car?', car === newCar); // false
92 | ```
93 |
94 | Como ahora la función `addColor` está creando un nuevo objeto vemos que `car` no cambia sus propiedades y el objeto
95 | retornado es diferente al que recibe la función.
96 |
97 | 
98 |
--------------------------------------------------------------------------------
/Sesion-07/Ejemplo-01/assets/immutable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-07/Ejemplo-01/assets/immutable.png
--------------------------------------------------------------------------------
/Sesion-07/Ejemplo-01/assets/mutable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-07/Ejemplo-01/assets/mutable.png
--------------------------------------------------------------------------------
/Sesion-07/Ejemplo-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 07`](../Readme.md) > `Ejemplo 02`
2 |
3 | ---
4 |
5 | ## Ejemplo 2: Creando funciones puras
6 |
7 | ### Objetivo
8 |
9 | Crear funciones puras.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 | Ejemplo 2: Creando funciones puras
19 |
20 |
21 |
22 | ```
23 |
24 | Dentro de la misma carpeta creamos un archivo `ejemplo-2.js` que es donde se trabajarán los ejemplos de esta
25 | sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
26 |
27 | #### Desarrollo
28 |
29 | En el ejemplo anterior buscamos la forma de hacer una función que no mutara el objeto que recibe.
30 |
31 | ```javascript
32 | function addColor(car) {
33 | const newCar = Object.assign({}, car, {
34 | color: 'Black'
35 | });
36 |
37 | return newCar;
38 | }
39 | ```
40 |
41 | Tratando de no mutar `car` terminamos creando una función pura, como podrás ver no produce ningún efecto secundario. Es
42 | por ello que la inmutabilidad está muy ligada a las funciones puras.
43 |
44 | Veamos otro ejemplo. Tenemos un carrito de compras y queremos crear una función que agregue más artículos.
45 |
46 | ```javascript
47 | const cart = [
48 | {
49 | item: 'Laptop',
50 | quantity: 1
51 | }
52 | ]
53 | ```
54 |
55 | Como el carrito va a almacenar múltiples elementos usaremos un arreglo. Cada artículo será representado por un objeto
56 | con dos propiedades `item` y `quantity`.
57 |
58 | ```javascript
59 | function addItemToCart(item, quantity) {
60 | cart.push({
61 | item: item,
62 | quantity: quantity
63 | })
64 | }
65 | ```
66 |
67 | La solución más obvia sería usar `push()` para agregar un nuevo objeto con las propiedades `item` y `quantity`. Esta
68 | función no es pura porque está modificando `cart`, una variable que no se encuentra dentro de esta función. Quizás en
69 | este ejemplo no es un problema, pero si estuviéramos haciendo una tienda en línea, es posible que otras partes de la
70 | aplicación intenten acceder a `cart` al mismo tiempo que estamos ejecutando la función `addItemToCart` y eso sí podría
71 | representar un problema como falta de inconsistencia en los datos.
72 |
73 | ```javascript
74 | function addItemToCart(cart, item, quantity) {
75 | const newCart = cart.map(function(element) {
76 | return element;
77 | });
78 |
79 | newCart.push({
80 | item: item,
81 | quantity: quantity
82 | })
83 |
84 | return newCart;
85 | }
86 | ```
87 |
88 | > Como `map()` crea un nuevo arreglo lo podemos usar para crear una copia retornando el parámetro que recibe sin
89 | > modificarlo.
90 |
91 | Una alternativa sería pasar `cart` como argumento a la función. Hacer una copia de todo el arreglo para no mutar el
92 | original, agregar el nuevo objeto y retornar el arreglo actualizado.
93 |
94 | ```javascript
95 | cart = addItemToCart(cart, 'Phone', 1);
96 |
97 | console.log(cart);
98 | ```
99 |
100 | Esta sería una forma más funcional, recuerda que en este paradigma se da prioridad a la inmutabilidad, lo que significa
101 | crear nuevas variables que van a reemplazar a los valores antiguos.
102 |
103 | 
104 |
--------------------------------------------------------------------------------
/Sesion-07/Ejemplo-02/assets/pure-function.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-07/Ejemplo-02/assets/pure-function.png
--------------------------------------------------------------------------------
/Sesion-07/Ejemplo-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 07`](../Readme.md) > `Ejemplo 03`
2 |
3 | ---
4 |
5 | ## Ejemplo 3: Suma de dígitos
6 |
7 | ### Objetivo
8 |
9 | Implementar múltiples funciones de alto orden para resolver un problema
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 | Ejemplo 3: Suma de dígitos
19 |
20 |
21 |
22 | ```
23 |
24 | Dentro de la misma carpeta creamos un archivo `ejemplo-3.js` que es donde se trabajarán los ejemplos de esta
25 | sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
26 |
27 | #### Desarrollo
28 |
29 | Sumar todos los dígitos de un número entero:
30 |
31 | ```
32 | Input: 12345
33 |
34 | -- 1 + 2 + 3 + 4 + 5 = 15
35 |
36 | Output: 15
37 | ```
38 |
39 | Este ejercicio puede ser resuelto mediante operadores matemáticos, pero en este ejemplo veremos otra forma implementando
40 | múltiples funciones. Lo primero que haremos es crear un arreglo y cada dígito del número será un elemento del arreglo.
41 | De esta forma será más fácil trabajar con funciones de alto orden como `filter` y `reduce`.
42 |
43 | ```javascript
44 | const num = 12345;
45 |
46 | const str = num.toString();
47 |
48 | const array = str.split('');
49 |
50 | console.log(num); // 12345
51 | console.log(str); // '12345'
52 | console.log(array); // ['1', '2', '3', '4', '5']
53 | ```
54 |
55 | Con el método `toString()` podemos convertir un número entero a un string. El método `split()` nos permite dividir un
56 | string en una serie de substrings y colocarlos dentro de un arreglo. En JavaScript podemos encadenar funciones, lo que
57 | retorne la primera función será pasada como argumento a la siguiente función, de esta manera podemos simplificar nuestro
58 | código.
59 |
60 | ```javascript
61 | const num = 12345;
62 |
63 | const array = num.toString().split('');
64 |
65 | console.log(num); // 12345
66 | console.log(array); // ['1', '2', '3', '4', '5']
67 | ```
68 |
69 | Antes de poder realizar operaciones matemáticas con este arreglo debemos convertir cada elemento a un entero nuevamente.
70 | En la sesión uno vimos cómo usar la función `Number()` para convertir un string a un number. Para aplicar esta función a
71 | cada elemento del arreglo usaremos la función `map()`.
72 |
73 | ```javascript
74 | const arrayOfNumbers = array.map(function(num) {
75 | return Number(num);
76 | })
77 |
78 | console.log(arrayOfNumbers); // [1, 2, 3, 4, 5]
79 | ```
80 |
81 | Cuando usemos una función como `map()` y queremos que retorne el resultado de otra función con el mismo argumento
82 | podemos simplificarlo de la siguiente manera:
83 |
84 | ```javascript
85 | const arrayOfNumbers = array.map(Number);
86 |
87 | console.log(arrayOfNumbers); // [1, 2, 3, 4, 5]
88 | ```
89 |
90 | Por último debemos sumar todos los elementos de este arreglo. Ya vimos cómo podemos usar `reduce` para reducir a un
91 | único valor todos los elementos de un arreglo.
92 |
93 | ```javascript
94 | const sum = arrayOfNumbers.reduce(function(a, b) {
95 | return a + b;
96 | }, 0);
97 |
98 | console.log(sum); // 15
99 | ```
100 |
101 | Todas estas funciones pueden ser encadenadas de la misma forma que hicimos con las primeras dos. El producto final
102 | dentro de una función sería:
103 |
104 | ```javascript
105 | function sumDigits(number) {
106 | return number
107 | .toString()
108 | .split('')
109 | .map(Number)
110 | .reduce(function(a, b) {
111 | return a + b;
112 | }, 0)
113 | }
114 |
115 | console.log(sumDigits(12345)); // 15
116 | ```
117 |
118 | 
119 |
--------------------------------------------------------------------------------
/Sesion-07/Ejemplo-03/assets/sum-digits.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-07/Ejemplo-03/assets/sum-digits.png
--------------------------------------------------------------------------------
/Sesion-07/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../Readme.md) > `Sesión 07`
2 |
3 | # Sesión 7: Programación funcional
4 |
5 | ## Objetivos
6 |
7 | Implementar los principios de inmutabilidad para crear funciones puras
8 |
9 | ---
10 |
11 | ## Tabla de Contenidos
12 |
13 | - **[Programación funcional](#programación-funcional)**
14 |
15 | - **[Inmutabilidad](#inmutabilidad)**
16 |
17 | - [Ejemplo 1: Mutando objetos](./Ejemplo-01)
18 |
19 | - **[Funciones puras](#funciones-puras)**
20 |
21 | - [Ejemplo 2: Creando funciones puras](./Ejemplo-02)
22 |
23 | - **[Funciones de primera clase](#funciones-de-primera-clase)**
24 |
25 | - **[Funciones de alto orden](#funciones-de-alto-orden)**
26 |
27 | - [Ejemplo 3: Sumando Dígitos](./Ejemplo-03)
28 |
29 | - [Reto 1: Flatten](./Reto-01)
30 |
31 | - [Reto 2: Compact](./Reto-02)
32 |
33 | - [Reto 3: Loop](./Reto-03)
34 |
35 | ---
36 |
37 | ## Programación funcional
38 |
39 | Como vimos en la sesión anterior existen distintos paradigmas de programación. La programación funcional es un paradigma
40 | declarativo, es decir, se enfoca en el _qué_ se desea lograr sin preocuparse mucho en el _cómo_ (el lenguaje de
41 | programación se encarga de esta parte).
42 |
43 | ```javascript
44 | const numbers = [1, 2, 3, 4, 5];
45 | const doubles = [];
46 |
47 | for(var i = 0; i < numbers.length; i++) {
48 | doubles.push(numbers[i] * 2);
49 | }
50 |
51 | console.log(numbers); // [1, 2, 3, 4, 5]
52 | console.log(doubles); // [2, 4, 6, 8, 10]
53 | ```
54 |
55 | Este es un ejemplo de código imperativo. Generalmente usar ciclos es programación imperativa pues queda del lado del
56 | programador controlar cuándo iniciar, cuándo terminar y qué hacer en cada ciclo.
57 |
58 | ```javascript
59 | const numbers = [1, 2, 3, 4, 5];
60 | const doubles = numbers.map(function(number) {
61 | return number * 2;
62 | });
63 |
64 | console.log(numbers); // [1, 2, 3, 4, 5]
65 | console.log(doubles); // [2, 4, 6, 8, 10]
66 | ```
67 |
68 | Esta es la forma declarativa del mismo código. Ambos fragmentos de código hacen exactamente lo mismo, crear un
69 | arreglo `doubles` con el doble de cada elemento del arreglo `numbers`. La diferencia con el segundo ejemplo es que
70 | hacemos uso del método `map()`, el programador no se encarga de controlar cuándo y dónde terminar el ciclo, solo se
71 | encarga del resultado, obtener el doble de cada elemento dentro de `numbers`.
72 |
73 | > El método map() crea un nuevo array con los resultados de la llamada a la función indicada aplicados a cada uno de
74 | > sus elementos.
75 |
76 | ---
77 |
78 | ## Inmutabilidad
79 |
80 | Decimos que algo es mutable cuando puede ser cambiado o modificado. Por lo tanto, inmutable es algo que no puede ser
81 | alterado. En términos de programación, las variables inmutables nunca cambian su valor. Este es un principio muy
82 | importante en la programación funcional, de hecho, lenguajes de programación como Elixir o Erlang no permiten la
83 | mutación de variables.
84 |
85 | En lugar de alterar una variable, creamos nuevos valores y reemplazamos los antiguos. Si bien JavaScript no es puramente
86 | funcional, es lo suficientemente flexible como para permitir o pretender serlo.
87 |
88 | Para llevar este concepto a la práctica es importante siempre preferir crear una nueva variable en lugar de intentar
89 | modificar la original. Esto se puede llevar a cabo con métodos como `map()` que no altera el arreglo original, o bien
90 | creando tus propias funciones inmutables.
91 |
92 | #### [Ejemplo 1: Mutando objetos](./Ejemplo-01)
93 |
94 | ---
95 |
96 | ## Funciones puras
97 |
98 | Para que una función pueda ser considerada pura debe cumplir dos reglas:
99 |
100 | 1. El valor retornado siempre es el mismo cuando se da el mismo valor de entrada.
101 |
102 | 2. No debe producir side effects (efectos secundarios).
103 |
104 | 
105 |
106 | El primer punto se refiere a que si ejecutamos la misma función varias veces con los mismos argumentos siempre
107 | obtendremos el mismo resultado.
108 |
109 | ```javascript
110 | function add(a, b) {
111 | return a + b;
112 | }
113 | ```
114 |
115 | Podemos llamar las veces que queramos la esta función de la forma `add(1, 2)` y sabemos que siempre vamos a obtener el
116 | mismo resultado `3`.
117 |
118 | ```javascript
119 | function randomNumber() {
120 | return Math.floor(Math.random() * 10);
121 | }
122 | ```
123 |
124 | Esta función no cumple la primera regla porque si la llamamos 10 veces, obtendremos cada vez un número aleatorio entre 1
125 | y 10. No podemos predecir el valor de retorno de esta función.
126 |
127 | Los side effects son un término más amplio que el anterior. A grandes rasgos significa modificar algo fuera de la
128 | función. Algunos ejemplos:
129 |
130 | 1. Mutar los parámetros que recibe una función como en el [Ejemplo 1](./Ejemplo-01).
131 |
132 | 2. Modificar cualquier variable fuera de la función.
133 |
134 | 3. Llamadas a una API.
135 |
136 | 4. `console.log()`
137 |
138 | La función anterior `add()` también cumple con la segunda regla, no produce side effects. Solamente está trabajando con
139 | las variables que recibe la función y siempre retorna un valor.
140 |
141 | #### [Ejemplo 2: Creando funciones puras](./Ejemplo-02)
142 |
143 | ---
144 |
145 | ## Funciones de primera clase
146 |
147 | En un lenguaje de programación se dice que una función es de primera clase cuando puede ser tratada como cualquier otra
148 | variable. Por ejemplo, cuando puede ser pasada como argumento a otras funciones o cuando puede ser asignada a una
149 | variable. Este comportamiento no es exclusivo de JavaScript, otros lenguajes de programación como R o Scala también
150 | cuentan con esta característica.
151 |
152 | Ya hemos guardado funciones anónimas en una variable anteriormente.
153 |
154 | ```javascript
155 | var square = function(number) {
156 | return number * number;
157 | }
158 |
159 | var squareOfFour = square(4);
160 |
161 | console.log(squareOfFour); // 16
162 | ```
163 |
164 | Por lo tanto, las expresiones de funciones como estas son consideradas funciones de primera clase.
165 |
166 | ---
167 |
168 | ## Funciones de alto orden
169 |
170 | Cuando una función recibe otra función como parámetro se le llama de alto orden o de orden superior. JavaScript nos
171 | proporciona varias funciones de alto orden para trabajar con estructuras de datos. Las más usadas son `map()`,
172 | `filter()` y `reduce()`.
173 |
174 | Al principio de la sesión vimos cómo funciona `map()`, aplica una función sobre cada elemento del arreglo. Es importante
175 | destacar que no muta el arreglo original.
176 |
177 | ```javascript
178 | const numbers = [1, 2, 3, 4, 5];
179 | const doubles = numbers.map(function(number) {
180 | return number * 2;
181 | });
182 |
183 | console.log(numbers); // [1, 2, 3, 4, 5]
184 | console.log(doubles); // [2, 4, 6, 8, 10]
185 | ```
186 |
187 | De igual forma `filter()` crea un nuevo arreglo, pero solo con aquellos elementos que retornen `true` por la función
188 | que actúa como predicado.
189 |
190 | ```JavaScript
191 | const numbers = [1, 2, 3, 4, 5];
192 |
193 | const evenNumbers = numbers.filter(function(number) {
194 | return number % 2 === 0;
195 | });
196 |
197 | console.log(evenNumbers); // [2, 4]
198 | ```
199 |
200 | Por último, `reduce()` acumula o reduce todos los elementos a un valor único según la función dada.
201 |
202 | ```JavaScript
203 | const numbers = [1, 2, 3, 4, 5];
204 |
205 | const sum = numbers.reduce(function(accumulator, currentValue) {
206 | return accumulator + currentValue;
207 | }, 0); // Initial value
208 |
209 | console.log(sum); // 15
210 | ```
211 |
212 | #### [Ejemplo 3: Sumando Dígitos](./Ejemplo-03)
213 |
214 | #### [Reto 1: Flatten](./Reto-01)
215 |
216 | #### [Reto 2: Compact](./Reto-02)
217 |
218 | #### [Reto 3: Loop](./Reto-03)
219 |
--------------------------------------------------------------------------------
/Sesion-07/Reto-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 07`](../Readme.md) > `Reto 01`
2 |
3 | ---
4 |
5 | ## Reto 1: Flatten
6 |
7 | ### Objetivos
8 |
9 | Implementar funciones de alto orden para manipular arreglos.
10 |
11 | #### Requisitos
12 |
13 | `N/A`
14 |
15 | #### Desarrollo
16 |
17 | Crear una función `flatten` que recibe un arreglo de arreglos y retorna un nuevo arreglo con todos los elementos del
18 | arreglo original.
19 |
20 | ```javascript
21 | function flatten(arrays) {
22 | // Code goes here...
23 | }
24 |
25 | const arrays = [[1, 2, 3], [4, 5], [6]];
26 | const array = flatten(arrays);
27 |
28 | console.log(array); // [1, 2, 3, 4, 5, 6]
29 | ```
30 |
--------------------------------------------------------------------------------
/Sesion-07/Reto-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 07`](../Readme.md) > `Reto 02`
2 |
3 | ---
4 |
5 | ## Reto 2: Compact
6 |
7 | ### Objetivos
8 |
9 | Implementar funciones de alto orden para manipular arreglos.
10 |
11 | #### Requisitos
12 |
13 | Haber terminado el [Reto 1](../Reto-01/Readme.md).
14 |
15 | #### Desarrollo
16 |
17 | Crear una función `compact` que recibe un arreglo y retorna un nuevo arreglo sin incluir los valores que sean falsy.
18 |
19 | ```javascript
20 | function compact(array) {
21 | // Code goes here...
22 | }
23 |
24 | const array = [0, 1, false, 2, '', 3];
25 | const compactedArray = compact(array);
26 |
27 | console.log(compactedArray); // [1, 2, 3]
28 | ```
29 |
--------------------------------------------------------------------------------
/Sesion-07/Reto-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 07`](../Readme.md) > `Reto 03`
2 |
3 | ---
4 |
5 | ## Reto 3: Loop
6 |
7 | ### Objetivos
8 |
9 | Implementar funciones de alto orden para manipular arreglos.
10 |
11 | #### Requisitos
12 |
13 | Haber terminado el [Reto 2](../Reto-02/Readme.md).
14 |
15 | #### Desarrollo
16 |
17 | Crear una función de alto orden `loop` que será similar a un `for`.
18 |
19 | Recibe tres argumentos: `start`, una función `test`, una función `update` y una función `body`.
20 |
21 | - El ciclo empieza en `start` y termina cuando `test` retorne `false`.
22 | - En cada iteración se ejecuta la función `body` dándole como argumento el valor actual de `start` actual.
23 | - Al final de cada ciclo se ejecuta la función `update`.
24 |
25 | ```javascript
26 | function loop(start, test, update, body) {
27 | // Code goes here...
28 | }
29 |
30 | const test = function(n) {
31 | return n > 0;
32 | }
33 |
34 | const update = function(n) {
35 | return n - 1;
36 | }
37 |
38 | loop(3, test, update, console.log);
39 | // 3
40 | // 2
41 | // 1
42 | ```
43 |
--------------------------------------------------------------------------------
/Sesion-07/Soluciones/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 07`](../Readme.md) > `Soluciones`
2 |
3 | ---
4 |
5 | ## Reto 1: Flatten
6 |
7 | ```javascript
8 | function flatten(arrays) {
9 | return arrays.reduce(function(flat, current) {
10 | return flat.concat(current);
11 | }, []);
12 | }
13 | ```
14 |
15 | ---
16 |
17 | ## Reto 2: Compact
18 |
19 | ```javascript
20 | function compact(array) {
21 | return array.filter(function(element) {
22 | return !!element;
23 | });
24 | }
25 | ```
26 |
27 | ---
28 |
29 | ## Reto 3: Loop
30 |
31 | ```javascript
32 | function loop(start, test, update, body) {
33 | for (let value = start; test(value); value = update(value)) {
34 | body(value);
35 | }
36 | }
37 | ```
38 |
--------------------------------------------------------------------------------
/Sesion-07/assets/pure-function.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-07/assets/pure-function.png
--------------------------------------------------------------------------------
/Sesion-08/Ejemplo-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 08`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 1: Instalación y configuración
6 |
7 | ### Objetivo
8 |
9 | Instalar y configurar webpack
10 |
11 | #### Requisitos
12 |
13 | Para este ejemplo necesitamos contar con la siguiente estructura de carpetas y archivos:
14 |
15 | ```
16 | demo
17 | |- /src
18 | |- index.html
19 | |- js
20 | |- index.js
21 | ```
22 |
23 | #### Desarrollo
24 |
25 | Para poder usar webpack debemos primero inicializar npm. Desde la consola o terminal debemos ejecutar `npm init -y`
26 | estando en la ruta donde se encuentra la carpeta recién creada. Esto nos mostrará un mensaje confirmando que se creó el
27 | archivo `package.json`
28 |
29 | 
30 |
31 | Ahora instalamos las siguientes librerías:
32 |
33 | ```text
34 | npm install --save-dev webpack webpack-cli html-webpack-plugin
35 | ```
36 |
37 | - **webpack:** Esta es la librería principal. [Documentación](https://webpack.js.org/)
38 | - **webpack-cli:** Nos permite ejecutar webpack desde la línea de
39 | comandos. [Documentación](https://webpack.js.org/api/cli/)
40 | - **html-webpack-plugin:** Simplifica la creación de archivos HTML que ejecuten bundles de
41 | webpack. [Documentación](https://webpack.js.org/plugins/html-webpack-plugin/)
42 |
43 | En la raíz del proyecto (al mismo nivel de `package.json`) vamos a crear un archivo de configuración llamado
44 | `webpack.config.js`, aquí definiremos el punto de entrada y el output.
45 |
46 | ```javascript
47 | const path = require('path');
48 |
49 | module.exports = {
50 | entry: './src/js/index.js',
51 | output: {
52 | path: path.resolve(__dirname, 'dist'),
53 | filename: 'bundle.js'
54 | }
55 | }
56 | ```
57 |
58 | Ahora importamos `HtmlWebpackPlugin` y lo agregamos a la propiedad `plugins`.
59 |
60 | ```javascript
61 | const path = require('path');
62 | const HtmlWebpackPlugin = require('html-webpack-plugin');
63 |
64 | module.exports = {
65 | entry: './src/js/index.js',
66 | output: {
67 | path: path.resolve(__dirname, 'dist'),
68 | filename: 'bundle.js'
69 | },
70 | plugins: [
71 | new HtmlWebpackPlugin({
72 | filename: 'index.html',
73 | template: './src/index.html'
74 | })
75 | ]
76 | }
77 | ```
78 |
79 | En nuestro archivo HTML agregaremos una estructura sencilla.
80 |
81 | ```html
82 |
83 |
84 |
85 |
86 | Webpack setup
87 |
88 |
89 |
Webpack Setup
90 |
91 |
92 | ```
93 |
94 | Por último vamos a reemplazar los scripts de nuestro `package.json`.
95 |
96 | ```json
97 | "scripts": {
98 | "build": "webpack --mode production"
99 | }
100 | ```
101 |
102 | Con este script podemos ejecutar `npm run build` en la línea de comandos para generar el bundle.
103 |
104 | 
105 |
--------------------------------------------------------------------------------
/Sesion-08/Ejemplo-01/assets/npm-init.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-08/Ejemplo-01/assets/npm-init.png
--------------------------------------------------------------------------------
/Sesion-08/Ejemplo-01/assets/npm-run-build.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-08/Ejemplo-01/assets/npm-run-build.png
--------------------------------------------------------------------------------
/Sesion-08/Ejemplo-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 08`](../Readme.md) > `Ejemplo 02`
2 |
3 | ---
4 |
5 | ## Ejemplo 2: Webpack DevServer
6 |
7 | ### Objetivo
8 |
9 | Instalar y configurar webpack dev server
10 |
11 | #### Requisitos
12 |
13 | Continuar con el código del ejemplo 1
14 |
15 | #### Desarrollo
16 |
17 | Webpack Dev Server nos puede ahorrar tiempo de desarrollo. Cada vez que guardemos algún cambio en nuestro código webpack
18 | automáticamente creará un bundle y abrirá nuestra aplicación en el navegador. Así no tenemos que generar el build
19 | manualmente cada vez que hagamos cambios.
20 |
21 | Empecemos instalando la librería.
22 |
23 | ```text
24 | npm install --save-dev webpack-dev-server
25 | ```
26 |
27 | En nuestro archivo de configuración de webpack vamos a agregar la propiedad `devServer`.
28 |
29 | ```javascript
30 | const path = require('path');
31 | const HtmlWebpackPlugin = require('html-webpack-plugin');
32 |
33 | module.exports = {
34 | entry: './src/js/index.js',
35 | output: {
36 | path: path.resolve(__dirname, 'dist'),
37 | filename: 'bundle.js'
38 | },
39 | plugins: [
40 | new HtmlWebpackPlugin({
41 | filename: 'index.html',
42 | template: './src/index.html'
43 | })
44 | ],
45 | devServer: {
46 | contentBase: path.resolve(__dirname, 'dist')
47 | }
48 | }
49 | ```
50 |
51 | Con la propiedad `contentBase` le decimos a webpack qué carpeta queremos que use al iniciar el servidor local. Recuerda
52 | que `src` es nuestro código fuente, es aquí donde desarrollamos la aplicación. La carpeta `dist` es código final para
53 | distribución.
54 |
55 | Lo siguiente es agregar un nuevo script en `package.json` que usaremos para iniciar webpack dev server.
56 |
57 | ```json
58 | "scripts": {
59 | "start": "webpack serve --mode development --open",
60 | "build": "webpack --mode production"
61 | }
62 | ```
63 |
64 | La opción `--open` es para abrir el HTML inmediatamente. Ahora podemos ejecutar `npm run start` para iniciar un servidor
65 | local con webpack. Cualquier cambio que se haga al código generará un nuevo bundle y actualizará el navegador
66 | automáticamente.
67 |
68 | 
69 |
--------------------------------------------------------------------------------
/Sesion-08/Ejemplo-02/assets/dev-server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-08/Ejemplo-02/assets/dev-server.png
--------------------------------------------------------------------------------
/Sesion-08/Ejemplo-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 08`](../Readme.md) > `Ejemplo 0`
2 |
3 | ---
4 |
5 | ## Ejemplo 3: Webpack y Babel
6 |
7 | ### Objetivo
8 |
9 | Instalar y configurar babel junto con webpack
10 |
11 | #### Requisitos
12 |
13 | Continuar con el código del reto 1
14 |
15 | #### Desarrollo
16 |
17 | Vamos a empezar instalando las siguientes librerías:
18 |
19 | ```text
20 | npm install --save-dev @babel/core @babel/preset-env babel-loader
21 | ```
22 |
23 | - **@babel/core:** Esta es la librería principal. [Documentación](https://babeljs.io/docs/en/babel-core)
24 | - **@babel/preset-env:** Preset con las características más recientes de
25 | JavaScript. [Documentación](https://babeljs.io/docs/en/babel-preset-env)
26 | - **babel-loader:** Loader de webpack. [Documentación](https://webpack.js.org/loaders/babel-loader/)
27 |
28 | En nuestro archivo de configuración de webpack agregamos el nuevo loader.
29 |
30 | ```javascript
31 | const path = require('path');
32 | const HtmlWebpackPlugin = require('html-webpack-plugin');
33 |
34 | module.exports = {
35 | entry: './src/js/index.js',
36 | output: {
37 | path: path.resolve(__dirname, 'dist'),
38 | filename: 'bundle.js'
39 | },
40 | plugins: [
41 | new HtmlWebpackPlugin({
42 | filename: 'index.html',
43 | template: './src/index.html'
44 | })
45 | ],
46 | module: {
47 | rules: [
48 | { test: /\.css$/, use: ['style-loader', 'css-loader'] },
49 | {
50 | test: /\.m?js$/,
51 | exclude: /node_modules/,
52 | use: {
53 | loader: "babel-loader",
54 | options: {
55 | presets: ['@babel/preset-env']
56 | }
57 | }
58 | },
59 | ]
60 | },
61 | devServer: {
62 | contentBase: path.resolve(__dirname, 'dist')
63 | }
64 | }
65 | ```
66 |
67 | Con esto, cada vez que webpack encuentre un archivo `.js` lo pasará por babel primero antes de hacer el bundle. Lo
68 | último que nos falta es crear un nuevo archivo en la raíz `babel.config.json`, aquí es donde configuramos babel y le
69 | indicamos el preset que debe usar.
70 |
71 | ```json
72 | {
73 | "presets": ["@babel/preset-env"]
74 | }
75 | ```
76 |
77 | La estructura final que tenemos es la siguiente:
78 |
79 | ```
80 | demo
81 | |- /dist
82 | |- /node_modules
83 | |- /src
84 | | |- index.html
85 | | |- /css
86 | | |- styles.css
87 | | |- /js
88 | | |- index.js
89 | |- babel.config.json
90 | |- package.json
91 | |- package-lock.json
92 | |- webpack.config.js
93 | ```
94 |
--------------------------------------------------------------------------------
/Sesion-08/Postwork/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 08`](../Readme.md) > `Postwork`
2 |
3 | ---
4 |
5 | ## Postwork
6 |
7 | ### Objetivos
8 |
9 | Configurar un ambiente de desarrollo para una aplicación nueva
10 |
11 | #### Requisitos
12 |
13 | `N/A`
14 |
15 | #### Desarrollo
16 |
17 | Como proyecto final vas a crear un buscador de recetas con las siguientes especificaciones:
18 |
19 | - Mostrar en la UI un input para ingresar texto y un botón para generar la búsqueda.
20 | - Utilizar la siguiente API para obtener los resultados: [TheMealDB](https://www.themealdb.com/api.php)
21 | - Mostrar los resultados usando las imágenes de las recetas.
22 | - Al seleccionar una imagen se deben desplegar los detalles de la receta, es decir, los ingredientes y las
23 | instrucciones.
24 | - Mostrar en la UI un botón secundario para desplegar una receta aleatoria.
25 |
26 | El acomodo de todos los elementos junto con el diseño es completamente libre, se pueden usar librerías que ayuden con la
27 | UI como Bootstrap, Foundation, Materialize, etc.
28 |
29 | Esta es la primera parte de ese proyecto y consiste en dejar listo el ambiente de desarrollo:
30 |
31 | - Desarrolla los mockups de la aplicación, esto te permitirá visualizar cómo se van a acomodar todos los elementos mucho
32 | antes de crear el código. Es parte fundamental en el desarrollo del software.
33 | - Instalar y configurar Webpack, Babel y Webpack Dev Server.
34 | - Instalar las librerías que se vayan a utilizar (Bootstrap, Materialize, Foundation, etc.).
35 | - Configurar los loaders necesarios para los estilos, se puede utilizar CSS o SASS.
36 |
37 | En las sesiones que vienen aprenderás todo lo necesario para finalizar el proyecto, desde cómo manipular elementos del
38 | DOM hasta cómo consumir la información de una API.
39 |
--------------------------------------------------------------------------------
/Sesion-08/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../Readme.md) > `Sesión 08`
2 |
3 | # Sesión 8: Webpack y Babel
4 |
5 | ## Objetivos
6 |
7 | - Procesar aplicaciones modernas de JavaScript con Webpack para producir uno o más bundles
8 | - Compilar las nuevas características de JavaScript en código compatible con todos los navegadores
9 |
10 | ---
11 |
12 | ## Tabla de Contenidos
13 |
14 | - **[¿Qué es ECMAScript 6?](#qué-es-ecmascript-6)**
15 |
16 | - **[ES6 Modules](#es6-modules)**
17 |
18 | - **[Webpack](#webpack)**
19 |
20 | - [Ejemplo 1: Instalación y configuración](./Ejemplo-01/Readme.md)
21 |
22 | - [Webpack DevServer](#webpack-devserver)
23 |
24 | - [Ejemplo 2: Webpack DevServer](./Ejemplo-02/Readme.md)
25 |
26 | - [Loaders](#loaders)
27 |
28 | - [Reto 1: Webpack y CSS](./Reto-01/Readme.md)
29 |
30 | - **[Babel](#babel)**
31 |
32 | - [Ejemplo 3: Webpack y Babel](./Ejemplo-03/Readme.md)
33 |
34 | - [Reto 2: Assets en Webpack](./Reto-02/Readme.md)
35 |
36 | ---
37 |
38 | ## ¿Qué es ECMAScript 6?
39 |
40 | Ecma International es una organización sin ánimos de lucro encargada de regular el funcionamiento de varios estándares
41 | en la industria de la computación. Así surge ECMAScript 1 (ES1) en 1997 como la primera versión del estándar de
42 | JavaScript. Normalmente se usa el término ECMAScript para referirse al estándar y JavaScript para hablar del lenguaje en
43 | la práctica.
44 |
45 | En 2009 se lanzó ECMAScript 5 (ES5) con muchas mejoras de las versiones anteriores. Sin embargo, a los navegadores les
46 | tomó varios años ser compatibles con esta versión.
47 |
48 | En 2015 surge ECMAScript 2015, que también se le conoce como ES6 o ES2015. A partir de este año se decide lanzar una
49 | nueva versión de manera anual cambiando el número del año en cada versión, es decir, ES2016, ES2017, ES2018, etc.
50 |
51 | Actualmente la versión ES6 es compatible con la mayoría de los navegadores. Para usar características de versiones
52 | superiores es necesario un proceso de transpiling y polyfilling que convierte el código en ES5, garantizando así la
53 | compatibilidad del código en navegadores viejos.
54 |
55 | ---
56 |
57 | ## ES6 Modules
58 |
59 | En JavaScript, un módulo es una unidad independiente de código que puede ser reutilizado. Los módulos permiten exponer
60 | ciertas partes del código que serán usadas por otros módulos. Esto nos da la flexibilidad suficiente para mantener
61 | nuestro código mejor organizado en múltiples scripts. Dada la siguiente estructura:
62 |
63 | ```
64 | app/
65 | |- app.js
66 | |- helpers.js
67 | ```
68 |
69 | En `helpers.js` podemos tener algunas funciones que podrán ser usadas en otras partes del código:
70 |
71 | ```javascript
72 | const sum = (a, b) => a + b;
73 |
74 | const multiply = (a, b) => a * b;
75 | ```
76 |
77 | Podemos exportar cada módulo de manera independiente usando el keyword `export`.
78 |
79 | ```javascript
80 | export const sum = (a, b) => a + b;
81 |
82 | export const multiply = (a, b) => a * b;
83 | ```
84 |
85 | O bien en una sola sentencia.
86 |
87 | ```javascript
88 | const sum = (a, b) => a + b;
89 |
90 | const multiply = (a, b) => a * b;
91 |
92 | export { sum, multiply }
93 | ```
94 |
95 | Para usar estas funciones en `app.js` usamos el keyword `import` junto con `from` para definir la ruta del archivo.
96 |
97 | ```javascript
98 | import { sum, multiply } from './helpers.js'
99 |
100 | console.log(sum(3, 2)); // 5
101 |
102 | console.log(multiply(3, 2)); // 6
103 | ```
104 |
105 | ---
106 |
107 | ## Webpack
108 |
109 | 
110 |
111 | Webpack es una herramienta muy usada en el desarrollo de aplicaciones en JavaScript modernas. Después de procesar la
112 | aplicación, webpack genera internamente un grafo de dependencias lo que le permite generar uno o más _bundles_. Este
113 | _bundle_ contiene el código optimizado de todos los módulos y dependencias de tu aplicación.
114 |
115 | Webpack solamente es capaz de transpilar los módulos de ES6 `import` y `export`, por lo que si queremos usar cualquier
116 | otra característica de ES6+ es necesario usar un transpilador como Babel.
117 |
118 | #### [Ejemplo 1: Instalación y configuración](./Ejemplo-01/Readme.md)
119 |
120 | ### Webpack DevServer
121 |
122 | Con la configuración del ejemplo 1 podemos generar un bundle optimizado para producción. Sin embargo, mientras estamos
123 | desarrollando nuestra aplicación resulta tedioso el proceso que debemos seguir cada que hagamos un cambio.
124 |
125 | - Generar cambios.
126 | - Crear un nuevo bundle ejecutando `npm run build`.
127 | - Abrir la versión dentro de `dist` en el navegador para ver los cambios.
128 |
129 | Afortunadamente contamos con [webpack-dev-server](https://webpack.js.org/configuration/dev-server) que nos facilita el
130 | proceso de desarrollo, ya que nos genera un servidor local que genera un bundle cada vez que realicemos cambios a
131 | nuestro código.
132 |
133 | #### [Ejemplo 2: Webpack DevServer](./Ejemplo-02/Readme.md)
134 |
135 | ### Loaders
136 |
137 | Webpack solamente entiende archivos de JavaScript y JSON. Usando _loaders_ webpack puede procesar otro tipo de archivos
138 | y convertirlos en módulos que serán agregados al grafo de dependencias.
139 |
140 | #### [Reto 1: Webpack y CSS](./Reto-01/Readme.md)
141 |
142 | ---
143 |
144 | ## Babel
145 |
146 | 
147 |
148 | [Babel](https://babeljs.io/) es usado principalmente para convertir código ES6+ en una versión compatible con
149 | navegadores y ambientes tanto actuales como anteriores.
150 |
151 | ```javascript
152 | // Babel Input: ES6 arrow function
153 | [1, 2, 3].map((n) => n + 1);
154 |
155 | // Babel Output: ES5 equivalent
156 | [1, 2, 3].map(function(n) {
157 | return n + 1;
158 | });
159 | ```
160 |
161 | Las transformaciones de código que se realizan a través de _plugins_. Cada plugin le dice a babel cómo transformar el
162 | código. Por ejemplo, el plugin `@babel/plugin-transform-arrow-functions` permite transformar arrow functions.
163 |
164 | En lugar de agregar todos los plugins que queremos implementar uno por uno podemos usar _presets_. Estos son conjuntos
165 | ya preestablecidos de ciertos plugins. Por ejemplo, el preset `@babel/preset-env` contiene todos los plugins necesarios
166 | para soportar las versiones modernas de JavaScript.
167 |
168 | #### [Ejemplo 3: Webpack y Babel](./Ejemplo-03/Readme.md)
169 |
170 | #### [Reto 2: Assets en Webpack](./Reto-02/Readme.md)
171 |
--------------------------------------------------------------------------------
/Sesion-08/Reto-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 08`](../Readme.md) > `Reto 01`
2 |
3 | ---
4 |
5 | ## Reto 1: Webpack y CSS
6 |
7 | ### Objetivos
8 |
9 | Configurar loaders para que webpack pueda procesar archivos `.css`
10 |
11 | #### Requisitos
12 |
13 | Continuar con el código del ejemplo 2.
14 |
15 | #### Desarrollo
16 |
17 | Revisar la [documentación](https://webpack.js.org/loaders/) de webpack. Instalar y configurar los loaders necesarios
18 | para procesar estilos. Centrar el header para confirmar que se están procesando los estilos correctamente.
19 |
--------------------------------------------------------------------------------
/Sesion-08/Reto-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 08`](../Readme.md) > `Reto 02`
2 |
3 | ---
4 |
5 | ## Reto 2: Assets en Webpack
6 |
7 | ### Objetivos
8 |
9 | Configurar webpack para procesar assets
10 |
11 | #### Requisitos
12 |
13 | Continuar con el código del ejemplo 3.
14 |
15 | #### Desarrollo
16 |
17 | En el reto anterior se configuró webpack para que pueda procesar estilos. Webpack no se limita solamente a JavaScript y
18 | CSS, nos permite procesar cualquier tipo de archivo con el loader o módulo apropiado.
19 |
20 | Revisar la [documentación](https://webpack.js.org/loaders/) de webpack. Hacer los cambios necesarios para poder procesar
21 | imágenes.
22 |
--------------------------------------------------------------------------------
/Sesion-08/Soluciones/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 08`](../Readme.md) > `Soluciones`
2 |
3 | ---
4 |
5 | ## Reto 1: Webpack y CSS
6 |
7 | Estructura de archivos:
8 |
9 | ```
10 | demo
11 | |- /src
12 | |- index.html
13 | |- js
14 | |- index.js
15 | |- css
16 | |- styles.css
17 | ```
18 |
19 | Instalar loaders
20 |
21 | ```text
22 | npm install --save-dev css-loader style-loader
23 | ```
24 |
25 | - **css-loader:** le permite a webpack recolectar todos los estilos que encuentre y colocarlos en un string.
26 | - **style-loader:** inyecta los estilos generados por `css-loader` en el DOM.
27 |
28 | `webpack.config.js`
29 |
30 | ```javascript
31 | const path = require('path');
32 | const HtmlWebpackPlugin = require('html-webpack-plugin');
33 |
34 | module.exports = {
35 | entry: './src/js/index.js',
36 | output: {
37 | path: path.resolve(__dirname, 'dist'),
38 | filename: 'bundle.js'
39 | },
40 | plugins: [
41 | new HtmlWebpackPlugin({
42 | filename: 'index.html',
43 | template: './src/index.html'
44 | })
45 | ],
46 | module: {
47 | rules: [
48 | { test: /\.css$/, use: ['style-loader', 'css-loader'] },
49 | ]
50 | },
51 | devServer: {
52 | contentBase: path.resolve(__dirname, 'dist')
53 | }
54 | }
55 | ```
56 |
57 | `styles.css`
58 |
59 | ```css
60 | h1 {
61 | text-align: center;
62 | }
63 | ```
64 |
65 | `index.js`
66 |
67 | ```javascript
68 | import '../css/styles.css'
69 | ```
70 |
71 | ---
72 |
73 | ## Reto 2: Assets en Webpack
74 |
75 | Instalar loaders
76 |
77 | ```text
78 | npm install --save-dev html-loader
79 | ```
80 |
81 | `webpack.config.js`
82 |
83 | ```javascript
84 | const path = require('path');
85 | const HtmlWebpackPlugin = require('html-webpack-plugin');
86 |
87 | module.exports = {
88 | entry: './src/js/index.js',
89 | output: {
90 | path: path.resolve(__dirname, 'dist'),
91 | filename: 'bundle.js'
92 | },
93 | plugins: [
94 | new HtmlWebpackPlugin({
95 | filename: 'index.html',
96 | template: './src/index.html'
97 | })
98 | ],
99 | module: {
100 | rules: [
101 | { test: /\.css$/, use: ['style-loader', 'css-loader'] },
102 | {
103 | test: /\.m?js$/,
104 | exclude: /node_modules/,
105 | use: {
106 | loader: "babel-loader",
107 | options: {
108 | presets: ['@babel/preset-env']
109 | }
110 | }
111 | },
112 | {
113 | test: /\.(png|svg|jpg|jpeg|gif)$/i,
114 | type: 'asset/resource',
115 | },
116 | {
117 | test: /\.html$/i,
118 | loader: 'html-loader',
119 | },
120 | ]
121 | },
122 | devServer: {
123 | contentBase: path.resolve(__dirname, 'dist')
124 | }
125 | }
126 | ```
127 |
--------------------------------------------------------------------------------
/Sesion-08/assets/babel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-08/assets/babel.png
--------------------------------------------------------------------------------
/Sesion-08/assets/webpack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-08/assets/webpack.png
--------------------------------------------------------------------------------
/Sesion-09/Ejemplo-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 09`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 1: Inspeccionando el DOM
6 |
7 | ### Objetivo
8 |
9 | Identificar de manera práctica la variable global `document` como representación del código HTML.
10 |
11 | #### Requisitos
12 |
13 | Visitar cualquier página web y abrir la consola del navegador. Para este ejemplo trabajaremos sobre la página
14 | de [Google](https://www.google.com/).
15 |
16 | #### Desarrollo
17 |
18 | En la consola vamos a poner la variable global `document`. Esto nos va a mostrar un objeto que representa la página web,
19 | contiene todas las etiquetas HTML de la página.
20 |
21 | 
22 |
23 | Si seguimos expandiendo las etiquetas podemos ver cómo se selecciona en la pantalla el área que representa el objeto o
24 | la etiqueta por la que estamos pasando el mouse.
25 |
26 | 
27 |
28 | Es importante recordar que aunque se muestre como si fuera código HTML en la consola, `document` es un objeto de
29 | JavaScript, y todas las etiquetas dentro de este también son objetos. Más adelante veremos cómo podemos manipular estos
30 | objetos y ver los cambios reflejados en la pantalla.
31 |
--------------------------------------------------------------------------------
/Sesion-09/Ejemplo-01/assets/document-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-09/Ejemplo-01/assets/document-1.png
--------------------------------------------------------------------------------
/Sesion-09/Ejemplo-01/assets/document-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-09/Ejemplo-01/assets/document-2.png
--------------------------------------------------------------------------------
/Sesion-09/Ejemplo-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 09`](../Readme.md) > `Ejemplo 02`
2 |
3 | ---
4 |
5 | ## Ejemplo 2: Cambiando el DOM
6 |
7 | ### Objetivo
8 |
9 | Modificar el DOM agregando nodos hijos a un elemento.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 | Ejemplo 2: Cambiando el DOM
19 |
20 |
21 |
One
22 |
Two
23 |
Three
24 |
25 |
28 |
29 |
30 | ```
31 |
32 | Opcionalmente se puede manejar el código de JavaScript en un archivo independiente como se ha trabajado en sesiones
33 | anteriores.
34 |
35 | #### Desarrollo
36 |
37 | En este ejemplo vamos a ver cómo cambiar la estructura del DOM. Lo primero es seleccionar todas las etiquetas `p` del
38 | documento, esto lo podemos lograr con el método `getElementsByTagName`.
39 |
40 | ```javascript
41 | const paragraphs = document.body.getElementsByTagName("p");
42 |
43 | console.log('Colección de nodos: ', paragraphs);
44 |
45 | console.log('Primer nodo: ', paragraphs[0]);
46 | console.log('Segundo nodo: ', paragraphs[1]);
47 | console.log('Tercer nodo: ', paragraphs[2]);
48 | ```
49 |
50 | Podemos ver en consola que `paragraphs` representa una colección con las tres etiquetas `p` de nuestro documento.
51 |
52 | 
53 |
54 | Vamos a cambiar el orden de estos nodos con el método `insertBefore`, el cual recibe dos argumentos, el primero es el
55 | nodo a insertar justo antes del nodo proporcionado como segundo argumento.
56 |
57 | 
58 |
59 | Al abrir la página vemos que el orden de los párrafos cambia. Un nodo puede existir en el documento en un solo lugar a
60 | la vez, por lo que al insertar `Three` antes de `One` primero se elimina del final de la lista para insertarse al
61 | principio. **Todas las operaciones que impliquen insertar nodos tienen como efecto secundario la eliminación del nodo en
62 | la posición actual** si es que ya existe en el DOM.
63 |
--------------------------------------------------------------------------------
/Sesion-09/Ejemplo-02/assets/nodes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-09/Ejemplo-02/assets/nodes.png
--------------------------------------------------------------------------------
/Sesion-09/Ejemplo-02/assets/paragraphs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-09/Ejemplo-02/assets/paragraphs.png
--------------------------------------------------------------------------------
/Sesion-09/Ejemplo-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 09`](../Readme.md) > `Ejemplo 03`
2 |
3 | ---
4 |
5 | ## Ejemplo 3: Crear nuevos nodos
6 |
7 | ### Objetivo
8 |
9 | Crear nuevos nodos para manipular la estructura del DOM.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 | Ejemplo 3: Crear nuevos nodos
19 |
20 |
21 |
22 | No book can ever be finished. While working on it we learn
23 | just enough to find it immature the moment we turn away
24 | from it.
25 |
26 |
27 |
30 |
31 |
32 | ```
33 |
34 | Opcionalmente se puede manejar el código de JavaScript en un archivo independiente como se ha trabajado en sesiones anteriores.
35 |
36 | #### Desarrollo
37 |
38 | Obtener un nuevo nodo normalmente consta de tres pasos, el primero es crear el nodo en sí con `document.createElement`,
39 | el segundo paso es crear otro nodo de texto con `document.createTextNode`, el último paso es agregar el texto como hijo
40 | del nodo creado en el primero paso.
41 |
42 | En este ejemplo vamos a crear una función que se encargue de estos tres pasos, la función recibirá dos argumentos, el
43 | primero será el tipo de nodo que queremos, y el segundo el hijo. Usaremos esta función para agregar el autor de la frase
44 | que ya tenemos en nuestro documento.
45 |
46 | ```javascript
47 | function createNode(type, child) {
48 | const node = document.createElement(type);
49 | const text = document.createTextNode(child);
50 |
51 | node.appendChild(text);
52 |
53 | return node;
54 | }
55 |
56 | console.log(createNode('h1', 'Hello World')); //
Hello World
57 | ```
58 |
59 | Hasta ahora está bien, pero podemos extender aún más la funcionalidad de esta función, el segundo parámetro no
60 | necesariamente debe ser un string, también podría ser un nodo. De esta forma podríamos anidar nodos con la misma función.
61 |
62 | ```javascript
63 | function createNode(type, child) {
64 | const node = document.createElement(type);
65 |
66 | if(typeof child === "string") {
67 | const text = document.createTextNode(child);
68 | node.appendChild(text);
69 | } else {
70 | node.appendChild(child);
71 | }
72 |
73 | return node;
74 | }
75 |
76 | console.log(createNode('h1', createNode('strong', 'Hello World')));
77 | /**
78 | *
79 | * Hello World
80 | *
81 | **/
82 | ```
83 |
84 | Con esta función es ahora más fácil crear nodos con sus respectivos hijos. Ahora podemos seleccionar el nodo que
85 | contiene la frase célebre con su respectivo id y agregar el autor.
86 |
87 | ```javascript
88 | document.getElementById("quote")
89 | .appendChild(
90 | createNode("footer", createNode("strong", "- Karl Popper"))
91 | )
92 | ```
93 | > Se puede escribir en una sola línea. Es buena práctica agregar los saltos de línea y la indentación para facilitar la
94 | > lectura.
95 |
96 | 
97 |
--------------------------------------------------------------------------------
/Sesion-09/Ejemplo-03/assets/create-nodes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-09/Ejemplo-03/assets/create-nodes.png
--------------------------------------------------------------------------------
/Sesion-09/Reto-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 09`](../Readme.md) > `Reto 01`
2 |
3 | ---
4 |
5 | ## Reto 1: Reemplazar imágenes
6 |
7 | ### Objetivos
8 |
9 | Manipular el DOM creando nuevos nodos y reemplazándolos con existentes.
10 |
11 | #### Requisitos
12 |
13 | Partir del siguiente documento HTML:
14 |
15 | ```html
16 |
17 |
18 |
19 | Reto 1: Reemplazar Imágenes
20 |
21 |
22 |
Images
23 |
24 |
25 |
26 |
27 |
28 |
31 |
32 |
33 | ```
34 |
35 | #### Desarrollo
36 |
37 | Reemplazar todas las imágenes del documento (etiquetas ``) con el texto que contienen en el atributo `alt`.
38 |
--------------------------------------------------------------------------------
/Sesion-09/Reto-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 09`](../Readme.md) > `Reto 02`
2 |
3 | ---
4 |
5 | ## Reto 2: Crear una tabla
6 |
7 | ### Objetivos
8 |
9 | Crear una tabla en el DOM a partir de un arreglo de objetos.
10 |
11 | #### Requisitos
12 |
13 | Partir del siguiente documento HTML:
14 |
15 | ```html
16 |
17 |
18 |
19 | Reto 2: Crear una tabla
20 |
21 |
22 |
Mountains
23 |
24 |
25 |
26 |
38 |
39 |
40 | ```
41 |
42 | #### Desarrollo
43 |
44 | En HTML podemos construir tablas usando etiquetas como las siguientes:
45 |
46 | ```HTML
47 |
48 |
49 |
Name
50 |
Height
51 |
Place
52 |
53 |
54 |
Kilimanjaro
55 |
5895
56 |
Tanzania
57 |
58 |
59 | ```
60 |
61 | La etiqueta `
` define la tabla, cada fila está compuesta por la etiqueta `
`. Dentro de cada fila podemos
62 | crear celdas como headers `
` o celdas regulares `
`.
63 |
64 | Crear una tabla a partir de la información proporcionada por `data`, un arreglo de objetos con las propiedades `name`,
65 | `height` y `place`. La tabla debe contener una columna por cada propiedad, y una fila por cada objeto. Adicionalmente
66 | debe contener una fila con headers `
` listando el nombre de cada columna, el cual corresponde a las propiedades del
67 | objeto.
68 |
69 | Alinear hacia la derecha las celdas que contengan valores numéricos asignando a la propiedad `style.textAlign` el
70 | valor `right`.
71 |
--------------------------------------------------------------------------------
/Sesion-09/Soluciones/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 09`](../Readme.md) > `Soluciones`
2 |
3 | ---
4 |
5 | ## Reto 1: Reemplazar imágenes
6 |
7 | ```javascript
8 | const images = document.body.getElementsByTagName("img");
9 |
10 | for (let i = images.length - 1; i >= 0; i--) {
11 | const image = images[i];
12 | if (image.alt) {
13 | const text = document.createTextNode(image.alt);
14 | image.parentNode.replaceChild(text, image);
15 | }
16 | }
17 | ```
18 |
19 | ---
20 |
21 | ## Reto 2: Crear una tabla
22 |
23 | ```javascript
24 | function buildTable(data) {
25 | const table = document.createElement("table");
26 |
27 | const fields = Object.keys(data[0]);
28 | const headRow = document.createElement("tr");
29 | fields.forEach(function(field) {
30 | const headCell = document.createElement("th");
31 | headCell.appendChild(document.createTextNode(field));
32 | headRow.appendChild(headCell);
33 | });
34 | table.appendChild(headRow);
35 |
36 | data.forEach(function(object) {
37 | const row = document.createElement("tr");
38 | fields.forEach(function(field) {
39 | const cell = document.createElement("td");
40 | cell.appendChild(document.createTextNode(object[field]));
41 | if (typeof object[field] == "number") {
42 | cell.style.textAlign = "right";
43 | }
44 | row.appendChild(cell);
45 | });
46 | table.appendChild(row);
47 | });
48 |
49 | return table;
50 | }
51 |
52 | document.getElementById("mountains")
53 | .appendChild(buildTable(data));
54 | ```
55 |
56 |
--------------------------------------------------------------------------------
/Sesion-09/assets/document.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-09/assets/document.png
--------------------------------------------------------------------------------
/Sesion-09/assets/links.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-09/assets/links.png
--------------------------------------------------------------------------------
/Sesion-09/assets/tree.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-09/assets/tree.png
--------------------------------------------------------------------------------
/Sesion-10/Ejemplo-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 10`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 1: Eventos en nodos del DOM
6 |
7 | ### Objetivo
8 |
9 | Agregar event handlers a distintos nodos.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 | Ejemplo 1: Eventos en nodos del DOM
19 |
20 |
21 |
Hello World
22 |
23 |
24 |
25 |
26 |
27 |
30 |
31 |
32 | ```
33 |
34 | Opcionalmente se puede manejar el código de JavaScript en un archivo independiente como se ha trabajado en sesiones
35 | anteriores.
36 |
37 | #### Desarrollo
38 |
39 | En este ejemplo vamos a cambiar el color del título agregando event handlers a todos los botones del documento. Tanto el
40 | título como los botones cuentan con un id único por lo que podemos usar `getElementById`.
41 |
42 | ```javascript
43 | const title = document.getElementById('title');
44 |
45 | const redButton = document.getElementById('red');
46 |
47 | const blueButton = document.getElementById('blue');
48 |
49 | const blackButton = document.getElementById('black');
50 | ```
51 |
52 | Ahora usaremos el método `addEventListener` para registrar un handler a cada botón. El cambio de color lo haremos
53 | asignando la propiedad `style` del nodo `title`.
54 |
55 | ```javascript
56 | redButton.addEventListener("click", function() {
57 | title.style = "color: red;";
58 | });
59 |
60 | blueButton.addEventListener("click", function() {
61 | title.style = "color: blue;";
62 | });
63 |
64 | blackButton.addEventListener("click", function() {
65 | title.style = "color: black;";
66 | });
67 | ```
68 |
69 | 
70 |
--------------------------------------------------------------------------------
/Sesion-10/Ejemplo-01/assets/colors.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-10/Ejemplo-01/assets/colors.gif
--------------------------------------------------------------------------------
/Sesion-10/Ejemplo-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 10`](../Readme.md) > `Ejemplo 02`
2 |
3 | ---
4 |
5 | ## Ejemplo 2: Usando event object
6 |
7 | ### Objetivo
8 |
9 | Implementar propiedades del event object para manipular el DOM.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 | Ejemplo 2: Usando event object
19 |
20 |
21 |
Hello World!
22 |
23 |
24 |
25 |
28 |
29 |
30 | ```
31 |
32 | Opcionalmente se puede manejar el código de JavaScript en un archivo independiente como se ha trabajado en sesiones
33 | anteriores.
34 |
35 | #### Desarrollo
36 |
37 | En el ejemplo anterior vimos como cambiar las propiedades de un nodo a través de event handlers. En este ejemplo vamos a
38 | usar la información contenida en el event object para manipular el DOM.
39 |
40 | ```javascript
41 | const title = document.getElementById('title');
42 |
43 | const input = document.getElementById('text');
44 | ```
45 |
46 | Ahora usaremos el método `addEventListener` para registrar un handler en el ``, el evento que queremos escuchar
47 | es `input`, el cual se dispara cuando hay un cambio en el nodo.
48 |
49 | ```javascript
50 | input.addEventListener("input", function(event) {
51 | title.textContent = event.target.value;
52 | });
53 | ```
54 |
55 | La propiedad `textContent` nos permite obtener o cambiar el contenido de texto de un nodo. La propiedad `target` del
56 | event object es una referencia al nodo que lanzó el evento, en este caso nuestro ``, por lo que podemos acceder
57 | al atributo `value` de ese elemento.
58 |
59 | 
60 |
--------------------------------------------------------------------------------
/Sesion-10/Ejemplo-02/assets/changing-text.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-10/Ejemplo-02/assets/changing-text.gif
--------------------------------------------------------------------------------
/Sesion-10/Ejemplo-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 10](../Readme.md) > `Ejemplo 03`
2 |
3 | ---
4 |
5 | ## Ejemplo 3: Key events
6 |
7 | ### Objetivo
8 |
9 | Determinar las teclas presionadas al disparar un evento.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 | Ejemplo 3: Key events
20 |
21 |
22 |
23 |
Press Enter to turn this page blue.
24 |
Press Ctrl + Enter to turn this page orange.
25 |
26 |
29 |
30 |
31 | ```
32 |
33 | Opcionalmente se puede manejar el código de JavaScript en un archivo independiente como se ha trabajado en sesiones
34 | anteriores.
35 |
36 | #### Desarrollo
37 |
38 | En este ejemplo vamos a ver cómo realizar un cambio en el DOM al presionar una tecla o combinación de teclas.
39 | Agregaremos un event handler a la global `window` de tipo `keydown` que se ejecuta al presionar una tecla.
40 |
41 | ```javascript
42 | window.addEventListener("keydown", function (event) {
43 | if (event.key == "Enter") {
44 | document.body.style.background = "lightblue";
45 | }
46 |
47 | if (event.key == "Enter" && event.ctrlKey) {
48 | document.body.style.background = "orange";
49 | }
50 | });
51 | ```
52 |
53 | Estamos leyendo dos propiedades del event object, la primera es `key` que nos dice qué tecla fue presionada. La segunda
54 | propiedad que nos interesa es `ctrlKey` que nos ayuda a determinar si la tecla `ctrl` estuvo presionada cuando se lanzó
55 | el evento. Vamos a cambiar el color de fondo del documento, si se presiona solamente la tecla `Enter` el color será
56 | azul, pero si se presiona la combinación de teclas `Ctrl + Enter` entonces el color será naranja.
57 |
58 | ```javascript
59 | window.addEventListener("keyup", function (event) {
60 | if (event.key == "Enter") {
61 | document.body.style.background = "";
62 | }
63 | });
64 | ```
65 |
66 | Por último, necesitamos regresar al color por default cuando las teclas fueron soltadas, para eso utilizamos el
67 | evento `keyup` y verificamos que la tecla que se soltó es la misma que cambia el color, es decir, la tecla `Enter`.
68 |
69 | 
70 |
--------------------------------------------------------------------------------
/Sesion-10/Ejemplo-03/assets/pressing-keys.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-10/Ejemplo-03/assets/pressing-keys.gif
--------------------------------------------------------------------------------
/Sesion-10/Readme.md:
--------------------------------------------------------------------------------
1 |
2 | [`Programación con JavaScript`](../Readme.md) > `Sesión 10`
3 |
4 | # Sesión 10: Eventos en el DOM
5 |
6 | ## Objetivos
7 |
8 | Generar scripts que permitan la manipulación e interacción con la web.
9 |
10 | ---
11 |
12 | ## Tabla de Contenidos
13 |
14 | - **[Event handlers](#event-handlers)**
15 |
16 | - **[Eventos y nodos del DOM](#eventos-y-nodos-del-dom)**
17 |
18 | - [Ejemplo 1: Eventos en nodos del DOM](./Ejemplo-01)
19 |
20 | - **[Event object](#event-object)**
21 |
22 | - [Ejemplo 2: Usando event object](./Ejemplo-02)
23 |
24 | - **[Tipos de eventos](#tipos-de-eventos)**
25 |
26 | - [Ejemplo 3: Key events](./Ejemplo-03)
27 |
28 | - [Reto 1: Inflar un globo](./Reto-01)
29 |
30 | - [Reto 2: Modal](./Reto-02)
31 |
32 | - [Reto 3: Navegando entre tabs](./Reto-03)
33 |
34 | ---
35 |
36 | ## Event handlers
37 |
38 | Manipular el DOM creando nodos y modificando sus atributos carece de sentido si el usuario no tiene la posibildad de
39 | interactuar con nuestra aplicación o sitio web. El usuario en algún momento va a presionar una tecla, hacer click en un
40 | botón, o ingresar un valor en un input y espera que la interfaz reaccione de alguna forma en el momento que se realiza
41 | cualquiera de esas acciones.
42 |
43 | Los navegadores son capaces de notificar o avisar a nuestro código cuando un evento sucede. En este contexto un evento
44 | es cuando el usuario o el navegador mismo manipula la página. Cuando el usuario hace click en un botón, cuando la página
45 | carga, o incluso cuando una ventana se cierra son ejemplos de eventos. El navegador nos permite registrar funciones
46 | conocidas como _handlers_ que se ejecutan cuando un evento en específico sucede.
47 |
48 | ```javascript
49 | window.addEventListener("click", function() {
50 | console.log("Hello World!");
51 | });
52 | ```
53 |
54 | `window` es un objeto que representa la ventana del navegador donde se carga `document`. Al llamar el
55 | método `addEventListener` se registra el segundo argumento para ser llamado cuando el evento descrito en el primer
56 | argumento sucede. Como resultado, al hacer click (evento) en cualquier parte de la ventana se mostrará en consola un
57 | mensaje `Hello World!` (handler).
58 |
59 | ---
60 |
61 | ## Eventos y nodos del DOM
62 |
63 | Todos los event handlers son registrados en un contexto. En el ejemplo anterior llamamos `addEventListener` en el
64 | objeto `window` por lo que el handler se registra para toda la ventana. Los elementos del DOM también cuentan con este
65 | método.
66 |
67 | ```html
68 |
No handler here.
69 |
70 |
71 |
72 |
No handler here.
73 |
74 |
81 | ```
82 |
83 | > El método `querySelector` retorna el primer elemento del DOM que hace match con el selector de CSS especificado.
84 |
85 | Este handler está vinculado al elemento `button`. Lo clicks en el botón ejecutarán la función handler pero los clicks en
86 | los párrafos (o cualquier parte del documento) no.
87 |
88 | Usar el atributo `onclick` tiene el mismo efecto, sin embargo, los nodos solo pueden tener un atributo `onclick` por lo
89 | que solo se puede registrar un handler de esta manera. Usando el método `addEventListener` se pueden registrar múltiples
90 | handlers sobre un mismo nodo.
91 |
92 | También podemos eliminar handlers que hayamos creado con anterioridad usando el método `removeEventListener`.
93 |
94 | ```html
95 |
96 |
97 |
107 | ```
108 |
109 | La función que le pasemos a `removeEventListener` debe ser la misma que se le dio a `addEventListener`. En este caso se
110 | debe definir una función y darle un nombre, de esta forma podemos pasar la función a ambos métodos.
111 |
112 | #### [Ejemplo 1: Eventos en nodos del DOM](./Ejemplo-01)
113 |
114 | ---
115 |
116 | ## Event object
117 |
118 | La función de un event handler recibe un argumento `event`. Este es un objeto con toda la información referente al
119 | evento. Por ejemplo, si quisiéramos saber cuál botón del mouse fue presionado podemos leer la propiedad `button` del
120 | event object.
121 |
122 | ```html
123 |
124 |
125 |
138 | ```
139 |
140 | La información contenida en el event object puede variar dependiendo del tipo de evento.
141 |
142 | #### [Ejemplo 2: Usando event object](./Ejemplo-02)
143 |
144 | ---
145 |
146 | ## Tipos de eventos
147 |
148 | ### Teclado
149 |
150 | Cada vez que se presiona una tecla el navegador lanza un evento `keydown`, al soltar la tecla se ejecuta un
151 | evento `keyup`. Cuando usemos `keydown` hay que tomar en cuenta que no es un evento que se ejecute una sola vez, si la
152 | tecla se mantiene presionada el evento se seguirá ejecutando de manera constante.
153 |
154 | Podemos determinar la tecla presionada con la propiedad `key` del event object. Esta propiedad contiene un string con el
155 | nombre de la tecla presionada. Adicionalmente, si queremos determinar una combinación de teclas el event object cuenta
156 | con las propiedades `shiftKey`, `ctrlKey`, `altKey` y `metaKey` que contienen un booleano indicando si la tecla `Shift`,
157 | `Control`, `Alt` o `Meta` respectivamente se encontraba presionada cuando el evento ocurrió.
158 |
159 | > `Meta`: En teclados Macintosh es la tecla comando (⌘). En teclados Windows es la tecla window (⊞).
160 |
161 | ### Mouse
162 |
163 | Similar a los eventos `keydown` y `keyup`, cuando presionamos un botón del mouse se ejecuta el evento `mousedown`
164 | y `mouseup` cuando se suelta el botón. Esto sucede en el nodo del DOM donde se encuentre el cursor al momento que ocurre
165 | el evento. Después del evento `mouseup` se ejecuta el evento `click` que ya hemos visto anteriormente. En caso de que
166 | sucedan dos clicks de manera continua se lanza el evento `dblclick`.
167 |
168 | #### [Ejemplo 3: Key events](./Ejemplo-03)
169 |
170 | > Consultar la [siguiente documentación](https://developer.mozilla.org/es/docs/Web/Events) para una lista completa de
171 | > los tipos de eventos.
172 |
173 | #### [Reto 1: Inflar un globo](./Reto-01)
174 |
175 | #### [Reto 2: Modal](./Reto-02)
176 |
177 | #### [Reto 3: Navegando entre tabs](./Reto-03)
178 |
--------------------------------------------------------------------------------
/Sesion-10/Reto-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 10`](../Readme.md) > `Reto 01`
2 |
3 | ---
4 |
5 | ## Reto 1: Inflar un globo
6 |
7 | ### Objetivos
8 |
9 | Crear event handlers y usar el event object para determinar las teclas presionadas.
10 |
11 | #### Requisitos
12 |
13 | Partir del siguiente documento HTML:
14 |
15 | ```html
16 |
17 |
18 |
19 | Reto 1: Inflar un globo
20 |
21 |
22 |
23 |
🎈
24 |
25 |
28 |
29 |
30 | ```
31 |
32 | #### Desarrollo
33 |
34 | En este reto el globo (🎈) debe inflarse (aumentar su tamaño) un 10% al presionar la flecha hacia arriba y desinflarse (
35 | disminuir su tamaño) un 10% el presionar la flecha hacia abajo.
36 |
37 | Los emojis son considerados como texto por lo que puedes controlar el tamaño con la propiedad de CSS `font-size`. El
38 | valor inicial debe ser de `20px`.
39 |
40 | Los nombres de las teclas de flecha que necesitas son `ArrowUp` y `ArrowDown`. Con el método `preventDefault()` podemos
41 | evitar que la página haga un scroll al presionar estas teclas.
42 |
43 | Por último, si el tamaño del globo es mayor a `80px` se debe reemplazar por el emoji 💥 y eliminar el event handler.
44 |
45 | 
46 |
--------------------------------------------------------------------------------
/Sesion-10/Reto-01/assets/balloon.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-10/Reto-01/assets/balloon.gif
--------------------------------------------------------------------------------
/Sesion-10/Reto-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 10`](../Readme.md) > `Reto 02`
2 |
3 | ---
4 |
5 | ## Reto 2: Modal
6 |
7 | ### Objetivos
8 |
9 | Implementar event handlers para crear un modal.
10 |
11 | #### Requisitos
12 |
13 | Partir del siguiente documento HTML:
14 |
15 | ```html
16 |
17 |
18 |
19 | Reto 2: Modal
20 |
21 |
22 |
61 |
62 |
Modal
63 |
64 |
65 |
66 |
67 | ×
68 |
69 |
70 |
71 |
74 |
75 |
76 | ```
77 |
78 | #### Desarrollo
79 |
80 | En este reto se incluyen los estilos necesarios para crear un modal, el cual se encuentra oculto por default con la
81 | propiedad de CSS `display: none;`.
82 | - Al hacer click en el botón se debe mostrar un modal con una imagen.
83 | - Usar la url `https://picsum.photos/300/200` para mostrar una imagen aleatoria.
84 | - Una vez abierto el modal aparece una X en la esquina superior derecha, al hacer click se debe cerrar el modal.
85 |
86 | 
87 |
--------------------------------------------------------------------------------
/Sesion-10/Reto-02/assets/modal.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/beduExpert/Programacion-JavaScript-12sesiones-2021/ef687f3e8ef2406cbdf337a9cc7f5e83aac570d8/Sesion-10/Reto-02/assets/modal.gif
--------------------------------------------------------------------------------
/Sesion-10/Reto-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 10`](../Readme.md) > `Reto 03`
2 |
3 | ---
4 |
5 | ## Reto 3: Navegando entre tabs
6 |
7 | ### Objetivos
8 |
9 | Implementar event handlers para crear tabs de navegación.
10 |
11 | #### Requisitos
12 |
13 | Partir del siguiente documento HTML:
14 |
15 | ```html
16 |
17 |
18 |
19 | Reto 3: Navegando entre tabs
20 |
21 |
22 |
23 |
24 |
Tab one
25 |
Tab two
26 |
Tab three
27 |
28 |
29 |
34 |
35 |
36 | ```
37 |
38 | #### Desarrollo
39 |
40 | Crear una función `createTabs` que recibe un nodo del DOM y genera una interfaz de tabs de navegación.
41 |
42 | - La función debe insertar una lista de elementos `