Skip to content

Commit 94f389f

Browse files
authored
Merge pull request #361 from vplentinax/sync27Agosto
sync27Agosto Los updates son prioritarios. So the merge.
2 parents 6583bb4 + 206a370 commit 94f389f

File tree

25 files changed

+95
-108
lines changed

25 files changed

+95
-108
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ Ejemplos de tales lenguajes:
113113
- [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.
114114
-[FLow](https://flow.org/) también agrega la escritura de datos, pero de una manera diferente. Desarrollado por Facebook.
115115
- [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.
116+
- [Brython](https://brython.info/) es un transpilador de Python a JavaScript que permite escribir aplicaciones en Python puro sin JavaScript.
116117

117118
Hay mas. Por supuesto, incluso si nosotros usamos alguno de estos lenguajes, deberíamos conocer también JavaScript para realmente entender qué estamos haciendo.
118119

1-js/02-first-steps/11-logical-operators/article.md

Lines changed: 33 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Operadores Lógicos
22

3-
Hay tres operadores lógicos en JavaScript: `||` (OR (O)), `&&` (AND (Y)), `!` (NOT (NO)).
3+
Hay tres operadores lógicos en JavaScript: `||` (O), `&&` (Y), `!` (NO).
44

55
Aunque sean llamados lógicos, pueden ser aplicados a valores de cualquier tipo, no solo booleanos. El resultado también puede ser de cualquier tipo.
66

@@ -39,7 +39,7 @@ if (1 || 0) { // Funciona como if( true || false )
3939
}
4040
```
4141

42-
La mayoría de las veces, OR `||` es usado en una declaración `if` para probar si *cualquiera* de las condiciones dadas es `true`.
42+
La mayoría de las veces, OR `||` es usado en una declaración `if` para probar si *alguna* de las condiciones dadas es `true`.
4343

4444
Por ejemplo:
4545

@@ -64,7 +64,7 @@ if (hour < 10 || hour > 18 || isWeekend) {
6464
}
6565
```
6666

67-
## OR encuentra el primer valor verdadero
67+
## OR "||" encuentra el primer valor verdadero
6868

6969
La lógica descrita arriba es algo clásica. Ahora, mostremos las características "extra" de JavaScript.
7070

@@ -90,75 +90,61 @@ Por ejemplo:
9090

9191
```js run
9292
alert(1 || 0); // 1 (1 es un valor verdado)
93-
alert(true || "cualquier valor"); // (true es un valor verdadero)
9493

9594
alert(null || 1); // 1 (1 es el primer valor verdadero)
9695
alert(null || 0 || 1); // 1 (el primer valor verdadero)
96+
9797
alert(undefined || null || 0); // 0 (todos son valores falsos, retorna el último valor)
9898
```
9999

100100
Esto brinda varios usos interesantes comparados al "OR puro, clásico, de solo booleanos".
101101

102-
1. **Consiguiendo el primer valor verdadero de una lista de variables o expresiones.**
102+
1. **Obtener el primer valor verdadero de una lista de variables o expresiones.**
103103

104-
Imagina que tenemos múltiples variables que pueden contener datos o bien ser `null/undefined`. ¿Cómo podemos encontrar el primer valor que contenga datos?
104+
Por ejemplo, tenemos las variables `firstName`, `lastName` y `nickName`, todas opcionales.
105105

106-
Podemos usar OR `||`:
106+
Usemos OR `||` para elegir el que tiene los datos y mostrarlo (o anónimo si no hay nada configurado):
107107

108108
```js run
109-
let currentUser = null;
110-
let defaultUser = "John";
109+
let firstName = "";
110+
let lastName = "";
111+
let nickName = "SuperCoder";
111112

112113
*!*
113-
let name = currentUser || defaultUser || "sin nombre";
114+
alert( firstName || lastName || nickName || "Anonymous"); // SuperCoder
114115
*/!*
115-
116-
alert( name ); // selecciona "John" – el primer valor verdadero
117116
```
118117

119-
Si tanto `currentUser` como `defaultUser` hubieran sido valores falsos, `"sin nombre"` hubiera sido el resultado.
120-
121-
2. **Evaluación de cortocircuito.**
118+
Si todas las variables fueran falsas, aparecería Anónimo.
122119

123-
Los operandos no solo pueden ser valores, sino que tambien expresiones arbitrarias. OR los evalua y comprueba de izquierda a derecha. La evaluación termina cuando un valor verdadero es alcanzado, y dicho valor es retornado. Este proceso es llamado "evaluación de cortocircuito" porque avanza lo menos posible de izquierda a derecha.
120+
2. **Evaluación del camino más corto.**
124121

125-
Esto se ve claramente cuando la expresión dada como segundo argumento tiene un efecto secundario como una asignación de variable.
122+
Otra característica de OR || operador es la evaluación de "el camino más corto".
126123

127-
En el ejemplo debajo, `x` no es asignada:
124+
Esto significa que `||` procesa sus argumentos hasta que se alcanza el primer valor verdadero, y luego el valor se devuelve inmediatamente, sin siquiera tocar el otro argumento.
128125

129-
```js run no-beautify
130-
let x;
126+
La importancia de esta característica se vuelve obvia si un operando no es solo un valor, sino una expresión con un efecto secundario, como una asignación de variable o una llamada a función.
131127

132-
*!*true*/!* || (x = 1);
133-
134-
alert(x); // undefined, porque (x = 1) no es evaluado.
135-
```
128+
En el siguiente ejemplo, solo se imprime el segundo mensaje:
136129

137-
Si, en cambio, el primer argumento fuera `false`, `||` evaluaría el segundo, realizando la asignación.
138-
139-
```js run no-beautify
140-
let x;
141-
142-
*!*false*/!* || (x = 1);
143-
144-
alert(x); // 1
145-
```
130+
```js run no-beautify
131+
*!*true*/!* || alert("not printed");
132+
*!*false*/!* || alert("printed");
133+
```
146134

147-
Una asignación es un caso simple. Puede haber efectos secundarios, los cuales no se notarán si la evaluación no los alcanza.
135+
En la primera línea, el operador OR `||` detiene la evaluación inmediatamente después de ver que es verdadera, por lo que la alerta no se ejecuta.
148136

149-
Como podemos ver, tal caso de uso es una "manera más corta de usar `if`". El primer operando es convertido a booleano. Si el primero es falso, el segundo sera evaluado.
150-
151-
La mayor parte del tiempo, es mejor usar un `if` "normal" para mantener el código fácil de entender, pero a veces esto puede ser útil.
137+
A veces, las personas usan esta función para ejecutar comandos solo si la condición en la parte izquierda es falsa.
152138

153139
## && (AND)
154140

155-
El operador AND es representado con `&&`:
141+
El operador AND es representado con dos ampersands `&&`:
156142

157143
```js
158144
result = a && b;
159145
```
160146

161-
En la programación clasica, AND retorna `true` si ambos operandos son valores verdaderos y falso en cualquier otro caso.
147+
En la programación clasica, AND retorna `true` si ambos operandos son valores verdaderos y `false` en cualquier otro caso.
162148

163149
```js run
164150
alert(true && true); // true
@@ -186,7 +172,7 @@ if (1 && 0) { // evaluado como true && false
186172
}
187173
```
188174

189-
## AND encuentra el primer valor verdadero
175+
## AND "&&" encuentra el primer valor falso
190176

191177
Dado múltiples valores aplicados al operador AND:
192178

@@ -236,16 +222,18 @@ La precedencia del operador AND `&&` es mayor que la de OR `||`.
236222

237223
Así que el código `a && b || c && d` es básicamente el mismo que si la expresiones `&&` estuvieran entre paréntesis: `(a && b) || (c && d)`
238224
```
225+
```
239226

240-
Justo como en OR, el operador AND `&&` puede reemplazar en ocasiones al `if`.
227+
````warn header="No remplace *if* con || or &&"
228+
A veces, la gente usa el operador AND `&&` como una "forma más corta de escribir `if`".
241229
242230
Por ejemplo:
243231
244232
```js run
245233
let x = 1;
246234
247-
(x > 0) && alert("Mayor que cero!");
248-
````
235+
(x > 0) && alert( 'Greater than zero!' );
236+
```
249237
250238
La acción en la parte derecha de `&&` sería ejecutada sólo si la evaluación la alcanza. Eso es, solo si `(x > 0)` es verdadero.
251239
@@ -258,10 +246,8 @@ if (x > 0) {
258246
alert("Mayor que cero!");
259247
}
260248
```
261-
262-
La variante con `&&` parece más corta. Pero `if` es más obvio y tiende a ser un poco más legible.
263-
264-
Así que recomendamos usar cada construcción para su propósito: usar `if` si queremos if y usar `&&` si queremos AND.
249+
Aunque la variante con `&&` parece más corta, `if` es más obvia y tiende a ser un poco más legible. Por lo tanto, recomendamos usar cada construcción para su propósito: use `if` si queremos si y use` && `si queremos AND.
250+
````
265251

266252
## ! (NOT)
267253

@@ -302,4 +288,3 @@ alert(Boolean(null)); // false
302288
```
303289

304290
La precedencia de NOT `!` es la mayor de todos los operadores lógicos, así que siempre se ejecuta primero, antes que `&&` o `||`.
305-

1-js/05-data-types/04-array/article.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ Un array es una clase especial de objeto. Los corchetes usados para acceder a un
193193

194194
Ellos extienden los objetos proveyendo métodos especiales para trabajar con colecciones ordenadas de datos y también la propiedad `length`. Pero en el corazón es aún un objeto.
195195

196-
Recuerda, hay solo 7 tipos basicos en JavaScript. Array es un objeto y se comporta como un objeto..
196+
Recuerde, solo hay ocho tipos de datos básicos en JavaScript (consulte el capítulo [Tipos de datos] (https://javascript.info/types) para obtener más información). Array es un objeto y, por tanto, se comporta como un objeto.
197197

198198
Por ejemplo, es copiado por referencia:
199199

1-js/05-data-types/05-array-methods/6-calculator-extendable/_js.view/solution.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ function Calculator() {
1010
let split = str.split(' '),
1111
a = +split[0],
1212
op = split[1],
13-
b = +split[2]
13+
b = +split[2];
1414

1515
if (!this.methods[op] || isNaN(a) || isNaN(b)) {
1616
return NaN;

1-js/06-advanced-functions/03-closure/article.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11

2-
# Ámbito de Variable
2+
# Ámbito de Variable y el concepto "closure"
33

4-
JavaScript es un lenguaje muy orientado a funciones. Nos da mucha libertad. Se puede crear una función dinámicamente, pasarla como argumento a otra función y llamarla desde un lugar de código totalmente diferente más adelante.
4+
JavaScript es un lenguaje muy orientado a funciones. Nos da mucha libertad. Una función se puede crear en cualquier momento, pasar como argumento a otra función y luego llamar desde un lugar de código totalmente diferente más tarde.
55

66
Ya sabemos que una función puede acceder a variables fuera de ella.
77

8-
Ahora ampliemos nuestro conocimiento para incluir escenarios más complejos.
8+
Pero, ¿qué sucede si estas variables "externas" cambian desde que se crea una función? ¿La función verá los valores nuevos o los antiguos?
9+
10+
Y si una función se pasa como parámetro y se llama desde otro lugar del código, ¿tendrá acceso a las variables externas en el nuevo lugar?
11+
12+
Ampliemos nuestro conocimiento para comprender estos escenarios y otros más complejos.
913

1014
```smart header="Hablaremos de las variables let / const aquí"
1115
En JavaScript, hay 3 formas de declarar una variable: `let`, `const` (las modernas) y `var` (más antigua).

1-js/06-advanced-functions/05-global-object/article.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ El objeto global proporciona variables y funciones que están disponibles en cua
55

66
En un navegador se denomina `window`, para Node.js es` global`, para otros entornos puede tener otro nombre.
77

8-
Recientemente, `globalThis` se agregó al lenguaje, como un nombre estandarizado para un objeto global, que debería ser compatible con todos los entornos. En algunos navegadores, como Chromium Edge, `globalThis` aún no es compatible, pero se puede usar mediante *polyfill*.
8+
Recientemente, se agregó `globalThis` al lenguaje, como un nombre estandarizado para un objeto global, que debería ser compatible con todos los entornos al igual que con los principales navegadores.
99

1010
Aquí usaremos `window`, suponiendo que nuestro entorno sea un navegador. Si su script puede ejecutarse en otros entornos, es mejor usar `globalThis` en su lugar.
1111

@@ -83,7 +83,7 @@ if (!window.Promise) {
8383

8484
- El objeto global tiene un nombre universal: `globalThis`.
8585

86-
... Pero con mayor frecuencia se hace referencia a nombres específicos del entorno de la "vieja escuela", como `window` (navegador) y `global` (Node.js). Como `globalThis` es una propuesta reciente, no es compatible con Chromium Edge (pero sí mediante *polyfill*).
86+
... Pero con mayor frecuencia se hace referencia a nombres específicos del entorno de la "vieja escuela", como `window` (navegador) y `global` (Node.js).
8787

8888
- Deberíamos almacenar valores en el objeto global solo si son verdaderamente globales para nuestro proyecto. Y manteniendo su uso al mínimo.
8989
- En el navegador, a menos que estemos utilizando [módulos](info:modules), las funciones globales y las variables declaradas con `var` se convierten en una propiedad del objeto global.

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ importance: 5
66

77
El resultado del decorador `debounce(f, ms)` es un contenedor que suspende las llamadas a `f` hasta que haya `ms` milisegundos de inactividad (sin llamadas, "período de enfriamiento"), luego invoca `f` una vez con los últimos argumentos.
88

9+
En otras palabras, `debounce` es como una secretaria que acepta "llamadas telefónicas" y espera hasta que haya `ms` milisegundos de silencio. Y solo entonces transfiere la información de la última llamada al "jefe" (llama a la "f" real).
10+
911
Por ejemplo, teníamos una función `f` y la reemplazamos con `f = debounce(f, 1000)`.
1012

1113
Entonces, si la función contenedora se llama a 0ms, 200ms y 500ms, y luego no hay llamadas, entonces la 'f' real solo se llamará una vez, a 1500ms. Es decir: después del período de enfriamiento de 1000 ms desde la última llamada.

1-js/06-advanced-functions/09-call-apply-decorators/04-throttle/task.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ La diferencia con *debounce* es que es un decorador completamente diferente:
1212
- `debounce` ejecuta la función una vez después del período de `enfriamiento`. Es bueno para procesar el resultado final.
1313
- `throttle` lo ejecuta no más de lo que se le da en el tiempo `ms`. Es bueno para actualizaciones regulares que no deberían ser muy frecuentes.
1414

15+
En otras palabras, "throttle" es como una secretaria que acepta llamadas telefónicas, pero molesta al jefe (llama a la "f" real) no más de una vez por milisegundos `ms`.
16+
1517
Revisemos una aplicación de la vida real para comprender mejor ese requisito y ver de dónde proviene.
1618

1719
**Por ejemplo, queremos rastrear los movimientos del mouse.**

1-js/08-prototypes/01-prototype-inheritance/article.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@ alert(admin.fullName); // John Smith (*)
197197

198198
// disparadores setter!
199199
admin.fullName = "Alice Cooper"; // (**)
200+
201+
alert(admin.fullName); // Alice Cooper , estado de admin modificado
202+
alert(user.fullName); // John Smith , estado de user protegido
200203
```
201204

202205
Aquí en la línea `(*)` la propiedad `admin.fullName` tiene un getter en el prototipo `user`, por lo que es llamado. Y en la línea `(**)` la propiedad tiene un setter en el prototipo, por lo que es llamado.

1-js/09-classes/07-mixins/article.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,11 @@ let eventMixin = {
154154
* this.trigger('select', data1, data2);
155155
*/
156156
trigger(eventName, ...args) {
157-
if (!this._eventHandlers || !this._eventHandlers[eventName]) {
157+
if (!this._eventHandlers?.[eventName]) {
158158
return; // no hay controladores para ese nombre de evento
159159
}
160160

161-
// call the handlers
161+
// Llama al controlador
162162
this._eventHandlers[eventName].forEach(handler => handler.apply(this, args));
163163
}
164164
};

0 commit comments

Comments
 (0)