Skip to content
Merged
Show file tree
Hide file tree
Changes from 108 commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
176e5f8
Fix typos in 1.5.3
vsemozhetbyt Oct 8, 2020
f880f1f
Make code example more realistic and safe
vsemozhetbyt Oct 9, 2020
b2b83b7
Correct outdated info
vsemozhetbyt Oct 9, 2020
54c8247
Fix link in 1.5.3
vsemozhetbyt Oct 7, 2020
858ad69
Fix some possible typos and omissions in 1.5.5
vsemozhetbyt Oct 9, 2020
dea1a2d
Add a note on some()/every() short circuit
vsemozhetbyt Oct 9, 2020
7b70f79
Mention arr.flat()/arr.flatMap() in 1.5.5
vsemozhetbyt Oct 9, 2020
2336288
typo
Taruna06 Oct 10, 2020
4ee44dc
Fix a typo in a 1.5.5 task solution
vsemozhetbyt Oct 10, 2020
3188466
Make a solution of 1.5.5 task more correct
vsemozhetbyt Oct 10, 2020
1273ae4
minor fixes
iliakan Oct 11, 2020
e7953a4
minor fixes
iliakan Oct 11, 2020
3fbbcd1
minor fixes
iliakan Oct 11, 2020
d3b38c2
minor fixes
iliakan Oct 11, 2020
35f47b9
Merge pull request #2172 from vsemozhetbyt/patch-1
iliakan Oct 11, 2020
8e613bc
Merge pull request #2185 from vsemozhetbyt/patch-9
iliakan Oct 11, 2020
3ba22f7
Merge pull request #2184 from vsemozhetbyt/patch-8
iliakan Oct 11, 2020
95016bc
Merge pull request #2183 from Taruna06/master
iliakan Oct 11, 2020
37f67e6
Merge pull request #2181 from vsemozhetbyt/patch-7
iliakan Oct 11, 2020
80efcda
Merge pull request #2180 from vsemozhetbyt/patch-6
iliakan Oct 11, 2020
60ec589
Merge pull request #2179 from vsemozhetbyt/patch-5
iliakan Oct 11, 2020
1a4849a
Merge pull request #2178 from vsemozhetbyt/patch-4
iliakan Oct 11, 2020
b6f3f5c
Merge pull request #2175 from vsemozhetbyt/patch-2
iliakan Oct 11, 2020
0599d07
Merge pull request #2177 from vsemozhetbyt/patch-3
iliakan Oct 11, 2020
75aed55
assign "it"
joaquinelio Oct 12, 2020
1431a25
Merge pull request #2188 from joaquinelio/patch-1
iliakan Oct 12, 2020
bb70310
Update 2-ui/4-forms-controls/1-form-elements/article.md
dorelljames Oct 12, 2020
040efef
Update task.md
dorelljames Oct 12, 2020
ac28995
Merge pull request #2194 from dorelljames/patch-4
iliakan Oct 12, 2020
552c0b7
Update article.md
dorelljames Oct 12, 2020
54df94d
Winnie Pooh case... : )
joaquinelio Oct 12, 2020
8ccc7f6
Merge pull request #2190 from dorelljames/patch-2
iliakan Oct 13, 2020
872cc6a
Merge pull request #2195 from joaquinelio/patch-1
iliakan Oct 13, 2020
6e61e8a
Fix: change ; => ,
leviding Oct 14, 2020
15767fc
Merge pull request #2198 from leviding/patch-23
lex111 Oct 14, 2020
9d49866
redundant "use case"
joaquinelio Oct 15, 2020
1fbc508
Merge pull request #2207 from joaquinelio/patch-2
iliakan Oct 16, 2020
10d1b1f
minor fixes
iliakan Oct 16, 2020
d6e8864
minor fixes
iliakan Oct 17, 2020
ca1ef0d
FIX: change ; to ,
leviding Oct 18, 2020
649539e
FIX: delete extra space
leviding Oct 18, 2020
4131b29
FIX: delete extra space
leviding Oct 19, 2020
030decc
Update article.md
iliakan Oct 20, 2020
9d4a69d
Update article.md
iliakan Oct 20, 2020
c634301
Update article.md
iliakan Oct 20, 2020
e74295c
Update article.md
iliakan Oct 20, 2020
959dc23
Update article.md
iliakan Oct 20, 2020
7487ce9
Update article.md
iliakan Oct 20, 2020
c69ca0d
Update article.md
iliakan Oct 20, 2020
44a17a3
Update article.md
iliakan Oct 20, 2020
d4120a0
Update article.md
iliakan Oct 20, 2020
fca113b
Update article.md
iliakan Oct 20, 2020
d961910
Update article.md
iliakan Oct 20, 2020
9ad8f66
Update article.md
iliakan Oct 20, 2020
e92bbb1
Update article.md
iliakan Oct 20, 2020
1197b01
Update article.md
iliakan Oct 20, 2020
614c5ff
Update article.md
iliakan Oct 20, 2020
6393a9f
Update article.md
iliakan Oct 20, 2020
a502398
Update article.md
iliakan Oct 20, 2020
24ff585
Update article.md
iliakan Oct 20, 2020
971a32e
Update article.md
iliakan Oct 20, 2020
7d05ada
Mention HTML attribute events in the summary
aruku Oct 19, 2020
ad3a7cc
Fix typo (I think)
aruku Oct 19, 2020
9b2f866
Fix typo in 1.4.7 (optional chaining)
vsemozhetbyt Oct 20, 2020
b0c60e3
Remove possibly outdated comment
vsemozhetbyt Oct 20, 2020
ae72328
Merge pull request #2222 from vsemozhetbyt/patch-11
iliakan Oct 20, 2020
4a75ea4
Mention function declaration in 1.6.5 (global object)
vsemozhetbyt Oct 21, 2020
e8455bc
Fix a typo in 1.6.6 (function object, NFE)
vsemozhetbyt Oct 21, 2020
518daec
Fix possible typo in 1.6.7 ("new Function" syntax)
vsemozhetbyt Oct 22, 2020
ad49592
Fix typos, specify link in 1.6.8 (Scheduling)
vsemozhetbyt Oct 22, 2020
c8edd84
Merge pull request #2213 from leviding/patch-28
iliakan Oct 22, 2020
3897d24
Merge pull request #2214 from leviding/patch-29
iliakan Oct 22, 2020
a10d94d
Merge pull request #2218 from aruku/aruku-patch-1
iliakan Oct 22, 2020
bd0fbbe
Merge pull request #2219 from vsemozhetbyt/patch-9
iliakan Oct 22, 2020
7ddddd2
Merge pull request #2224 from vsemozhetbyt/patch-11
iliakan Oct 22, 2020
decb6a2
Merge pull request #2226 from vsemozhetbyt/patch-12
iliakan Oct 22, 2020
44252ad
Merge pull request #2228 from vsemozhetbyt/patch-13
iliakan Oct 22, 2020
2d5be7b
Merge pull request #2229 from vsemozhetbyt/patch-14
iliakan Oct 22, 2020
58ee49a
Update task.md
Herrera-pgoat Oct 22, 2020
567d911
Minor clarification on WeakMap and WeakSet
DawidKopys Oct 24, 2020
2e05706
Replace rules.indent array with number
mikemitchell574 Oct 24, 2020
901e5ef
Update topic sentence
mikemitchell574 Oct 25, 2020
7ee9c6a
Fix links in 1.8.4 (Prototype methods)
vsemozhetbyt Oct 25, 2020
ccfec1f
Add emphasis for clarity
mikemitchell574 Oct 25, 2020
980f487
Update article.md
plakxj Oct 27, 2020
0682ae7
Delete excess semicolon in 1.9.1 (Class basic syntax)
vsemozhetbyt Oct 27, 2020
9bf1489
Clarify task code place in 1.9.1 (Class basic syntax)
vsemozhetbyt Oct 27, 2020
9a35678
Add missing semicolons in 1.9.2 (Class inheritance)
vsemozhetbyt Oct 27, 2020
7aa2867
Include "object" in MDN link
mikemitchell574 Oct 28, 2020
98d1dc9
modify typo
Youngjin-KimY Oct 29, 2020
972c7ab
Fix possibly outdated note in 1.9.6 (instanceof)
vsemozhetbyt Oct 29, 2020
dc415a6
Merge pull request #2245 from vsemozhetbyt/patch-13
iliakan Oct 29, 2020
075e041
Merge pull request #2243 from Youngjin-KimY/patch-1
iliakan Oct 29, 2020
d1f4466
Merge pull request #2241 from mikemitchell574/patch-6
iliakan Oct 29, 2020
2a55b5b
Merge pull request #2230 from Herrera-pgoat/patch-1
iliakan Oct 29, 2020
0c760be
Update task.md
iliakan Oct 29, 2020
ca17a69
Merge pull request #2231 from Dewke/dewke-minor-fix
iliakan Oct 29, 2020
6a3835a
Merge pull request #2233 from mikemitchell574/patch-1
iliakan Oct 29, 2020
0da8037
Merge pull request #2234 from mikemitchell574/patch-3
iliakan Oct 29, 2020
4379770
Merge pull request #2235 from vsemozhetbyt/patch-9
iliakan Oct 29, 2020
879cfa0
Merge pull request #2236 from mikemitchell574/patch-4
iliakan Oct 29, 2020
1f2987d
Merge pull request #2237 from plakxj/patch-1
iliakan Oct 29, 2020
a6f101c
Merge pull request #2238 from vsemozhetbyt/patch-10
iliakan Oct 29, 2020
4741494
Merge pull request #2239 from vsemozhetbyt/patch-11
iliakan Oct 29, 2020
8c39566
Merge pull request #2240 from vsemozhetbyt/patch-12
iliakan Oct 29, 2020
f2078b1
Update article.md
iliakan Oct 29, 2020
b29ef55
susy 2020 10 22
joaquinelio Nov 3, 2020
e47db18
Update article.md
joaquinelio Nov 3, 2020
a947397
Apply suggestions from code review
joaquinelio Nov 8, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion 1-js/03-code-quality/02-coding-style/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ Aquí un ejemplo de un archivo `.eslintrc`:
},
"rules": {
"no-console": 0,
"indent": ["warning", 2]
"indent": 2
}
}
```
Expand Down
4 changes: 3 additions & 1 deletion 1-js/03-code-quality/06-polyfills/article.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

# Polyfills

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).
Expand All @@ -22,7 +23,8 @@ En realidad, hay dos partes en Babel:

2. Segundo, el polyfill.

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.
Nuevas características del lenguaje pueden incluir no solo contrucciones sintácticas sino también funciones incorporadas.
El transpiler 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.

Existe el término "polyfill" para scripts que "llenan"(fill in) el vacío y agregan las implementaciones que faltan.

Expand Down
13 changes: 9 additions & 4 deletions 1-js/04-object-basics/03-garbage-collection/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ Simple, los valores "alcanzables" son aquellos que son accesibles o se pueden ut
1. Hay un conjunto base de valores inherentemente accesibles, que no se pueden eliminar por razones obvias.

Por ejemplo:

- Variables locales y parámetros de la función actual.
- Variables y parámetros para otras funciones en la cadena actual de llamadas anidadas.
- Variables Globales
Expand All @@ -22,7 +23,7 @@ Simple, los valores "alcanzables" son aquellos que son accesibles o se pueden ut

2. Cualquier otro valor se considera accesible si es accesible desde una raíz(root) por una referencia o por una cadena de referencias.

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.
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.

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.

Expand Down Expand Up @@ -96,7 +97,9 @@ let family = marry({
name: "Ann"
});
```

