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/03-code-quality/06-polyfills/article.md
+3-1Lines changed: 3 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,3 +1,4 @@
1
+
1
2
# Polyfills
2
3
3
4
El lenguaje JavaScript evoluciona constantemente. Nuevas propuestas al lenguaje aparecen regularmente, son analizadas y, si se consideran valiosas, se agregan a la lista en <https://tc39.github.io/ecma262/> y luego avanzan hasta [specification](http://www.ecma-international.org/publications/standards/Ecma-262.htm).
@@ -22,7 +23,8 @@ En realidad, hay dos partes en Babel:
22
23
23
24
2. Segundo, el polyfill.
24
25
25
-
El transpiler reescribe el código, por lo que se cubren las características de la sintaxis. Pero para funciones nuevas tenemos que escribir un script especial que las implemente. JavaScript es un lenguaje muy dinámico, puede que los scripts no solo agreguen nuevas funciones, sino también modifiquen las funciones incorporadas, para que actúen de forma correspondiente al estándar moderno.
26
+
Nuevas características del lenguaje pueden incluir no solo contrucciones sintácticas sino también funciones incorporadas.
27
+
El transpilador reescribe el código, transformando las contrucciones sintácticas nuevas al viejo formato. Pero para funciones nuevas, necesitamos implementarlas. JavaScript es un lenguaje muy dinámico, los scripts pueden agregar o modificar cualquier función para que actúen acorde al estándar moderno.
26
28
27
29
Existe el término "polyfill" para scripts que "llenan"(fill in) el vacío y agregan las implementaciones que faltan.
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/03-garbage-collection/article.md
+9-4Lines changed: 9 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -13,6 +13,7 @@ Simple, los valores "alcanzables" son aquellos que son accesibles o se pueden ut
13
13
1. Hay un conjunto base de valores inherentemente accesibles, que no se pueden eliminar por razones obvias.
14
14
15
15
Por ejemplo:
16
+
16
17
- Variables locales y parámetros de la función actual.
17
18
- Variables y parámetros para otras funciones en la cadena actual de llamadas anidadas.
18
19
- Variables Globales
@@ -22,7 +23,7 @@ Simple, los valores "alcanzables" son aquellos que son accesibles o se pueden ut
22
23
23
24
2. Cualquier otro valor se considera accesible si es accesible desde una raíz(root) por una referencia o por una cadena de referencias.
24
25
25
-
Por ejemplo, si hay un objeto en una variable local, y ese objeto tiene una propiedad que hace referencia a otro objeto, ese objeto se considera accesible. Y aquellos a los que hace referencia también son accesibles. Ejemplos detallados a seguir.
26
+
Por ejemplo, si hay un objeto en una variable local, y ese objeto tiene una propiedad que hace referencia a otro objeto, ese objeto se considera accesible. Y aquellos a los que hace referencia también son accesibles. Ejemplos detallados a seguir.
26
27
27
28
Hay un proceso en segundo plano en el motor de JavaScript que se llama [recolector de basura] (https://es.wikipedia.org/wiki/Recolector_de_basura). Monitorea todos los objetos y elimina aquellos que se han vuelto inalcanzables.
28
29
@@ -96,7 +97,9 @@ let family = marry({
96
97
name:"Ann"
97
98
});
98
99
```
100
+
99
101
La función `marry` "casa" dos objetos dándoles referencias entre sí y devuelve un nuevo objeto que los contiene a ambos.
102
+
100
103
La estructura de memoria resultante:
101
104
102
105

@@ -178,12 +181,13 @@ Ahora los objetos que no se pudieron visitar en el proceso se consideran inalcan
178
181
179
182

180
183
184
+
Podemos imaginar el proceso como derramar un enorme cubo de pintura desde las raíces, que fluye a través de todas las referencias y marca todos los objetos alcanzables. Los elementos que no queden marcados son entonces eliminados.
185
+
181
186
Ese es el concepto de cómo funciona la recolección de basura. El motor de JavaScript aplica muchas optimizaciones para que se ejecute más rápido y no afecte la ejecución.
182
187
183
-
Algunas de las optimizaciones
188
+
Algunas de las optimizaciones:
184
189
185
-
-**Colección generacional** -- los objetos se dividen en dos conjuntos:
186
-
"nuevos" y "antiguos". Aparecen muchos objetos, hacen su trabajo y mueren rápido, se pueden limpiar agresivamente. Aquellos que sobreviven el tiempo suficiente, se vuelven "viejos" y son examinados con menos frecuencia.
190
+
-**Colección generacional** -- los objetos se dividen en dos conjuntos: "nuevos" y "antiguos". Aparecen muchos objetos, hacen su trabajo y mueren rápido, se pueden limpiar agresivamente. Aquellos que sobreviven el tiempo suficiente, se vuelven "viejos" y son examinados con menos frecuencia.
187
191
-**Colección incremental** -- Si hay muchos objetos y tratamos de caminar y marcar todo el conjunto de objetos a la vez, puede llevar algún tiempo e introducir retrasos visibles en la ejecución. Entonces el motor intenta dividir la recolección de basura en pedazos. Luego las piezas se ejecutan una por una, por separado. Eso requiere una contabilidad adicional entre ellos para rastrear los cambios, pero tenemos muchos pequeños retrasos en lugar de uno grande.
188
192
-**Recolección de tiempo inactivo** -- el recolector de basura trata de ejecutarse solo mientras la CPU está inactiva, para reducir el posible efecto en la ejecución.
189
193
@@ -204,4 +208,5 @@ Un libro general "The Garbage Collection Handbook: The Art of Automatic Memory M
204
208
Si estás familiarizado con la programación de bajo nivel, la información más detallada sobre el recolector de basura V8 se encuentra en el artículo [A tour of V8: Garbage Collection](http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection).
205
209
206
210
[V8 blog](http://v8project.blogspot.com/) también publica artículos sobre cambios en la administración de memoria de vez en cuando. Naturalmente, para aprender la recolección de basura, es mejor que se prepare aprendiendo sobre los componentes internos de V8 en general y lea el blog de [Vyacheslav Egorov](http://mrale.ph) que trabajó como uno de los ingenieros de V8. Estoy diciendo: "V8", porque se cubre mejor con artículos en Internet. Para otros motores, muchos enfoques son similares, pero la recolección de basura difiere en muchos aspectos.
211
+
207
212
El conocimiento profundo de los motores es bueno cuando necesita optimizaciones de bajo nivel. Sería prudente planificar eso como el siguiente paso después de que esté familiarizado con el idioma.
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/04-object-methods/article.md
+5-3Lines changed: 5 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -34,7 +34,7 @@ user.sayHi(); // ¡Hola!
34
34
35
35
Aquí simplemente usamos una expresión de función para crear la función y asignarla a la propiedad `user.sayHi` del objeto.
36
36
37
-
Entonces la llamamos. ¡El usuario ahora puede hablar!
37
+
Entonces la llamamos con `user.sayHi()`. ¡El usuario ahora puede hablar!
38
38
39
39
Una función que es la propiedad de un objeto es denominada su *método*.
40
40
@@ -160,14 +160,16 @@ let user = {
160
160
let admin = user;
161
161
user =null; // sobrescribimos para hacer las cosas evidentes
162
162
163
-
admin.sayHi(); // ¡oops! dentro de sayHi(), ¡Se usa el nombre viejo! ¡Error!
163
+
*!*
164
+
admin.sayHi(); // TypeError: No se puede leer la propiedad 'name' de null
165
+
*/!*
164
166
```
165
167
166
168
Si usamos `this.name` en vez de `user.name` dentro de `alert`, entonces el código funciona.
167
169
168
170
## "this" no es vinculado
169
171
170
-
En JavaScript, la palabra clave `this` se comporta de manera distinta a la mayoría de otros lenguajes de programación. Puede ser usado en cualquier función.
172
+
En JavaScript, la palabra clave `this` se comporta de manera distinta a la mayoría de otros lenguajes de programación. Puede ser usado en cualquier función, incluso si no es el método de un objeto.
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/07-optional-chaining/article.md
+9-6Lines changed: 9 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -35,7 +35,7 @@ Por ejemplo:
35
35
```js run
36
36
let user = {}; // El usuario no tiene dirección
37
37
38
-
alert( user &&user.address&&user.address.street ); // undefined (no error)
38
+
alert( user.address&&user.address.street&&user.address.street.name ); // undefined (no error)
39
39
```
40
40
41
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.
@@ -113,17 +113,20 @@ Por ejemplo, `?.()` Se usa para llamar a una función que puede no existir.
113
113
En el siguiente código, algunos de nuestros usuarios tienen el método `admin`, y otros no:
Como puedes ver, debimos anteponer un caracter de escape `\` antes de cada comilla ya que de otra manera hubiera indicado el final del string.
112
112
113
-
Obviamente, eso se refiere sólo a las comillas que son iguales a las que están rodeando al string. Por lo que, una solución más elegante sería cambiar a comillas dobles o backticks:
113
+
Obviamente, eso se refiere sólo a las comillas que son iguales a las que están rodeando al string. Una solución más elegante sería cambiar a comillas dobles o backticks:
Copy file name to clipboardExpand all lines: 1-js/05-data-types/05-array-methods/2-filter-range/task.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ importance: 4
4
4
5
5
# Filtrar un rango
6
6
7
-
Escribe una función `filterRange(arr, a, b)` que obtenga un array `arr`, busque los elementos entre `a` y `b` y devuelva un array con los resultados.
7
+
Escribe una función `filterRange(arr, a, b)` que obtenga un array `arr`, busque los elementos con valor mayor o igual a `a` y menor o igual a`b` y devuelva un array con los resultados.
8
8
9
9
La función no debe modificar el array. Debe devolver un nuevo array.
Copy file name to clipboardExpand all lines: 1-js/05-data-types/05-array-methods/article.md
+8-3Lines changed: 8 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -419,13 +419,14 @@ Ahora sí funciona como esperábamos.
419
419
420
420
Demos un paso al costado un momento y pensemos que es lo que está pasando. El array `arr` puede ser un array de cualquier cosa, ¿no? Puede contener números, strings, objetos o lo que sea. Podemos decir que tenemos un conjunto de *ciertos items*. Para ordenarlos, necesitamos una *función de orden* que sepa cómo comparar los elementos. El orden por defecto es hacerlo como strings.
421
421
422
-
El método `arr.sort(fn)` implementa un algorito genérico de orden. No necesitamos preocuparnos de cómo funciona internamente (la mayoría de las veces es una forma optimizada del algoritmo [quicksort](https://es.wikipedia.org/wiki/Quicksort)). Este método va a recorrer el array, comparar sus elementos usando la función dada y, finalmente, reordenarlos. Todo los que necesitamos hacer es proveer la `fn` que realiza la comparación.
422
+
El método `arr.sort(fn)` implementa un algorito genérico de orden. No necesitamos preocuparnos de cómo funciona internamente (la mayoría de las veces es una forma optimizada del algoritmo [quicksort](https://es.wikipedia.org/wiki/Quicksort) o [Timsort](https://en.wikipedia.org/wiki/Timsort)). Este método va a recorrer el array, comparar sus elementos usando la función dada y, finalmente, reordenarlos. Todo los que necesitamos hacer es proveer la `fn` que realiza la comparación.
423
423
424
424
Por cierto, si alguna vez queremos saber qué elementos son comparados -- nada nos impide ejecutar alert() en ellos:
425
425
426
426
```js run
427
427
[1, -2, 15, 2, 0, 8].sort(function(a, b) {
428
428
alert( a +" <> "+ b );
429
+
return a - b;
429
430
});
430
431
```
431
432
@@ -700,7 +701,7 @@ alert(soldiers[1].age); // 23
700
701
701
702
Si en el ejemplo anterior usamos `users.filter(army.canJoin)`, entonces `army.canJoin` puede ser llamada como una función independiente, con `this=undefined`, lo que puede llevar a un error instantáneo.
702
703
703
-
La llamada a `users.filter(army.canJoin, army)` puede ser reemplazada con `users.filter(user => army.canJoin(user))` que realiza lo mismo. La forma anterior se usa más a menudo, ya que es un poco más fácil de entender.
704
+
La llamada a `users.filter(army.canJoin, army)` puede ser reemplazada con `users.filter(user => army.canJoin(user))` que realiza lo mismo. Esta última se usa más a menudo ya que es un poco más fácil de entender.
704
705
705
706
## Resumen
706
707
@@ -729,7 +730,7 @@ Veamos el ayudamemoria de métodos para arrays:
729
730
-`sort(func)` -- ordena el array y lo devuelve.
730
731
-`reverse()` -- ordena el array de forma inversa y lo devuelve.
731
732
-`split/join` -- convierte una cadena en un array y viceversa.
732
-
-`reduce(func, initial)` -- calcula un solo valor para todo el array llamando a la `func` para cada elemento y pasando un resultado intermedio entre cada llamada.
733
+
-`reduce/reduceRight(func, initial)` -- calcula un solo valor para todo el array llamando a la `func` para cada elemento y pasando un resultado intermedio entre cada llamada.
733
734
734
735
- Adicional:
735
736
-`Array.isArray(arr)` comprueba que `arr` sea un array.
@@ -741,6 +742,8 @@ Estos métodos son los más utilizados y cubren el 99% de los casos. Pero existe
741
742
-[arr.some(fn)](mdn:js/Array/some)/[arr.every(fn)](mdn:js/Array/every) comprueba el array.
742
743
743
744
La función `fn` es llamada para cada elemento del array de manera similar a `map`. Si alguno/todos los resultados son `true`, devuelve `true`, si no, `false`.
745
+
746
+
Estos métodos se comportan con similitud a los operadores `||` y `&&`: si `fn` devuelve un valor verdadero, `arr.some()` devuelve `true` y detiene la iteración de inmediato; si `fn` devuelve un valor falso, `arr.every()` devuelve `false` y detiene la iteración también.
744
747
745
748
Podemos usar `every` para comparar arrays:
746
749
```js run
@@ -755,6 +758,8 @@ Podemos usar `every` para comparar arrays:
755
758
756
759
-[arr.copyWithin(target, start, end)](mdn:js/Array/copyWithin) -- copia sus elementos desde la posición `start` hasta la posición `end` en *si mismo*, a la posición `target` (reescribe lo existente).
757
760
761
+
-[arr.flat(depth)](mdn:js/Array/flat)/[arr.flatMap(fn)](mdn:js/Array/flatMap) crea un nuevo array plano desde un array multidimensional .
762
+
758
763
Para la lista completa, ver [manual](mdn:js/Array).
759
764
760
765
A primera vista puede parecer que hay demasiados métodos para aprender y un tanto difíciles de recordar. Pero con el tiempo se vuelve más fácil.
Copy file name to clipboardExpand all lines: 1-js/05-data-types/08-weakmap-weakset/article.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,6 @@
1
1
# WeakMap y WeakSet
2
2
3
-
4
-
Como sabemos por el capítulo <info:garbage-collection>, el motor de JavaScript almacena un valor en la memoria mientras es accesible(y puede ser potencialmente usado).
3
+
Como sabemos por el capítulo <info:garbage-collection>, el motor de JavaScript almacena un valor en la memoria mientras es accesible (y puede ser potencialmente usado).
5
4
6
5
Por ejemplo:
7
6
```js
@@ -31,7 +30,8 @@ let array = [ john ];
31
30
john =null; // sobrescribe la referencia
32
31
33
32
*!*
34
-
// John se almacena dentro del array, por lo que no será recolectado por el recolector de basura
33
+
// El objeto referenciado por John se almacena dentro del array,
34
+
// por lo que no será recolectado por el recolector de basura
0 commit comments