You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/01-getting-started/1-intro/article.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -106,13 +106,13 @@ Las herramientas modernas hacen la conversión (Transpilation) muy rápida y tra
106
106
107
107
Ejemplos de tales lenguajes:
108
108
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.
110
110
-[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.
111
111
-[FLow](https://flow.org/) también agrega la escritura de datos, pero de una manera diferente. Desarrollado por Facebook.
112
112
-[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.
113
113
-[Brython](https://brython.info/) es un transpilador de Python a JavaScript que permite escribir aplicaciones en Python puro sin JavaScript.
114
114
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.
Copy file name to clipboardExpand all lines: 1-js/02-first-steps/08-operators/article.md
+5Lines changed: 5 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -106,6 +106,11 @@ alert(2 + 2 + '1' ); // "41" y no "221"
106
106
107
107
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`.
108
108
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
+
109
114
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.
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/02-object-copy/article.md
+4-4Lines changed: 4 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# Referencias de objetos y copia
2
2
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".
4
4
5
5
Esto es fácil de entender si miramos un poco "bajo cubierta" de lo que pasa cuando copiamos por valor.
6
6
@@ -37,13 +37,13 @@ Y así es como se almacena en la memoria:
37
37
38
38
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.
39
39
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.
41
41
42
42
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.
43
43
44
44
Ahora, por qué esto es importante.
45
45
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.**
47
47
48
48
Por ejemplo:
49
49
@@ -73,7 +73,7 @@ admin.name = 'Pete'; // cambiado por la referencia "admin"
73
73
alert(*!*user.name*/!*); //'Pete', los cambios se ven desde la referencia "user"
74
74
```
75
75
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.
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/07-optional-chaining/article.md
+54-18Lines changed: 54 additions & 18 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -9,17 +9,21 @@ El encadenamiento opcional `?.` es una forma a prueba de errores para acceder a
9
9
10
10
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.
11
11
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.
13
13
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:
15
17
16
18
```js run
17
19
let user = {}; // usuario sin propiedad "address"
18
20
19
21
alert(user.address.street); // Error!
20
22
```
21
23
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")
23
27
24
28
...Y otro ejemplo. En el desarrollo web, necesitamos obtener información sobre un elemento en la página, pero a veces este no existe:
25
29
@@ -28,33 +32,67 @@ Este es el resultado esperado, JavaScript funciona así, pero en muchos casos pr
28
32
let html =document.querySelector('.my-element').innerHTML;
29
33
```
30
34
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.
32
36
33
-
Por ejemplo:
37
+
¿Cómo podemos hacer esto?
34
38
35
-
```js run
39
+
La solución obvia sería chequear el valor usando `if` o el operador condicional `?` antes de usar la propiedad:
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
36
54
let user = {}; // El usuario no tiene dirección
37
55
38
-
alert(user.address&&user.address.street&&user.address.street.name); // undefined (no error)
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 `&&`:
Tenga en cuenta: la sintaxis `?.` hace opcional el valor delante de él, pero no más allá.
67
105
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 `?.`.
71
107
72
108
```warn header="No abuses del encadenamiento opcional"
73
109
Deberíamos usar `?.` solo donde está bien que algo no exista.
74
110
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`.
76
112
77
113
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.
78
114
```
@@ -84,7 +120,7 @@ Si no hay una variable `user` declarada, entonces `user?.anything` provocará un
84
120
// ReferenceError: user no está definido
85
121
user?.address;
86
122
```
87
-
Debe haber `let/const/varuser`. Elencadenamientoopcionalsolofuncionaparavariablesdeclaradas.
123
+
La variable debe ser declarada (con `let/const/varuser`ocomoparámetrodefunción). Elencadenamientoopcionalsolofuncionaparavariablesdeclaradas.
88
124
````
89
125
90
126
## Short-circuiting (Cortocircuitos)
@@ -108,7 +144,7 @@ alert(x); // 0, el valor no se incrementa
108
144
109
145
El encadenamiento opcional `?.` no es un operador, sino una construcción de sintaxis especial, que también funciona con funciones y corchetes.
110
146
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.
112
148
113
149
En el siguiente código, algunos de nuestros usuarios tienen el método `admin`, y otros no:
114
150
@@ -126,7 +162,7 @@ userAdmin.admin?.(); // I am admin
126
162
*/!*
127
163
128
164
*!*
129
-
userGuest.admin?.(); // nothing (no such method)
165
+
userGuest.admin?.(); // nada (no existe tal método)
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.
52
52
53
-
Los backticks además nos permiten especificar una "función de plantilla" antes del primer backtick. La sintaxis es: <code>func`string`</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`string`</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).
54
54
55
55
## Caracteres especiales
56
56
@@ -81,7 +81,7 @@ Esta es la lista completa:
81
81
| Carácter | Descripción |
82
82
|-----------|-------------|
83
83
|`\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. |
85
85
|`\'`, `\"`|Comillas|
86
86
|`\\`|Barra invertida|
87
87
|`\t`|Tabulación|
@@ -608,7 +608,7 @@ En muchos idiomas hay símbolos que se componen del carácter base con una marca
608
608
609
609
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.
610
610
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".
612
612
613
613
Por ejemplo, si tenemos `S` seguido del carácter especial" punto arriba "(código` \ u0307`), se muestra como Ṡ.
614
614
@@ -626,7 +626,7 @@ Por ejemplo:
626
626
alert('S\u0307\u0323'); // Ṩ
627
627
```
628
628
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.
Copy file name to clipboardExpand all lines: 1-js/05-data-types/06-iterable/article.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -26,7 +26,7 @@ let range = {
26
26
// for(let num of range) ... num=1,2,3,4,5
27
27
```
28
28
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).
30
30
31
31
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()`.
32
32
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)
295
295
Los objetos que se pueden usar en `for..of` se denominan *iterables*.
296
296
297
297
- 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.
299
299
- 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.
300
300
- El método `Symbol.iterator` se llama automáticamente por `for..of`, pero también podemos hacerlo directamente.
301
301
- Los iterables integrados, como cadenas o matrices, también implementan `Symbol.iterator`.
0 commit comments