Skip to content

Commit f921d74

Browse files
authored
Merge pull request #465 from joaquinelio/susy201217
Susy201217
2 parents 2c5f275 + 6420104 commit f921d74

55 files changed

Lines changed: 284 additions & 159 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1-js/01-getting-started/1-intro/article.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,13 @@ Las herramientas modernas hacen la conversión (Transpilation) muy rápida y tra
106106

107107
Ejemplos de tales lenguajes:
108108

109-
- [CoffeeScript](http://coffeescript.org/) Es una "sintaxis azucarada" [syntactic sugar](https://es.wikipedia.org/wiki/Az%C3%BAcar_sint%C3%A1ctico) para JavaScript. Introduce una sintaxis corta, permitiéndonos escribir un código mas claro y preciso. Usualmente desarrolladores de Ruby prefieren este lenguaje.
109+
- [CoffeeScript](http://coffeescript.org/) Es una "sintaxis azucarada" para JavaScript. Introduce una sintaxis corta, permitiéndonos escribir un código mas claro y preciso. Usualmente desarrolladores de Ruby prefieren este lenguaje.
110110
- [TypeScript](http://www.typescriptlang.org/) se concentra en agregar "tipado estricto" ("strict data typing") para simplificar el desarrollo y soporte de sistemas complejos. Es desarrollado por Microsoft.
111111
-[FLow](https://flow.org/) también agrega la escritura de datos, pero de una manera diferente. Desarrollado por Facebook.
112112
- [Dart](https://www.dartlang.org/) es un lenguaje independiente que tiene su propio motor que se ejecuta en entornos que no son de navegador (como aplicaciones móviles), pero que también se puede convertir/transpilar a JavaScript. Desarrollado por Google.
113113
- [Brython](https://brython.info/) es un transpilador de Python a JavaScript que permite escribir aplicaciones en Python puro sin JavaScript.
114114

115-
Hay mas. Por supuesto, incluso si nosotros usamos alguno de estos lenguajes, deberíamos conocer también JavaScript para realmente entender qué estamos haciendo.
115+
Hay más. Por supuesto, incluso si nosotros usamos alguno de estos lenguajes, deberíamos conocer también JavaScript para realmente entender qué estamos haciendo.
116116

117117
## Resumen
118118

1-js/02-first-steps/08-operators/article.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,11 @@ alert(2 + 2 + '1' ); // "41" y no "221"
106106

107107
Aquí, los operandores trabajan uno después de otro. El primer `+` suma dos números entonces devuelve `4`, luego el siguiente `+` le agrega la cadena `1`, así que se evalúa como `4 + '1' = 41`.
108108

109+
```js run
110+
alert('1' + 2 + 2); // "122", no es "14"
111+
```
112+
Aquí el primer operando es una cadena, el compilador trata los otros dos operandos como cadenas también. El `2` es concatenado a `'1'`, entonces es como `'1' + 2 = "12"` y `"12" + 2 = "122"`.
113+
109114
El binario `+` es el único operador que soporta cadenas en esa forma. Otros operadores matemáticos trabajan solamente con números y siempre convierten sus operandos a números.
110115

111116
Por ejemplo, resta y división:

1-js/04-object-basics/02-object-copy/article.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Referencias de objetos y copia
22

3-
Una de las diferencias fundamentales entre objetos y primitivos es que los objetos son almacenados y copiados "por referencia", en cambio los primitivos: strings, number, boolean; son asignados y copiados "como un valor completo".
3+
Una de las diferencias fundamentales entre objetos y primitivos es que los objetos son almacenados y copiados "por referencia", en cambio los primitivos: strings, number, boolean, etc.; son asignados y copiados "como un valor completo".
44

55
Esto es fácil de entender si miramos un poco "bajo cubierta" de lo que pasa cuando copiamos por valor.
66

@@ -37,13 +37,13 @@ Y así es como se almacena en la memoria:
3737

3838
El objeto es almacenado en algún lugar de la memoria (a la derecha de la imagen), mientras que la variable `user` (a la izquierda) tiene una "referencia" a él.
3939

40-
Podemos pensar de una variable objeto, como `user`, como una hoja de papel con su dirección.
40+
Podemos pensar de una variable objeto, como `user`, como una hoja de papel con la dirección del objeto en él.
4141

4242
Cuando ejecutamos acciones con el objeto, por ejemplo tomar una propiedad `user.name`, el motor JavaScript busca aquella dirección y ejecuta la operación en el objeto mismo.
4343

4444
Ahora, por qué esto es importante.
4545

46-
**Cuando una variable de objeto es copiada -- la referencia es copiada, el objeto no es duplicado.**
46+
**Cuando una variable de objeto es copiada, se copia solo la referencia. El objeto no es duplicado.**
4747

4848
Por ejemplo:
4949

@@ -73,7 +73,7 @@ admin.name = 'Pete'; // cambiado por la referencia "admin"
7373
alert(*!*user.name*/!*); // 'Pete', los cambios se ven desde la referencia "user"
7474
```
7575
76-
Es como si tuviéramos un gabinete con dos llaves y usáramos una de ellas (`admin`) para acceder a él. Si más tarde usamos la llave (`user`), podemos ver los cambios.
76+
Es como si tuviéramos un gabinete con dos llaves y usáramos una de ellas (`admin`) para acceder a él y hacer cambios. Si más tarde usamos la llave (`user`), estaríamos abriendo el mismo gabinete y accediendo al contenido cambiado.
7777
7878
## Comparación por referencia
7979

1-js/04-object-basics/07-optional-chaining/article.md

Lines changed: 54 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,21 @@ El encadenamiento opcional `?.` es una forma a prueba de errores para acceder a
99

1010
Si acaba de comenzar a leer el tutorial y aprender JavaScript, quizás el problema aún no lo haya tocado, pero es bastante común.
1111

12-
Por ejemplo, algunos de nuestros usuarios tienen direcciones, pero pocos no las proporcionaron. Entonces no podemos leer con seguridad `user.address.street`:
12+
Como ejemplo, digamos que tenemos objetos `user` que contienen información de nuestros usuarios.
1313

14-
En tal cao, cuando intentamos obtener `user.address.street`, obtendremos un error:
14+
La mayoría de nuestros usuarios tienen la dirección en la propiedad `user.address`, con la calle en `user.address.street`, pero algunos no la proporcionaron.
15+
16+
En tal caso, cuando intentamos obtener `user.address.street`en un usuario sin dirección obtendremos un error:
1517

1618
```js run
1719
let user = {}; // usuario sin propiedad "address"
1820

1921
alert(user.address.street); // Error!
2022
```
2123

22-
Este es el resultado esperado, JavaScript funciona así, pero en muchos casos prácticos preferiríamos obtener `undefined` en lugar del error (sin "street").
24+
Este es el resultado esperado. JavaScript funciona así, como `user.address` es `undefined`, el intento de obtener `user.address.street` falla dando un error.
25+
26+
En muchos casos prácticos preferiríamos obtener `undefined` en lugar del error (dando a entender "sin calle")
2327

2428
...Y otro ejemplo. En el desarrollo web, necesitamos obtener información sobre un elemento en la página, pero a veces este no existe:
2529

@@ -28,33 +32,67 @@ Este es el resultado esperado, JavaScript funciona así, pero en muchos casos pr
2832
let html = document.querySelector('.my-element').innerHTML;
2933
```
3034

31-
Antes de que apareciera `?.` en el lenguaje, se usaba el operador `&&` para solucionarlo.
35+
Una vez más, si el elemento no existe, obtendremos un error al acceder al `.innerHTML` de `null`. Y en algunos casos, cuando la ausencia del elemento es normal, quisiéramos evitar el error y simplemente aceptar `html = null` como resultado.
3236

33-
Por ejemplo:
37+
¿Cómo podemos hacer esto?
3438

35-
```js run
39+
La solución obvia sería chequear el valor usando `if` o el operador condicional `?` antes de usar la propiedad:
40+
41+
```js
42+
let user = {};
43+
44+
alert(user.address ? user.address.street : undefined);
45+
```
46+
47+
Esto funciona, no hay error... Pero es bastante poco elegante. Como puedes ver, `"user.address"` aparece dos veces en el código. En propiedades anidadas más profundamente, esto se vuelve un problema porque se requerirán más repeticiones.
48+
49+
Ejemplo: Tratemos de obtener `user.address.street.name`.
50+
51+
Necesitamos chequear `user.address` y `user.address.street`:
52+
53+
```js
3654
let user = {}; // El usuario no tiene dirección
3755

38-
alert( user.address && user.address.street && user.address.street.name ); // undefined (no error)
56+
alert(user.address ? user.address.street ? user.address.street.name : null : null);
3957
```
4058

41-
Poniendo AND en el camino completo a la propiedad asegura que todos los componentes existen (si no, la evaluación se detiene), pero es engorroso de escribir.
59+
Esto es horrible, podemos tener problemas para siquiera entender tal código.
60+
61+
Ni lo intentes, hay una mejor manera de escribirlo usando el operador `&&`:
62+
63+
```js run
64+
let user = {}; // usuario sin dirección
65+
66+
alert( user.address && user.address.street && user.address.street.name ); // undefined (sin error)
67+
```
68+
69+
Poniendo AND en el camino completo a la propiedad asegura que todos los componentes existen (si no, la evaluación se detiene), pero no es lo ideal.
70+
71+
Como puedes ver, los nombres de propiedad aún están duplicados en el código. Por ejemplo en el código de arriba `user.address` aparece tres veces.
72+
73+
Es por ello que el encadenamiento opcional `?.` fue agregado al lenguaje. ¡Para resolver este problema de una vez por todas!
4274

4375
## Encadenamiento opcional
4476

45-
El encadenamiento opcional `?.` detiene la evaluación y devuelve` undefined` si la parte anterior a `?.` es` undefined` o `null`.
77+
El encadenamiento opcional `?.` detiene la evaluación si la parte anterior a `?.` es ` undefined` o `null` y devuelve esa parte.
4678

4779
**De aquí en adelante en este artículo, por brevedad, diremos que algo "existe" si no es `null` o `undefined`.**
4880

49-
Aquí está la forma segura de acceder a `user.address.street`:
81+
En otras palabras, `value?.prop`:
82+
- es lo mismo que `value.prop` si `value` existe,
83+
- de otro modo (cuando `value` es `undefined/null`) devuelve `undefined`.
84+
85+
Aquí está la forma segura de acceder a `user.address.street` usando `?.`:
5086

5187
```js run
5288
let user = {}; // El usuario no tiene dirección
5389

5490
alert( user?.address?.street ); // undefined (no hay error)
5591
```
5692
57-
Leer la dirección con `user? .Address` funciona incluso si el objeto `user` no existe:
93+
El código es corto y claro, no hay duplicación en absoluto
94+
95+
Leer la dirección con `user?.Address` funciona incluso si el objeto `user` no existe:
5896
5997
```js run
6098
let user = null;
@@ -65,14 +103,12 @@ alert( user?.address.street ); // undefined
65103
66104
Tenga en cuenta: la sintaxis `?.` hace opcional el valor delante de él, pero no más allá.
67105
68-
En el ejemplo anterior, `user?.` permite que solo `user` sea `null/undefined`.
69-
70-
Por otro lado, si `user` existe, entonces debe tener la propiedad `user.address`, de lo contrario `user?.Address.street` da un error en el segundo punto.
106+
Por ejemplo en `user?.address.street.name` el `?.` permite a `user` ser `null/undefined`, pero es todo lo que hace. El resto de las propiedades son accedidas de la manera normal. Si queremos que algunas de ellas sean opcionales, necesitamos reemplazar más `.` con `?.`.
71107
72108
```warn header="No abuses del encadenamiento opcional"
73109
Deberíamos usar `?.` solo donde está bien que algo no exista.
74110

75-
Por ejemplo, si de acuerdo con nuestra lógica de codificación, el objeto `user` debe estar allí, pero `address` es opcional, entonces `user.address?.Street` sería mejor.
111+
Por ejemplo, si de acuerdo con nuestra lógica de codificación, el objeto `user` debe estar allí, pero `address` es opcional, entonces deberíamos escribir `user.address?.street` y no `user?.address?.street`.
76112

77113
Entonces, si `user` no está definido debido a un error, lo sabremos y lo arreglaremos. De lo contrario, los errores de codificación pueden silenciarse donde no sea apropiado y volverse más difíciles de depurar.
78114
```
@@ -84,7 +120,7 @@ Si no hay una variable `user` declarada, entonces `user?.anything` provocará un
84120
// ReferenceError: user no está definido
85121
user?.address;
86122
```
87-
Debe haber `let/const/var user`. El encadenamiento opcional solo funciona para variables declaradas.
123+
La variable debe ser declarada (con `let/const/var user` o como parámetro de función). El encadenamiento opcional solo funciona para variables declaradas.
88124
````
89125

90126
## Short-circuiting (Cortocircuitos)
@@ -108,7 +144,7 @@ alert(x); // 0, el valor no se incrementa
108144

109145
El encadenamiento opcional `?.` no es un operador, sino una construcción de sintaxis especial, que también funciona con funciones y corchetes.
110146

111-
Por ejemplo, `?.()` Se usa para llamar a una función que puede no existir.
147+
Por ejemplo, `?.()` se usa para llamar a una función que puede no existir.
112148

113149
En el siguiente código, algunos de nuestros usuarios tienen el método `admin`, y otros no:
114150

@@ -126,7 +162,7 @@ userAdmin.admin?.(); // I am admin
126162
*/!*
127163
128164
*!*
129-
userGuest.admin?.(); // nothing (no such method)
165+
userGuest.admin?.(); // nada (no existe tal método)
130166
*/!*
131167
```
132168

1-js/05-data-types/03-string/article.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ let guestList = "Invitados: // Error: Unexpected token ILLEGAL
5050

5151
Las comillas simples y dobles provienen de la creación de lenguaje en tiempos ancestrales, cuando la necesidad de múltiples líneas no era tomada en cuenta. Los backticks aparecieron mucho después y por ende son más versátiles.
5252

53-
Los backticks además nos permiten especificar una "función de plantilla" antes del primer backtick. La sintaxis es: <code>func&#96;string&#96;</code>. La función `func` es llamada automáticamente, recibe el string y la expresión insertada y los puede procesar. Puedes leer más sobre esto en [docs](mdn:/JavaScript/Reference/Template_literals#Tagged_template_literals). Eso se llama "plantillas etiquetadas". Esta característica hace que sea más fácil rodear strings en plantillas personalizadas u otra funcionalidad, pero es raramente usada.
53+
Los backticks además nos permiten especificar una "función de plantilla" antes del primer backtick. La sintaxis es: <code>func&#96;string&#96;</code>. La función `func` es llamada automáticamente, recibe el string y la expresión insertada y los puede procesar. Eso se llama "plantillas etiquetadas". Esta característica hace que sea más fácil implementar plantillas personalizadas, pero es raramente usada en la práctica. Puedes leer más sobre esto en [docs](mdn:/JavaScript/Reference/Template_literals#Tagged_templates).
5454

5555
## Caracteres especiales
5656

@@ -81,7 +81,7 @@ Esta es la lista completa:
8181
| Carácter | Descripción |
8282
|-----------|-------------|
8383
|`\n`|Nueva línea|
84-
|`\r`|Carriage return (retorno de carro): No se usa solo. Los archivos de texto de Windows usan una combinaión de dos caracteres `\r\n` para representar un corte de línea. |
84+
|`\r`|Retorno de carro: No se usa aislado. Los archivos de texto de Windows usan una combinación de dos caracteres `\r\n` para representar un corte de línea. |
8585
|`\'`, `\"`|Comillas|
8686
|`\\`|Barra invertida|
8787
|`\t`|Tabulación|
@@ -608,7 +608,7 @@ En muchos idiomas hay símbolos que se componen del carácter base con una marca
608608

609609
Por ejemplo, la letra `a` puede ser el carácter base para:` àáâäãåā`. Los caracteres "compuestos" más comunes tienen su propio código en la tabla UTF-16. Pero no todos ellos, porque hay demasiadas combinaciones posibles.
610610

611-
Para mantener composiciones arbitrarias, UTF-16 nos permite usar varios caracteres unicode. El carácter base y uno o varios caracteres de "marca" que lo "decoran".
611+
Para mantener composiciones arbitrarias, UTF-16 nos permite usar varios caracteres Unicode. El carácter base y uno o varios caracteres de "marca" que lo "decoran".
612612

613613
Por ejemplo, si tenemos `S` seguido del carácter especial" punto arriba "(código` \ u0307`), se muestra como Ṡ.
614614

@@ -626,7 +626,7 @@ Por ejemplo:
626626
alert('S\u0307\u0323'); // Ṩ
627627
```
628628

629-
Esto proporciona una gran flexibilidad, pero también un problema interesante: dos caracteres pueden verse visualmente iguales, pero estar representados con diferentes composiciones unicode.
629+
Esto proporciona una gran flexibilidad, pero también un problema interesante: dos caracteres pueden ser visualmente iguales, pero estar representados con diferentes composiciones Unicode.
630630

631631
Por ejemplo:
632632

@@ -639,7 +639,7 @@ alert( `s1: ${s1}, s2: ${s2}` );
639639
alert( s1 == s2 ); // false aunque los caracteres se ven idénticos (?!)
640640
```
641641

642-
Para resolver esto, existe un algoritmo de "normalización unicode" que lleva cada cadena a la forma "normal".
642+
Para resolver esto, existe un algoritmo de "normalización Unicode" que lleva cada cadena a la forma "normal".
643643

644644
Este es implementado por [str.normalize()](mdn:js/String/normalize).
645645

@@ -661,14 +661,14 @@ Si desea obtener más información sobre las reglas y variantes de normalizació
661661

662662
## Resumen
663663

664-
- Existen 3 tipos de comillas. Los backticks permiten que una cadena abarque varias líneas e incorpore expresiones.
664+
- Existen 3 tipos de entrecomillado. Los backticks permiten que una cadena abarque varias líneas e incorporar expresiones `${…}`.
665665
- Strings en JavaScript son codificados usando UTF-16.
666666
- Podemos usar caracteres especiales como `\n` e insertar letras por su código unico usando `\u ... `.
667-
- Para obtener un caracter, usa: `[]`.
667+
- Para obtener un carácter, usa: `[]`.
668668
- Para obtener un substring, usa: `slice` o `substring`.
669669
- Para convertir un string en minúsculas/mayúsculas, usa: `toLowerCase/toUpperCase`.
670670
- Para buscar por un substring, usa: `indexOf`, o `includes/startsWith/endsWith` para checkeos simples.
671-
- Para comparar strings de acuerdo al languagje, usa: `localeCompare`, de otra manera seran comparados como códigos de caracter.
671+
- Para comparar strings de acuerdo al languagje, usa: `localeCompare`, de otra manera seran comparados como códigos de carácter.
672672

673673
Existen varios otros métodos útiles en cadenas:
674674

1-js/05-data-types/06-iterable/article.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ let range = {
2626
// for(let num of range) ... num=1,2,3,4,5
2727
```
2828

29-
Para hacer que el `range` sea iterable (y así permitir que `for..of` funcione) necesitamos agregar un método al objeto llamado `Symbol.iterator` (un símbolo incorporado especial usado solo para realizar esa función, proporcionar iterabilidad).
29+
Para hacer que el objeto `range` sea iterable (y así permitir que `for..of` funcione) necesitamos agregarle un método llamado `Symbol.iterator` (un símbolo incorporado especial usado solo para realizar esa función).
3030

3131
1. Cuando se inicia el `for..of`, éste llama al método `Symbol.iterator` una vez (o genera un error si no lo encuentra). El método debe devolver un *iterador* --un objeto con el método `next()`.
3232
2. En adelante, `for..of` trabaja *solo con ese objeto devuelto*.
@@ -295,7 +295,7 @@ alert( str.slice(1, 3) ); // garbage (dos piezas de diferentes pares sustitutos)
295295
Los objetos que se pueden usar en `for..of` se denominan *iterables*.
296296

297297
- Técnicamente, los iterables deben implementar el método llamado `Symbol.iterator`.
298-
- El resultado de `obj[Symbol.iterator]` se llama *iterador*. Maneja el proceso de iteración adicional.
298+
- El resultado de `obj[Symbol.iterator]()` se llama *iterador*. Maneja el proceso de iteración adicional.
299299
- Un iterador debe tener el método llamado `next()` que devuelve un objeto `{done: Boolean, value: any}`, donde `done: true` denota el final de la iteración, de lo contrario, `value` es el siguiente valor.
300300
- El método `Symbol.iterator` se llama automáticamente por `for..of`, pero también podemos hacerlo directamente.
301301
- Los iterables integrados, como cadenas o matrices, también implementan `Symbol.iterator`.

1-js/05-data-types/07-map-set/article.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ Intentémoslo:
6969

7070
```js run
7171
let john = { name: "John" };
72+
let ben = { name: "Ben" };
7273

7374
let visitsCountObj = {}; // intenta usar un objeto
7475

1-js/05-data-types/12-json/article.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ name: John
276276
name: Alice
277277
place: [object Object]
278278
number: 23
279+
occupiedBy: [object Object]
279280
*/
280281
```
281282

@@ -328,6 +329,8 @@ alert(JSON.stringify(user, null, 2));
328329
*/
329330
```
330331

332+
El tercer argumento puede ser también string. En ese caso el string será usado como indentación en lugar de un número de espacios.
333+
331334
El argumento `space` es utilizado únicamente para propósitos de registro y agradable impresión.
332335

333336
## "toJSON" Personalizado

1-js/06-advanced-functions/06-function-object/5-sum-many-brackets/solution.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
Ahora el código:
77

8-
```js run
8+
```js demo run
99
function sum(a) {
1010

1111
let currentSum = a;

1-js/06-advanced-functions/09-call-apply-decorators/03-debounce/task.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Aquí está el código para ello (usa el decorador debounce del [Lodash library]
2121
```js
2222
let f = _.debounce(alert, 1000);
2323

24-
f("a");
24+
f("a");
2525
setTimeout( () => f("b"), 200);
2626
setTimeout( () => f("c"), 500);
2727
// la función debounce espera 1000 ms después de la última llamada y luego ejecuta: alert ("c")

0 commit comments

Comments
 (0)