La función `marry` "casa" dos objetos dándoles referencias entre sí y devuelve un nuevo objeto que los contiene a ambos.

La estructura de memoria resultante:

![](family.svg)
Expand Down Expand Up @@ -178,12 +181,13 @@ Ahora los objetos que no se pudieron visitar en el proceso se consideran inalcan

![](garbage-collection-5.svg)

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.

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.

Algunas de las optimizaciones
Algunas de las optimizaciones:

- **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.
- **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.
- **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.
- **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.

Expand All @@ -204,4 +208,5 @@ Un libro general "The Garbage Collection Handbook: The Art of Automatic Memory M
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).

[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.

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.
8 changes: 5 additions & 3 deletions 1-js/04-object-basics/04-object-methods/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ user.sayHi(); // ¡Hola!

Aquí simplemente usamos una expresión de función para crear la función y asignarla a la propiedad `user.sayHi` del objeto.

Entonces la llamamos. ¡El usuario ahora puede hablar!
Entonces la llamamos con `user.sayHi()`. ¡El usuario ahora puede hablar!

Una función que es la propiedad de un objeto es denominada su *método*.

Expand Down Expand Up @@ -160,14 +160,16 @@ let user = {
let admin = user;
user = null; // sobrescribimos para hacer las cosas evidentes

admin.sayHi(); // ¡oops! dentro de sayHi(), ¡Se usa el nombre viejo! ¡Error!
*!*
admin.sayHi(); // TypeError: No se puede leer la propiedad 'name' de null
*/!*
```

Si usamos `this.name` en vez de `user.name` dentro de `alert`, entonces el código funciona.

## "this" no es vinculado

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.
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.

No hay error de sintaxis en el siguiente ejemplo:

Expand Down
15 changes: 9 additions & 6 deletions 1-js/04-object-basics/07-optional-chaining/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ Por ejemplo:
```js run
let user = {}; // El usuario no tiene dirección

alert( user && user.address && user.address.street ); // undefined (no error)
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.
Expand Down Expand Up @@ -113,17 +113,20 @@ Por ejemplo, `?.()` Se usa para llamar a una función que puede no existir.
En el siguiente código, algunos de nuestros usuarios tienen el método `admin`, y otros no:

```js run
let user1 = {
let userAdmin = {
admin() {
alert("I am admin");
}
}
};

let userGuest = {};

let user2 = {};
*!*
userAdmin.admin?.(); // I am admin
*/!*

*!*
user1.admin?.(); // I am admin
user2.admin?.();
userGuest.admin?.(); // nothing (no such method)
*/!*
```

Expand Down
2 changes: 1 addition & 1 deletion 1-js/05-data-types/03-string/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ alert('Yo soy \'Walrus\''); // Yo soy 'Walrus'

Como puedes ver, debimos anteponer un caracter de escape `\` antes de cada comilla ya que de otra manera hubiera indicado el final del string.

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:
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:

```js run
alert(`Yo soy "Walrus"`); // Yo soy "Walrus"
Expand Down
2 changes: 1 addition & 1 deletion 1-js/05-data-types/05-array-methods/2-filter-range/task.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ importance: 4

# Filtrar un rango

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.
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.

La función no debe modificar el array. Debe devolver un nuevo array.

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
```js run no-beautify
function sortByAge(arr) {
arr.sort((a, b) => a.age > b.age ? 1 : -1);
arr.sort((a, b) => a.age - b.age);
}

let john = { name: "John", age: 25 };
Expand Down
11 changes: 8 additions & 3 deletions 1-js/05-data-types/05-array-methods/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -419,13 +419,14 @@ Ahora sí funciona como esperábamos.

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.

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.
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.

Por cierto, si alguna vez queremos saber qué elementos son comparados -- nada nos impide ejecutar alert() en ellos:

```js run
[1, -2, 15, 2, 0, 8].sort(function(a, b) {
alert( a + " <> " + b );
return a - b;
});
```

Expand Down Expand Up @@ -700,7 +701,7 @@ alert(soldiers[1].age); // 23

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.

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.
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.

## Resumen

Expand Down Expand Up @@ -729,7 +730,7 @@ Veamos el ayudamemoria de métodos para arrays:
- `sort(func)` -- ordena el array y lo devuelve.
- `reverse()` -- ordena el array de forma inversa y lo devuelve.
- `split/join` -- convierte una cadena en un array y viceversa.
- `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.
- `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.

- Adicional:
- `Array.isArray(arr)` comprueba que `arr` sea un array.
Expand All @@ -741,6 +742,8 @@ Estos métodos son los más utilizados y cubren el 99% de los casos. Pero existe
- [arr.some(fn)](mdn:js/Array/some)/[arr.every(fn)](mdn:js/Array/every) comprueba el array.

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`.

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.

Podemos usar `every` para comparar arrays:
```js run
Expand All @@ -755,6 +758,8 @@ Podemos usar `every` para comparar arrays:

- [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).

- [arr.flat(depth)](mdn:js/Array/flat)/[arr.flatMap(fn)](mdn:js/Array/flatMap) crea un nuevo array plano desde un array multidimensional .

Para la lista completa, ver [manual](mdn:js/Array).

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.
Expand Down
6 changes: 3 additions & 3 deletions 1-js/05-data-types/08-weakmap-weakset/article.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# WeakMap y WeakSet


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).
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).

Por ejemplo:
```js
Expand Down Expand Up @@ -31,7 +30,8 @@ let array = [ john ];
john = null; // sobrescribe la referencia

*!*
// John se almacena dentro del array, por lo que no será recolectado por el recolector de basura
// El objeto referenciado por John se almacena dentro del array,
// por lo que no será recolectado por el recolector de basura
// Lo podemos obtener como array[0]
*/!*
```
Expand Down
2 changes: 1 addition & 1 deletion 1-js/06-advanced-functions/04-var/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ function sayHi() {
}

sayHi();
alert(phrase); // Error: phrase no está definida (Revise consola de desarrollador)
alert(phrase); // Error: phrase no está definida
```

Como podemos ver, `var` atraviesa `if`, `for` u otros bloques. Esto es porque mucho tiempo atrás los bloques en JavaScript no tenían ambientes léxicos. Y `var` es un remanente de aquello.
Expand Down
2 changes: 2 additions & 0 deletions 1-js/06-advanced-functions/05-global-object/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ var gVar = 5;
alert(window.gVar); // 5 (se convirtió en una propiedad del objeto global)
```

El mismo efecto lo tienen la declaraciones de función (sentencias con la palabra clave `function` en el flujo principal del código, no las expresiones de función).

¡Por favor no te fíes de eso! Este comportamiento existe por razones de compatibilidad. Los scripts modernos hacen uso de [Módulos Javascript](info:modules) para que tales cosas no sucedan.

Si usáramos `let` en su lugar, esto no sucedería:
Expand Down
2 changes: 1 addition & 1 deletion 1-js/06-advanced-functions/06-function-object/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -343,11 +343,11 @@ Aquí cubrimos sus propiedades:
- `name` -- El nombre de la función. Por lo general, se toma de la definición de la función, pero si no hay ninguno, JavaScript intenta adivinarlo por el contexto (por ejemplo, una asignación).
- `length` -- El número de argumentos en la definición de la función. Los *parámetros rest* no se cuentan.


Si la función se declara como una Expresión de función (no en el flujo de código principal), y lleva el nombre, se llama Expresión de Función con Nombre *(Named Function Expression)*. El nombre se puede usar dentro para hacer referencia a sí mismo, para llamadas recursivas o similares.

Además, las funciones pueden tener propiedades adicionales. Muchas bibliotecas de JavaScript conocidas hacen un gran uso de esta función.

Crean una función "principal" y le asignan muchas otras funciones "auxiliares". Por ejemplo, la biblioteca [jQuery](https://jquery.com) crea una función llamada `$`. La biblioteca [lodash](https://lodash.com) crea una función `_`, y luego agrega `_.clone`, `_.keyBy` y otras propiedades (mira los [docs](https://lodash.com/docs) cuando quieras aprender más sobre ello). En realidad, lo hacen para disminuir su contaminación del espacio global, de modo que una sola biblioteca proporciona solo una variable global. Eso reduce la posibilidad de conflictos de nombres.


Por lo tanto, una función puede hacer un trabajo útil por sí misma y también puede tener muchas otras funcionalidades en las propiedades.
Loading