\w+)/mg;
+let match = regexpNames.exec(personList);
+do {
+ console.log(`Hola ${match.groups.firstname} ${match.groups.lastname}`);
+} while((match = regexpNames.exec(personList)) !== null);
+```
+
+> **Nota:** No todos los navegadores admiten esta función; consulta la {{JSxRef("../Guide/Regular_Expressions", "tabla de compatibilidad", "#Compatibilidad_del_navegador")}}.
+
+## Especificaciones
+
+| Especificación |
+| -------------------------------------------------------------------------------- |
+| {{SpecName('ESDraft', '#sec-classranges', 'RegExp: Ranges')}} |
+
+## Compatibilidad del navegador
+
+Para obtener información sobre la compatibilidad del navegador, consulta la {{JSxRef("../Guide/Regular_Expressions", "tabla principal de compatibilidad de expresiones regulares", "#Compatibilidad_del_navegador")}}.
+
+## Ve también
+
+- {{JSxRef("../Guide/Regular_Expressions", "Guía de expresiones regulares")}}
+
+ - {{JSxRef("../Guide/Regular_Expressions/Character_Classes", "Clases de caracteres")}}
+ - {{JSxRef("../Guide/Regular_Expressions/Assertions", "Aserciones")}}
+ - {{JSxRef("../Guide/Regular_Expressions/Cuantificadores", "Cuantificadores")}}
+ - {{JSxRef("../Guide/Regular_Expressions/Escapes_de_propiedades_Unicode", "Escapes de propiedades Unicode")}}
+
+- {{JSxRef("Objetos_globales/RegExp", "El constructor RegExp()")}}
diff --git a/files/es/web/javascript/guide/regular_expressions/quantifiers/index.html b/files/es/web/javascript/guide/regular_expressions/quantifiers/index.html
deleted file mode 100644
index 4693f0ff61eba4..00000000000000
--- a/files/es/web/javascript/guide/regular_expressions/quantifiers/index.html
+++ /dev/null
@@ -1,183 +0,0 @@
----
-title: Cuantificadores
-slug: Web/JavaScript/Guide/Regular_Expressions/Quantifiers
-tags:
- - Expresiones Regulares
- - Guía
- - JavaScript
- - Referencia
- - cuantificadores
- - regex
-translation_of: Web/JavaScript/Guide/Regular_Expressions/Quantifiers
-original_slug: Web/JavaScript/Guide/Regular_Expressions/Cuantificadores
----
-{{jsSidebar("JavaScript Guide")}}
-
-Los cuantificadores indican el número de caracteres o expresiones que deben coincidir.
-
-{{EmbedInteractiveExample("pages/js/regexp-quantifiers.html", "taller")}}
-
-Tipos
-
-La siguiente tabla también está duplicada en {{JSxRef("../Guide/Regular_Expressions/Cheatsheet", "esta hoja de referencia")}}. No olvides editarla también, ¡gracias!
-
-
-
Nota : A continuación, elemento se refiere no solo a caracteres individuales, sino que también incluye {{JSxRef("../Guide/Regular_Expressions/Character_Classes", "clases de caracteres")}}, {{JSxRef("../Guide/Regular_Expressions/Unicode_Property_Escapes", "escapes de propiedades Unicode")}}, {{JSxRef("../Guide/Regular_Expressions/Grupos_y_rangos", "grupos y rangos")}}.
-
-
-
-
-
- Caracteres
- Significado
-
-
-
-
- x *
-
- Concuerda 0 o más veces con el elemento "x" anterior. Por ejemplo, /bu*/
coincide con "buuuu" en "Un fantasma abuuuucheado" y "b" en "Un búho gorjeó", pero nada en "Una cabra gruñó".
-
-
-
- x +
-
- Encuentra 1 o más veces el elemento "x" anterior Equivalente a {1,}
. Por ejemplo, /a+/
coincide con la "a " en "candy" y todas las "a "es en "caaaaaaandy".
-
-
-
- x ?
-
- Halla 0 o 1 vez el elemento "x" anterior. Por ejemplo, /e?le?/
coincide con "el" en "ángel" y "ele" en "ángeles".
-
- Si se usa inmediatamente después de cualquiera de los cuantificadores *
, +
, ?
, o {}
, hace que el cuantificador no sea codicioso (es decir que coincida con el mínimo número de veces), a diferencia del predeterminado, que es codicioso (que coincide con el máximo número de veces).
-
-
-
- x {n }
-
- Donde "n" es un número entero positivo, concuerda exactamente con "n" apariciones del elemento "x" anterior. Por ejemplo, /a{2}/
no coincide con la "a " de "candy", pero coincide con todas las "a "es de "caandy" y las dos primeras "a "es en "caaandy".
-
-
-
- x {n ,}
-
- Donde "n" es un número entero positivo, concuerda con al menos "n" apariciones del elemento "x". Por ejemplo, /a{2,}/
no coincide con las "a "es en "caramelo", pero coincide con todas las "a "es en "caaraamelo" y en "caaaaaaaraaaamelo".
-
-
-
- x {n ,m }
-
- Donde "n" es 0 o un número entero positivo, "m" es un número entero positivo y m > n
coincide con al menos "n" y como máximo "m" apariciones del elemento "x" anterior. Por ejemplo, /a{1,3}/
no coincide con nada en "crmelo", la "a " en "carmelo", las dos "a "es en "caarmelo" y las tres primeras "a "es en "caaaaaaarmelo". Observa que al comparar "caaaaaaarmelo", encuentra las "aaa", aunque la cadena original tenía más "a "es.
-
-
-
-
- x *?
- x +?
- x ??
- x {n}?
- x {n,}?
- x {n,m}?
-
-
- De manera predeterminada, los cuantificadores como *
y +
son "codiciosos", lo cual significa que intentan hacer coincidir la mayor cantidad posible de la cadena. El caracter ?
después del cuantificador hace que el cuantificador "no sea codicioso": lo cual significa que se detendrá tan pronto como encuentre una coincidencia. Por ejemplo, dada una cadena como "algún <foo> <bar> nuevo </bar> </foo>":
-
-
- /<.*>/
coincidirá con "<foo> <bar> nuevo </bar> </foo>"
- /<.*?>/
coincidirá con "<foo>"
-
-
-
-
-
-
-Ejemplos
-
-Patrón repetido
-
-var palabraTerminadaConAes = /\w+a+\b/;
-var mensajeDelicado = "Esto es Espartaaaaaaa";
-
-console.table(mensajeDelicado.match(palabraTerminadaConAes)); // [ "Espartaaaaaaa" ]
-
-
-Conteo de caracteres
-
-var palabraDeUnaLetra = /\b\w\b/g;
-var palabraNoTanLarga = /\b\w{1,6}\b/g;
-var palabraLaaaaarga = /\b\w{10,}\b/g;
-
-var frase = "¿Por qué me tengo que sentar a estudiar las tablas de multiplicar?";
-
-console.table(frase.match(palabraDeUnaLetra)); // ["a"]
-console.table(frase.match(palabraNoTanLarga)); // ["Por", "qu", "me", "tengo", "que", "sentar", "a", "las", "tablas", "de"]
-console.table(frase.match(palabraLaaaaarga)); // ["multiplicar"]
-
-
-Caracter opcional
-
-var londinText = "He asked his neighbour a favour.";
-var yanquiText = "He asked his neighbor a favor.";
-
-var regexpEnding = /\w+ou?r/g;
-// \w+ Una o varias letras
-// o seguida de una "o",
-// u? opcionalmente seguida de una "u"
-// r seguida de una "r"
-
-console.table(londinText.match(regexpEnding));
-// ["neighbour", "favour"]
-
-console.table(yanquiText.match(regexpEnding));
-// ["neighbor", "favor"]
-
-
-Codicioso versus no codicioso
-
-var texto = "Debo estar muy cerca del centro de la tierra.";
-var regexpCodiciosa = /[\w ]+/;
-// [\w ] una letra del alfabeto latino o un espacio en blanco
-// + una o varias veces
-
-console.log(texto.match(regexpCodiciosa)[0]);
-// "Debo estar muy cerca del centro de la tierra."
-// casi todo el texto coincide (omite el caracter de punto)
-
-var regexpNoCodiciosa = /[\w ]+?/; // Observa el signo de interrogación
-console.log(texto.match(regexpNoCodiciosa));
-// "D"
-// La coincidencia es la más pequeña posible
-
-
-Especificaciones
-
-
-
-
- Especificación
-
-
- {{SpecName('ESDraft', '#sec-quantifier', 'RegExp: Quantifiers')}}
-
-
-
-
-Compatibilidad del navegador
-
-Para obtener información sobre la compatibilidad del navegador, consulta la {{JSxRef("../Guide/Regular_Expressions", "tabla principal de compatibilidad de expresiones regulares", "#Compatibilidad_del_navegador")}}.
-
-Ve también
-
-
- {{JSxRef("../Guide/Regular_Expressions", "Guía de expresiones regulares")}}
-
-
- {{JSxRef("../Guide/Regular_Expressions/Character_Classes", "Clases de caracteres")}}
- {{JSxRef("../Guide/Regular_Expressions/Assertions", "Aserciones")}}
- {{JSxRef("../Guide/Regular_Expressions/Escapes_de_propiedades_Unicode", "Escapes de propiedades Unicode")}}
- {{JSxRef("../Guide/Regular_Expressions/Grupos_y_rangos", "Grupos y rangos")}}
-
-
- {{JSxRef("Objetos_globales/RegExp", "El constructor RegExp()")}}
-
diff --git a/files/es/web/javascript/guide/regular_expressions/quantifiers/index.md b/files/es/web/javascript/guide/regular_expressions/quantifiers/index.md
new file mode 100644
index 00000000000000..ba86503f834e4f
--- /dev/null
+++ b/files/es/web/javascript/guide/regular_expressions/quantifiers/index.md
@@ -0,0 +1,172 @@
+---
+title: Cuantificadores
+slug: Web/JavaScript/Guide/Regular_Expressions/Quantifiers
+tags:
+ - Expresiones Regulares
+ - Guía
+ - JavaScript
+ - Referencia
+ - cuantificadores
+ - regex
+translation_of: Web/JavaScript/Guide/Regular_Expressions/Quantifiers
+original_slug: Web/JavaScript/Guide/Regular_Expressions/Cuantificadores
+---
+{{jsSidebar("JavaScript Guide")}}
+
+Los cuantificadores indican el número de caracteres o expresiones que deben coincidir.
+
+{{EmbedInteractiveExample("pages/js/regexp-quantifiers.html", "taller")}}
+
+## Tipos
+
+La siguiente tabla también está duplicada en {{JSxRef("../Guide/Regular_Expressions/Cheatsheet", "esta hoja de referencia")}}. No olvides editarla también, ¡gracias!
+
+> **Nota:** A continuación, _elemento_ se refiere no solo a caracteres individuales, sino que también incluye {{JSxRef("../Guide/Regular_Expressions/Character_Classes", "clases de caracteres")}}, {{JSxRef("../Guide/Regular_Expressions/Unicode_Property_Escapes", "escapes de propiedades Unicode")}}, {{JSxRef("../Guide/Regular_Expressions/Grupos_y_rangos", "grupos y rangos")}}.
+
+
+
+
+ Caracteres
+ Significado
+
+
+
+
+ x *
+
+ Concuerda 0 o más veces con el elemento "x" anterior. Por ejemplo, /bu*/
coincide con "buuuu" en "Un fantasma abuuuucheado" y "b" en "Un búho gorjeó", pero nada en "Una cabra gruñó".
+
+
+
+ x +
+
+ Encuentra 1 o más veces el elemento "x" anterior Equivalente a {1,}
. Por ejemplo, /a+/
coincide con la "a " en "candy" y todas las "a "es en "caaaaaaandy".
+
+
+
+ x ?
+
+ Halla 0 o 1 vez el elemento "x" anterior. Por ejemplo, /e?le?/
coincide con "el" en "ángel" y "ele" en "ángeles".
+ Si se usa inmediatamente después de cualquiera de los cuantificadores *
, +
, ?
, o {}
, hace que el cuantificador no sea codicioso (es decir que coincida con el mínimo número de veces), a diferencia del predeterminado, que es codicioso (que coincide con el máximo número de veces).
+
+
+
+ x {n }
+
+ Donde "n" es un número entero positivo, concuerda exactamente con "n" apariciones del elemento "x" anterior. Por ejemplo, /a{2}/
no coincide con la "a " de "candy", pero coincide con todas las "a "es de "caandy" y las dos primeras "a "es en "caaandy".
+
+
+
+ x {n ,}
+
+ Donde "n" es un número entero positivo, concuerda con al menos "n" apariciones del elemento "x". Por ejemplo, /a{2,}/
no coincide con las "a "es en "caramelo", pero coincide con todas las "a "es en "caaraamelo" y en "caaaaaaaraaaamelo".
+
+
+
+ x {n ,m }
+
+ Donde "n" es 0 o un número entero positivo, "m" es un número entero positivo y m > n
coincide con al menos "n" y como máximo "m" apariciones del elemento "x" anterior. Por ejemplo, /a{1,3}/
no coincide con nada en "crmelo", la "a " en "carmelo", las dos "a "es en "caarmelo" y las tres primeras "a "es en "caaaaaaarmelo". Observa que al comparar "caaaaaaarmelo", encuentra las "aaa", aunque la cadena original tenía más "a "es.
+
+
+
+
+ x *?
+ x +?
+ x ??
+ x {n}?
+ x {n,}?
+ x {n,m}?
+
+
+ De manera predeterminada, los cuantificadores como *
y +
son "codiciosos", lo cual significa que intentan hacer coincidir la mayor cantidad posible de la cadena. El caracter ?
después del cuantificador hace que el cuantificador "no sea codicioso": lo cual significa que se detendrá tan pronto como encuentre una coincidencia. Por ejemplo, dada una cadena como "algún <foo> <bar> nuevo </bar> </foo>":
+
+ /<.*>/
coincidirá con "<foo> <bar> nuevo </bar> </foo>"
+ /<.*?>/
coincidirá con "<foo>"
+
+
+
+
+
+
+## Ejemplos
+
+### Patrón repetido
+
+```js
+var palabraTerminadaConAes = /\w+a+\b/;
+var mensajeDelicado = "Esto es Espartaaaaaaa";
+
+console.table(mensajeDelicado.match(palabraTerminadaConAes)); // [ "Espartaaaaaaa" ]
+```
+
+### Conteo de caracteres
+
+```js
+var palabraDeUnaLetra = /\b\w\b/g;
+var palabraNoTanLarga = /\b\w{1,6}\b/g;
+var palabraLaaaaarga = /\b\w{10,}\b/g;
+
+var frase = "¿Por qué me tengo que sentar a estudiar las tablas de multiplicar?";
+
+console.table(frase.match(palabraDeUnaLetra)); // ["a"]
+console.table(frase.match(palabraNoTanLarga)); // ["Por", "qu", "me", "tengo", "que", "sentar", "a", "las", "tablas", "de"]
+console.table(frase.match(palabraLaaaaarga)); // ["multiplicar"]
+```
+
+### Caracter opcional
+
+```js
+var londinText = "He asked his neighbour a favour.";
+var yanquiText = "He asked his neighbor a favor.";
+
+var regexpEnding = /\w+ou?r/g;
+// \w+ Una o varias letras
+// o seguida de una "o",
+// u? opcionalmente seguida de una "u"
+// r seguida de una "r"
+
+console.table(londinText.match(regexpEnding));
+// ["neighbour", "favour"]
+
+console.table(yanquiText.match(regexpEnding));
+// ["neighbor", "favor"]
+```
+
+### Codicioso versus no codicioso
+
+```js
+var texto = "Debo estar muy cerca del centro de la tierra.";
+var regexpCodiciosa = /[\w ]+/;
+// [\w ] una letra del alfabeto latino o un espacio en blanco
+// + una o varias veces
+
+console.log(texto.match(regexpCodiciosa)[0]);
+// "Debo estar muy cerca del centro de la tierra."
+// casi todo el texto coincide (omite el caracter de punto)
+
+var regexpNoCodiciosa = /[\w ]+?/; // Observa el signo de interrogación
+console.log(texto.match(regexpNoCodiciosa));
+// "D"
+// La coincidencia es la más pequeña posible
+```
+
+## Especificaciones
+
+| Especificación |
+| ---------------------------------------------------------------------------------------- |
+| {{SpecName('ESDraft', '#sec-quantifier', 'RegExp: Quantifiers')}} |
+
+## Compatibilidad del navegador
+
+Para obtener información sobre la compatibilidad del navegador, consulta la {{JSxRef("../Guide/Regular_Expressions", "tabla principal de compatibilidad de expresiones regulares", "#Compatibilidad_del_navegador")}}.
+
+## Ve también
+
+- {{JSxRef("../Guide/Regular_Expressions", "Guía de expresiones regulares")}}
+
+ - {{JSxRef("../Guide/Regular_Expressions/Character_Classes", "Clases de caracteres")}}
+ - {{JSxRef("../Guide/Regular_Expressions/Assertions", "Aserciones")}}
+ - {{JSxRef("../Guide/Regular_Expressions/Escapes_de_propiedades_Unicode", "Escapes de propiedades Unicode")}}
+ - {{JSxRef("../Guide/Regular_Expressions/Grupos_y_rangos", "Grupos y rangos")}}
+
+- {{JSxRef("Objetos_globales/RegExp", "El constructor RegExp()")}}
diff --git a/files/es/web/javascript/guide/regular_expressions/unicode_property_escapes/index.html b/files/es/web/javascript/guide/regular_expressions/unicode_property_escapes/index.html
deleted file mode 100644
index cbc7d296620915..00000000000000
--- a/files/es/web/javascript/guide/regular_expressions/unicode_property_escapes/index.html
+++ /dev/null
@@ -1,178 +0,0 @@
----
-title: Escapes de propiedades Unicode
-slug: Web/JavaScript/Guide/Regular_Expressions/Unicode_Property_Escapes
-tags:
- - Expresiones Regulares
- - Guía
- - JavaScript
- - Referencia
- - escapes de propiedades unicode
- - regex
-translation_of: Web/JavaScript/Guide/Regular_Expressions/Unicode_Property_Escapes
-original_slug: Web/JavaScript/Guide/Regular_Expressions/Escapes_de_propiedades_Unicode
----
-{{jsSidebar("JavaScript Guide")}}
-
-Los escapes de propiedad Unicode en las {{JSxRef("../Guide/Regular_Expressions", "Expresiones regulares")}} permiten la coincidencia de caracteres según sus propiedades Unicode. Un caracter se describe mediante varias propiedades que, o bien, son binarias ("tipo booleano") o, no binarias. Por ejemplo, puedes usar escapes de propiedades Unicode para reconocer emojis, signos de puntuación, letras (incluso letras de idiomas específicos o scripts), etc.
-
-{{EmbedInteractiveExample("pages/js/regexp-unicode-property-escapes.html", "taller")}}
-
-
-
Nota : Para que funcionen los escapes de propiedad Unicode, una expresión regular debe utilizar {{JSxRef("../Guide/Regular_Expressions", "la bandera u
", "#Busqueda_avanzada_con_banderas")}} que indica que una cadena se debe considerar como una serie de puntos de código Unicode. Consulta también {{JSxRef("Objetos_globales/RegExp/unicode", "RegExp.prototype.unicode")}}.
-
-
-
-
Nota : Algunas propiedades Unicode abarcan muchos más caracteres que algunas {{JSxRef("../Guide/Regular_Expressions/Character_Classes", "clases de caracteres")}} (como \w
que coincide solo con letras latinas, desde a
hasta z
) pero esta última es más compatible con los navegadores (a partir de enero de 2020).
-
-
-Sintaxis
-
-La siguiente sección también está duplicada en {{JSxRef("../Guide/Regular_Expressions/Hoja_de_referencia", "esta hoja de trucos")}}. No olvides editarla también, ¡gracias!
-
-// Valores no binarios
-\p{UnicodePropertyValue }
-\p{UnicodePropertyName =UnicodePropertyValue }
-
-// Valores binarios y no binarios
-\p{UnicodeBinaryPropertyName }
-
-// Negación: \P se niega con \p
-\P{UnicodePropertyValue }
-\P{UnicodeBinaryPropertyName }
-
-
-
-
-Consulta también PropertyValueAliases.txt
-
-
- UnicodeBinaryPropertyName
- El nombre de una propiedad binaria . Por ejemplo: ASCII
, Alfabético
, Math
, Diacrítico
, Emoji
, Dígito hexadecimal
, Math
, Espacio en blanco
, etc. Consulta Unicode Data PropList.txt para obtener más información.
- NombreDePropiedadUnicode
- El nombre de una propiedad no binaria :
- ValorDePropiedadUnicode
- Uno de los fragmentos enumerados en la sección Valores, más adelante. Muchos valores tienen alias o abreviaturas (por ejemplo, el valor Decimal_Number
para la propiedad General_Category
se puede escribir Nd
, digit
, o Decimal_Number
). Para la mayoría de los valores, la parte NombreDePropiedadUnicode
y el signo igual se pueden omitir. Si se especifica un NombreDePropiedadUnicode
, el valor debe corresponder al tipo de propiedad proporcionado.
-
-
-
-
Nota : Debido a que hay muchas propiedades y valores disponibles, no los describiremos exhaustivamente aquí, en su lugar proporcionaremos varios ejemplos.
-
-
-Justificación
-
-Antes de ES2018, no existía una forma eficiente de hacer coincidir caracteres de diferentes conjuntos basados en scripts
(como macedonio, griego, georgiano, etc.) o propertyName
(como Emoji, etc.) en JavaScript. Consulta la propuesta tc39 sobre escapes de propiedad Unicode para obtener más información.
-
-Ejemplos
-
-Categorías generales
-
-Las categorías generales se utilizan para clasificar caracteres Unicode, y hay subcategorías disponibles para definir una categorización más precisa. Es posible utilizar formas cortas o largas en los escapes de propiedades Unicode.
-
-Se pueden utilizar para reconocer letras, números, símbolos, signos de puntuación, espacios, etc. Para obtener una lista más exhaustiva de categorías generales, consulta la especificación Unicode .
-
-// encontrar todas las letras de un texto
-let historia = "Es el gato de Cheshire: ahora tendré alguien con quien hablar";
-
-// Forma más explícita
-historia.match(/\p{General_Category=Letter}/gu);
-
-// No es obligatorio utilizar el nombre de la propiedad para las categorías generales
-historia.match(/\p{Letter}/gu);
-
-// Esto es equivalente (alias corto):
-historia.match(/\p{L}/gu);
-
-// Esto también es equivalente (conjunción de todas las subcategorías que utilizan alias cortos)
-historia.match(/\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}/gu);
-
-
-Scripts y extensiones de script
-
-Algunos idiomas usan diferentes signos para su sistema de escritura. Por ejemplo, el Inglés y el Español se escriben con los signos latinos, mientras que el Árabe y el Ruso se escriben con otros signos (Árabe y Cirílico, respectivamente). Las propiedades Unicode Script
y Script_Extensions
permiten que las expresiones regulares coincidan con los caracteres según el script con el que se utilizan principalmente (Script
) o según el conjunto de los scripts a los que pertenecen (Script_Extensions
).
-
-Por ejemplo, A
pertenece al script Latin
y ε
al script Greek
(Griego).
-
-let caracteresMezclados = "aεЛ";
-
-// Usando el nombre canónico "largo" del script
-caracteresMezclados.match(/\p{Script=Latin}/u); // a
-
-// Usando un alias corto para el script
-caracteresMezclados.match(/\p{Script=Greek}/u); // ε
-
-// Usando el nombre corto Sc para la propiedad Script
-caracteresMezclados.match(/\p{Sc=Cyrillic}/u); // Л
-
-
-Para obtener más detalles, consulta la especificación Unicode y la Tabla de scripts en la especificación ECMAScript .
-
-Si se usa un carácter en un conjunto limitado de scripts, la propiedad Script
solo coincidirá con el script "predominante" utilizado. Si quieres hacer coincidir caracteres basados en un script "no predominante", podrías usar la propiedad Script_Extensions
(Scx
para abreviar).
-
-// ٢ es el dígito 2 en notación Árabe-Índica
-// si bien está escrito en un script predominante en árabe
-// también se puede escribir en el script Thaana
-
-"٢".match(/\p{Script=Thaana}/u);
-// null ya que Thaana no es el script predominante super()
-
-"٢".match(/\p{Script_Extensions=Thaana}/u);
-// ["٢", index: 0, input: "٢", groups: undefined]
-
-
-Escapes de propiedades Unicode versus Clases de caracteres
-
-Con las expresiones regulares de JavaScript, también es posible utilizar {{JSxRef("../Guide/Regular_Expressions/Clases_de_caracteres", "clases de caracteres")}} y especialmente \w
o \d
para hacer coincidir letras o dígitos. Sin embargo, estos formularios solo coinciden con caracteres de la escritura latina (en otras palabras, de la a
a la z
y A
a Z
para \w
y 0
a 9
para \d
). Como se muestra en {{JSxRef("../Guide/Regular_Expressions/Clases_de_caracteres", "este ejemplo", "#Busca_una_palabra_de_caracteres_Unicode")}}, puede ser un poco torpe trabajar con textos no latinos.
-
-Las categorías de escape de propiedad Unicode abarcan muchos más caracteres y \p{Letter}
o \p{Number}
funcionarán para cualquier script.
-
-// Intentando usar rangos para evitar limitaciones de \w:
-
-const textoNoEs = "Приключения Алисы в Стране чудес";
-const regexpPalabraBMP = /([\u0000-\u0019\u0021-\uFFFF])+/gu;
-// BMP pasa por U+0000 a U+FFFF pero el espacio es U+0020
-
-console.table(textoNoEs.match(regexpPalabraBMP));
-
-// El uso de la propiedad Unicode se escapa en su lugar
-const regexpEPU = /\p{L}+/gu;
-console.table(textoNoEs.match(regexpEPU));
-
-
-Especificaciones
-
-
-
-
- Especificación
-
-
- {{SpecName('ESDraft', '#sec-runtime-semantics-unicodematchproperty-p', 'RegExp: Escapes de propiedades Unicode')}}
-
-
-
-
-Compatibilidad del navegador
-
-Para obtener información sobre la compatibilidad del navegador, consulta la {{JSxRef("../Guide/Regular_Expressions", "tabla principal de compatibilidad de expresiones regulares", "#Compatibilidad_del_navegador")}}.
-
-Ve también
-
-
diff --git a/files/es/web/javascript/guide/regular_expressions/unicode_property_escapes/index.md b/files/es/web/javascript/guide/regular_expressions/unicode_property_escapes/index.md
new file mode 100644
index 00000000000000..7331597360b039
--- /dev/null
+++ b/files/es/web/javascript/guide/regular_expressions/unicode_property_escapes/index.md
@@ -0,0 +1,163 @@
+---
+title: Escapes de propiedades Unicode
+slug: Web/JavaScript/Guide/Regular_Expressions/Unicode_Property_Escapes
+tags:
+ - Expresiones Regulares
+ - Guía
+ - JavaScript
+ - Referencia
+ - escapes de propiedades unicode
+ - regex
+translation_of: Web/JavaScript/Guide/Regular_Expressions/Unicode_Property_Escapes
+original_slug: Web/JavaScript/Guide/Regular_Expressions/Escapes_de_propiedades_Unicode
+---
+{{jsSidebar("JavaScript Guide")}}
+
+Los **escapes de propiedad Unicode** en las {{JSxRef("../Guide/Regular_Expressions", "Expresiones regulares")}} permiten la coincidencia de caracteres según sus propiedades Unicode. Un caracter se describe mediante varias propiedades que, o bien, son binarias ("tipo booleano") o, no binarias. Por ejemplo, puedes usar escapes de propiedades Unicode para reconocer emojis, signos de puntuación, letras (incluso letras de idiomas específicos o scripts), etc.
+
+{{EmbedInteractiveExample("pages/js/regexp-unicode-property-escapes.html", "taller")}}
+
+> **Nota:** Para que funcionen los escapes de propiedad Unicode, una expresión regular debe utilizar {{JSxRef("../Guide/Regular_Expressions", "la bandera u
", "#Busqueda_avanzada_con_banderas")}} que indica que una cadena se debe considerar como una serie de puntos de código Unicode. Consulta también {{JSxRef("Objetos_globales/RegExp/unicode", "RegExp.prototype.unicode")}}.
+
+> **Nota:** Algunas propiedades Unicode abarcan muchos más caracteres que algunas {{JSxRef("../Guide/Regular_Expressions/Character_Classes", "clases de caracteres")}} (como `\w` que coincide solo con letras latinas, desde `a` hasta `z`) pero esta última es más compatible con los navegadores (a partir de enero de 2020).
+
+## Sintaxis
+
+La siguiente sección también está duplicada en {{JSxRef("../Guide/Regular_Expressions/Hoja_de_referencia", "esta hoja de trucos")}}. No olvides editarla también, ¡gracias!
+
+```js
+// Valores no binarios
+\p{UnicodePropertyValue}
+\p{UnicodePropertyName=UnicodePropertyValue}
+
+// Valores binarios y no binarios
+\p{UnicodeBinaryPropertyName}
+
+// Negación: \P se niega con \p
+\P{UnicodePropertyValue}
+\P{UnicodeBinaryPropertyName}
+```
+
+- [Categoría general](https://unicode.org/reports/tr18/#General_Category_Property) (`gc` por «_**g**eneral **c**ategory_»)
+- [Script](https://unicode.org/reports/tr24/#Script) (`sc` por «_**sc**ript_»)
+- [Extensiones de script](https://unicode.org/reports/tr24/#Script_Extensions) (`scx` por «_**sc**ript e**x**tensions_»)
+
+Consulta también [PropertyValueAliases.txt](https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt)
+
+- UnicodeBinaryPropertyName
+ - : El nombre de una [propiedad binaria](https://tc39.es/ecma262/#table-binary-unicode-properties). Por ejemplo: [`ASCII`](https://unicode.org/reports/tr18/#General_Category_Property), [`Alfabético`](https://unicode.org/reports/tr44/#Alphabetic), `Math`, [`Diacrítico`](https://unicode.org/reports/tr44/#Diacritic), [`Emoji`](https://unicode.org/reports/tr51/#Emoji_Properties), [`Dígito hexadecimal`](https://unicode.org/reports/tr44/#Hex_Digit), `Math`, [`Espacio en blanco`](https://unicode.org/reports/tr44/#White_Space), etc. Consulta [Unicode Data PropList.txt](https://www.unicode.org/Public/UCD/latest/ucd/PropList.txt) para obtener más información.
+- NombreDePropiedadUnicode
+ - : El nombre de una propiedad [no binaria](https://tc39.es/ecma262/#table-nonbinary-unicode-properties):
+- ValorDePropiedadUnicode
+ - : Uno de los fragmentos enumerados en la sección Valores, más adelante. Muchos valores tienen alias o abreviaturas (por ejemplo, el valor `Decimal_Number` para la propiedad `General_Category` se puede escribir `Nd`, `digit`, o `Decimal_Number`). Para la mayoría de los valores, la parte _`NombreDePropiedadUnicode`_ y el signo igual se pueden omitir. Si se especifica un _`NombreDePropiedadUnicode`_, el valor debe corresponder al tipo de propiedad proporcionado.
+
+> **Nota:** Debido a que hay muchas propiedades y valores disponibles, no los describiremos exhaustivamente aquí, en su lugar proporcionaremos varios ejemplos.
+
+## Justificación
+
+Antes de ES2018, no existía una forma eficiente de hacer coincidir caracteres de diferentes conjuntos basados en `scripts` (como macedonio, griego, georgiano, etc.) o `propertyName` (como Emoji, etc.) en JavaScript. Consulta la [propuesta tc39 sobre escapes de propiedad Unicode](https://github.com/tc39/proposal-regexp-unicode-property-escapes) para obtener más información.
+
+## Ejemplos
+
+### Categorías generales
+
+Las categorías generales se utilizan para clasificar caracteres Unicode, y hay subcategorías disponibles para definir una categorización más precisa. Es posible utilizar formas cortas o largas en los escapes de propiedades Unicode.
+
+Se pueden utilizar para reconocer letras, números, símbolos, signos de puntuación, espacios, etc. Para obtener una lista más exhaustiva de categorías generales, consulta [la especificación Unicode](https://unicode.org/reports/tr18/#General_Category_Property).
+
+```js
+// encontrar todas las letras de un texto
+let historia = "Es el gato de Cheshire: ahora tendré alguien con quien hablar";
+
+// Forma más explícita
+historia.match(/\p{General_Category=Letter}/gu);
+
+// No es obligatorio utilizar el nombre de la propiedad para las categorías generales
+historia.match(/\p{Letter}/gu);
+
+// Esto es equivalente (alias corto):
+historia.match(/\p{L}/gu);
+
+// Esto también es equivalente (conjunción de todas las subcategorías que utilizan alias cortos)
+historia.match(/\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}/gu);
+```
+
+### Scripts y extensiones de script
+
+Algunos idiomas usan diferentes signos para su sistema de escritura. Por ejemplo, el Inglés y el Español se escriben con los signos latinos, mientras que el Árabe y el Ruso se escriben con otros signos (Árabe y Cirílico, respectivamente). Las propiedades Unicode `Script` y `Script_Extensions` permiten que las expresiones regulares coincidan con los caracteres según el script con el que se utilizan principalmente (`Script`) o según el conjunto de los scripts a los que pertenecen (`Script_Extensions`).
+
+Por ejemplo, `A` pertenece al script `Latin` y `ε` al script `Greek` (Griego).
+
+```js
+let caracteresMezclados = "aεЛ";
+
+// Usando el nombre canónico "largo" del script
+caracteresMezclados.match(/\p{Script=Latin}/u); // a
+
+// Usando un alias corto para el script
+caracteresMezclados.match(/\p{Script=Greek}/u); // ε
+
+// Usando el nombre corto Sc para la propiedad Script
+caracteresMezclados.match(/\p{Sc=Cyrillic}/u); // Л
+```
+
+Para obtener más detalles, consulta [la especificación Unicode](https://unicode.org/reports/tr24/#Script) y la [Tabla de scripts en la especificación ECMAScript](https://tc39.es/ecma262/#table-unicode-script-values).
+
+Si se usa un carácter en un conjunto limitado de scripts, la propiedad `Script` solo coincidirá con el script "predominante" utilizado. Si quieres hacer coincidir caracteres basados en un script "no predominante", podrías usar la propiedad `Script_Extensions` (`Scx` para abreviar).
+
+```js
+// ٢ es el dígito 2 en notación Árabe-Índica
+// si bien está escrito en un script predominante en árabe
+// también se puede escribir en el script Thaana
+
+"٢".match(/\p{Script=Thaana}/u);
+// null ya que Thaana no es el script predominante super()
+
+"٢".match(/\p{Script_Extensions=Thaana}/u);
+// ["٢", index: 0, input: "٢", groups: undefined]
+```
+
+### Escapes de propiedades Unicode versus Clases de caracteres
+
+Con las expresiones regulares de JavaScript, también es posible utilizar {{JSxRef("../Guide/Regular_Expressions/Clases_de_caracteres", "clases de caracteres")}} y especialmente `\w` o `\d` para hacer coincidir letras o dígitos. Sin embargo, estos formularios solo coinciden con caracteres de la escritura _latina_ (en otras palabras, de la `a` a la `z` y `A` a `Z` para `\w` y `0` a `9` para `\d`). Como se muestra en {{JSxRef("../Guide/Regular_Expressions/Clases_de_caracteres", "este ejemplo", "#Busca_una_palabra_de_caracteres_Unicode")}}, puede ser un poco torpe trabajar con textos no latinos.
+
+Las categorías de escape de propiedad Unicode abarcan muchos más caracteres y `\p{Letter}` o `\p{Number}` funcionarán para cualquier script.
+
+```js
+// Intentando usar rangos para evitar limitaciones de \w:
+
+const textoNoEs = "Приключения Алисы в Стране чудес";
+const regexpPalabraBMP = /([\u0000-\u0019\u0021-\uFFFF])+/gu;
+// BMP pasa por U+0000 a U+FFFF pero el espacio es U+0020
+
+console.table(textoNoEs.match(regexpPalabraBMP));
+
+// El uso de la propiedad Unicode se escapa en su lugar
+const regexpEPU = /\p{L}+/gu;
+console.table(textoNoEs.match(regexpEPU));
+```
+
+## Especificaciones
+
+| Especificación |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| {{SpecName('ESDraft', '#sec-runtime-semantics-unicodematchproperty-p', 'RegExp: Escapes de propiedades Unicode')}} |
+
+## Compatibilidad del navegador
+
+Para obtener información sobre la compatibilidad del navegador, consulta la {{JSxRef("../Guide/Regular_Expressions", "tabla principal de compatibilidad de expresiones regulares", "#Compatibilidad_del_navegador")}}.
+
+## Ve también
+
+- {{JSxRef("../Guide/Regular_Expressions", "Guía de expresiones regulares")}}
+
+ - {{JSxRef("../Guide/Regular_Expressions/Character_Classes", "Clases de caracteres")}}
+ - {{JSxRef("../Guide/Regular_Expressions/Assertions", "Aserciones")}}
+ - {{JSxRef("../Guide/Regular_Expressions/Cuantificadores", "Cuantificadores")}}
+ - {{JSxRef("../Guide/Regular_Expressions/Grupos_y_rangos", "Grupos y rangos")}}
+
+- {{JSxRef("Objetos_globales/RegExp", "El constructor RegExp()")}}
+- {{JSxRef("Objetos_globales/RegExp/unicode", "RegExp.prototype.unicode")}}
+- [Propiedades de caracteres unicode — Wikipedia](https://en.wikipedia.org/wiki/Unicode_character_property)
+- [Una entrada en el blog de Axel Rauschmayer sobre los escapes de propiedades Unicode](https://2ality.com/2017/07/regexp-unicode-property-escapes.html)
+- [El documento Unicode para las propiedades Unicode](https://unicode.org/reports/tr18/#Categories)
diff --git a/files/es/web/javascript/guide/text_formatting/index.html b/files/es/web/javascript/guide/text_formatting/index.html
deleted file mode 100644
index 63a866024b17ac..00000000000000
--- a/files/es/web/javascript/guide/text_formatting/index.html
+++ /dev/null
@@ -1,254 +0,0 @@
----
-title: Formato de texto
-slug: Web/JavaScript/Guide/Text_formatting
-tags:
- - Guía
- - JavaScript
-translation_of: Web/JavaScript/Guide/Text_formatting
----
-{{jsSidebar("JavaScript Guide")}} {{PreviousNext("Web/JavaScript/Guide/Numbers_and_dates", "Web/JavaScript/Guide/Regular_Expressions")}}
-
-Este capítulo presenta cómo trabajar con cadenas de caracteres (String
) y texto en JavaScript.
-
-Cadenas de caracteres (String
)
-
-El tipo {{Glossary("String")}} de JavaScript se utiliza para representar datos textuales. Es un conjunto de "elementos" de valores enteros sin signo de 16 bits (unidades de código UTF-16). Cada elemento de la cadena de caracteres ocupa una posición en la cadena. El primer elemento está en el índice 0, el siguiente en el índice 1, y así sucesivamente. La longitud de una cadena es el número de elementos que contiene. Puedes crear cadenas utilizando cadena literales u objetos string .
-
-PRECAUCIÓN: si editas esta página, no incluyas ningún caracter por encima de U+FFFF, hasta que se solucione el ({{bug(857438)}} de MDN).
-
-Cadenas literales
-
-Puedes crear cadenas simples utilizando comillas simples o dobles:
-
-'foo'
-"bar"
-
-Se pueden crear cadenas más avanzadas usando secuencias de escape:
-
-Secuencias de escape hexadecimales
-
-El número después de \x se interpreta como un número del {{Interwiki("wikipedia", "Sistema_hexadecimal")}}.
-
-'\xA9' // "©"
-
-
-Secuencias de escape Unicode
-
-Las secuencias de escape Unicode requieren al menos cuatro dígitos hexadecimales después de \u
.
-
-'\u00A9' // "©"
-
-Puntos de escape de código Unicode
-
-Nuevo en ECMAScript 2015. Con el código de puntos de escape Unicode, cualquier carácter se puede escapar usando números hexadecimales para que sea posible usar puntos de código Unicode hasta 0x10FFFF
. Con simples escapes Unicode, a menudo es necesario escribir las mitades sustitutas por separado para lograr el mismo resultado.
-
-Consulta también {{JSxRef("String.fromCodePoint()")}} o {{JSxRef("String.prototype.codePointAt()")}}.
-
-'\u{2F804}'
-
-// lo mismo con los escapes Unicode simples
-'\uD87E\uDC04'
-
-Objetos String
-
-El objeto {{JSxRef("String")}} es una envoltura alrededor del tipo de dato primitivo string
.
-
-const foo = new String('foo'); // Crea un objeto String
-console.log(foo); // Muestra: [String: 'foo']
-typeof foo; // Devuelve 'object'
-
-
-Puedes llamar a cualquiera de los métodos del objeto String
en un valor de cadena literal: JavaScript automáticamente convierte la cadena literal en un objeto String
temporal, llama al método y luego descarta el objeto String
temporal. También puedes usar la propiedad String.length
con una cadena literal:
-
-Debes usar cadenas literales a menos que necesites específicamente usar un objeto String
, porque los objetos String
pueden tener un comportamiento contrario a la intuición. Por ejemplo:
-
-const firstString = '2 + 2'; // Crea un valor de cadena literal
-const secondString = new String('2 + 2'); // Crea un objeto String
-eval(firstString); // Devuelve el número 4
-eval(secondString); // Devuelve la cadena "2 + 2"
-
-Un objeto String
tiene una propiedad, length
, que indica el número de unidades de código UTF-16 en la cadena. Por ejemplo, el siguiente código asigna a helloLength
el valor 13, porque "¡Hola, mundo!" tiene 13 caracteres, cada uno representado por una unidad de código UTF-16. Puedes acceder a cada unidad de código utilizando la notación de corchete de los arreglos. No puedes cambiar caracteres individuales porque las cadenas son objetos inmutables similares a los arreglos:
-
-const hello = '¡Hola, mundo!';
-const helloLength = hello.length;
-hello[0] = 'L'; // Esto no tiene ningún efecto, porque las cadenas son inmutables
-hello[1]; // Esto devuelve "H"
-
-
-Los caracteres cuyos valores escalares Unicode son mayores que U+FFFF (tal como algunos caracteres chinos/japoneses/coreanos/vietnamitas raros y algunos «emoji»s) se almacenan en UTF-16 con dos unidades de código sustituto cada uno. Por ejemplo, una cadena que contenga el caracter único U+1F600 "Cara sonriente de emoji" tendrá una longitud de 2. El acceso a las unidades de código individual en una cadena de este tipo utilizando corchetes puede tener consecuencias indeseables, como la formación de cadenas con diferentes unidades de código suplente, violando el estándar Unicode. (Se deben agregar ejemplos a esta página después de que se corrija el error MDN {{bug(857438)}}). Consulta también {{JSxRef("String.fromCodePoint()")}} o {{JSxRef("String.prototype.codePointAt()")}}.
-
-Un objeto String
tiene una variedad de métodos: por ejemplo, aquellos que devuelven una variación de la cadena en sí, como substring
y toUpperCase
.
-
-La siguiente tabla resume los métodos de los objetos {{JSxRef("String")}}.
-
-
-
- Métodos de String
-
-
-
- Método
- Descripción
-
-
-
-
- {{JSxRef("String.charAt", "charAt")}}, {{JSxRef("String.charCodeAt", "charCodeAt")}}, {{JSxRef("String.codePointAt", "codePointAt")}}
- Devuelve el caracter o código de caracter en la posición especificada en la cadena.
-
-
- {{JSxRef("String.indexOf", "indexOf")}}, {{JSxRef("String.lastIndexOf", "lastIndexOf")}}
- Devuelve la posición de la subcadena especificada en la cadena o la última posición de la subcadena especificada, respectivamente.
-
-
- {{JSxRef("String.startsWith", "startsWith")}}, {{JSxRef("String.endsWith", "endsWith")}}, {{JSxRef("String.includes", "includes")}}
- Devuelve si o no la cadena comienza, termina o contiene una subcadena especificada.
-
-
- {{JSxRef("String.concat", "concat")}}
- Combina el texto de dos cadenas y devuelve una nueva cadena.
-
-
- {{JSxRef("String.fromCharCode", "fromCharCode")}}, {{JSxRef("String.fromCodePoint", "fromCodePoint")}}
- Construye una cadena a partir de la secuencia especificada de valores Unicode. Este es un método de la clase String
, no una instancia de String
.
-
-
- {{JSxRef("String.split", "split")}}
- Divide un objeto String
en un arreglo de cadenas separando la cadena en subcadenas.
-
-
- {{JSxRef("String.slice", "slice")}}
- Extrae una sección de una cadena y devuelve una nueva cadena.
-
-
- {{JSxRef("String.substring", "substring")}}, {{JSxRef("String.substr", "substr")}}
- Devuelve el subconjunto especificado de la cadena, ya sea especificando los índices inicial y final o el índice inicial y una longitud.
-
-
- {{JSxRef("String.match", "match")}}, {{JSxRef("String.matchAll", "matchAll")}}, {{JSxRef("String.replace", "replace")}}, {{JSxRef("String.replaceAll", "replaceAll")}}, {{JSxRef("String.search", "search")}}
- Trabaja con expresiones regulares.
-
-
- {{JSxRef("String.toLowerCase", "toLowerCase")}}, {{JSxRef("String.toUpperCase", "toUpperCase")}}
-
- Devuelve la cadena en minúsculas o mayúsculas, respectivamente.
-
-
-
- {{JSxRef("String.normalize", "normalize")}}
- Devuelve la forma de normalización Unicode del valor de la cadena llamada.
-
-
- {{JSxRef("String.repeat", "repeat")}}
- Devuelve una cadena que consta de los elementos del objeto repetidos las veces indicadas.
-
-
- {{JSxRef("String.trim", "trim")}}
- Recorta los espacios en blanco desde el principio y el final de la cadena.
-
-
-
-
-Plantillas literales multilínea
-
-Las {{JSxRef("template_strings", "plantillas literales")}} son cadena literales que permiten expresiones incrustadas. Puedes utilizar cadenas de varias líneas y funciones de interpolación de cadenas con ellas.
-
-Las plantillas literales están encerradas por el carácter (``
) ({{Interwiki("wikipedia", "Acento_grave", "acento grave")}}) en lugar de comillas simples o dobles. Las plantillas literales pueden contener marcadores de posición. Estos se indican mediante el signo de dólar y llaves (${expresión}
).
-
-Multilíneas
-
-Cualquier caracter de nueva línea insertado en la fuente es parte de la plantilla literal. Usando cadenas normales, tendrías que usar la siguiente sintaxis para obtener cadenas multilínea:
-
-console.log('cadena de texto línea 1\n\
-cadena de texto línea 2');
-// "cadena de texto línea 1
-// cadena de texto línea 2"
-
-Para obtener el mismo efecto con cadenas multilínea, ahora puedes escribir:
-
-console.log(`cadena de texto línea 1
-cadena de texto línea 2`);
-// "cadena de texto línea 1
-// cadena de texto línea 2"
-
-Expresiones incrustadas
-
-Para incrustar expresiones dentro de cadenas normales, usarías la siguiente sintaxis:
-
-const five = 5;
-const ten = 10;
-console.log('Quince es ' + (five + ten) + ' y no ' + (2 * five + ten) + '.');
-// "Quince es 15 y no 20."
-
-Ahora, con las plantillas literales, puedes hacer uso del azúcar sintáctica haciendo que las sustituciones como esta sean más legibles:
-
-const five = 5;
-const ten = 10;
-console.log (`Quince es ${five + ten} y no ${2 * five + ten}.`);
-// "Quince es 15 y no 20."
-
-Para obtener más información, lee acerca de {{JSxRef("template_strings", "plantillas literales")}} en la {{JSxRef("../Referencia", "Referencia de JavaScript")}}.
-
-Internacionalización
-
-El objeto {{JSxRef("Intl")}} es el espacio de nombres para la API de internacionalización de ECMAScript, que proporciona comparación de cadenas sensible al idioma, formato de números y formato de fecha y hora. Los constructores de los objetos {{JSxRef("Collator")}}, {{JSxRef("NumberFormat")}} y {{JSxRef("DateTimeFormat")}} son propiedades del objeto Intl
.
-
-
-
-El objeto {{JSxRef("DateTimeFormat")}} es útil para formatear la fecha y la hora. El siguiente formato es una fecha para el Inglés como se usa en los Estados Unidos. (El resultado es diferente en otra zona horaria).
-
-const msPerDay = 24 * 60 * 60 * 1000;
-
-// July 17, 2014 00:00:00 UTC.
-const july172014 = new Date(msPerDay * (44 * 365 + 11 + 197));
-
-const options = { year: '2-digit', month: '2-digit', day: '2-digit',
- hour: '2-digit', minute: '2-digit', timeZoneName: 'short' };
-const americanDateTime = new Intl.DateTimeFormat('en-US', options).format;
-
-console.log(americanDateTime(july172014)); // 07/16/14, 5:00 PM PDT
-
-
-
-
-El objeto {{JSxRef("NumberFormat")}} es útil para formatear números, por ejemplo, monedas.
-
-const gasPrice = new Intl.NumberFormat('en-US',
- { style: 'currency', currency: 'USD',
- minimumFractionDigits: 3 });
-
-console.log(gasPrice.format(5.259)); // $5.259
-
-const hanDecimalRMBInChina = new Intl.NumberFormat('zh-CN-u-nu-hanidec',
- { style: 'currency', currency: 'CNY' });
-
-console.log(hanDecimalRMBInChina.format(1314.25)); // ¥ 一,三一四.二五
-
-
-Colación
-
-El objeto {{JSxRef("Collator")}} es útil para comparar y ordenar cadenas.
-
-Por ejemplo, en realidad hay dos órdenes de clasificación diferentes en Alemán, «phonebook » y «dictionary ». La clasificación «phonebook » enfatiza el sonido, y es como si "ä", "ö", etc. se expandieran a "ae", "oe", etc. antes de la clasificación.
-
-const names = ['Hochberg', 'Hönigswald', 'Holzman'];
-
-const germanPhonebook = new Intl.Collator('de-DE-u-co-phonebk');
-
-// como ordenando ["Hochberg", "Hoenigswald", "Holzman"]:
-console.log(names.sort(germanPhonebook.compare).join(', '));
-// registra "Hochberg, Hönigswald, Holzman"
-
-
-Algunas palabras alemanas se conjugan con diéresis adicionales, por lo que en los diccionarios es sensato ordenar ignorando diéresis (excepto cuando se ordenan palabras que difieren solo por las diéresis: «schon » antes de «schön »).
-
-const germanDictionary = new Intl.Collator('de-DE-u-co-dict');
-
-// como si ordenara ["Hochberg", "Honigswald", "Holzman"]:
-console.log(names.sort(germanDictionary.compare).join(', '));
-// registra "Hochberg, Holzman, Hönigswald"
-
-
-Para obtener más información sobre la API de {{JSxRef("Intl")}}, consulta también la Introducción a la API de internacionalización de JavaScript .
-
-{{PreviousNext("Web/JavaScript/Guide/Numbers_and_dates", "Web/JavaScript/Guide/Regular_Expressions")}}
diff --git a/files/es/web/javascript/guide/text_formatting/index.md b/files/es/web/javascript/guide/text_formatting/index.md
new file mode 100644
index 00000000000000..04e70cbd70bcde
--- /dev/null
+++ b/files/es/web/javascript/guide/text_formatting/index.md
@@ -0,0 +1,225 @@
+---
+title: Formato de texto
+slug: Web/JavaScript/Guide/Text_formatting
+tags:
+ - Guía
+ - JavaScript
+translation_of: Web/JavaScript/Guide/Text_formatting
+---
+{{jsSidebar("JavaScript Guide")}} {{PreviousNext("Web/JavaScript/Guide/Numbers_and_dates", "Web/JavaScript/Guide/Regular_Expressions")}}
+
+Este capítulo presenta cómo trabajar con cadenas de caracteres (`String`) y texto en JavaScript.
+
+## Cadenas de caracteres (`String`)
+
+El tipo {{Glossary("String")}} de JavaScript se utiliza para representar datos textuales. Es un conjunto de "elementos" de valores enteros sin signo de 16 bits (unidades de código UTF-16). Cada elemento de la cadena de caracteres ocupa una posición en la cadena. El primer elemento está en el índice 0, el siguiente en el índice 1, y así sucesivamente. La longitud de una cadena es el número de elementos que contiene. Puedes crear cadenas utilizando cadena literales u objetos **string**.
+
+PRECAUCIÓN: si editas esta página, no incluyas ningún caracter por encima de U+FFFF, hasta que se solucione el ({{bug(857438)}} de MDN).
+
+### Cadenas literales
+
+Puedes crear cadenas simples utilizando comillas simples o dobles:
+
+```js
+'foo'
+"bar"
+```
+
+Se pueden crear cadenas más avanzadas usando secuencias de escape:
+
+#### Secuencias de escape hexadecimales
+
+El número después de \x se interpreta como un número del {{Interwiki("wikipedia", "Sistema_hexadecimal")}}.
+
+```js
+'\xA9' // "©"
+```
+
+#### Secuencias de escape Unicode
+
+Las secuencias de escape Unicode requieren al menos cuatro dígitos hexadecimales después de `\u`.
+
+```js
+'\u00A9' // "©"
+```
+
+#### Puntos de escape de código Unicode
+
+Nuevo en ECMAScript 2015. Con el código de puntos de escape Unicode, cualquier carácter se puede escapar usando números hexadecimales para que sea posible usar puntos de código Unicode hasta `0x10FFFF`. Con simples escapes Unicode, a menudo es necesario escribir las mitades sustitutas por separado para lograr el mismo resultado.
+
+Consulta también {{JSxRef("String.fromCodePoint()")}} o {{JSxRef("String.prototype.codePointAt()")}}.
+
+```js
+'\u{2F804}'
+
+// lo mismo con los escapes Unicode simples
+'\uD87E\uDC04'
+```
+
+### Objetos `String`
+
+El objeto {{JSxRef("String")}} es una envoltura alrededor del tipo de dato primitivo `string`.
+
+```js
+const foo = new String('foo'); // Crea un objeto String
+console.log(foo); // Muestra: [String: 'foo']
+typeof foo; // Devuelve 'object'
+```
+
+Puedes llamar a cualquiera de los métodos del objeto `String` en un valor de cadena literal: JavaScript automáticamente convierte la cadena literal en un objeto `String` temporal, llama al método y luego descarta el objeto `String` temporal. También puedes usar la propiedad `String.length` con una cadena literal:
+
+Debes usar cadenas literales a menos que necesites específicamente usar un objeto `String`, porque los objetos `String` pueden tener un comportamiento contrario a la intuición. Por ejemplo:
+
+```js
+const firstString = '2 + 2'; // Crea un valor de cadena literal
+const secondString = new String('2 + 2'); // Crea un objeto String
+eval(firstString); // Devuelve el número 4
+eval(secondString); // Devuelve la cadena "2 + 2"
+```
+
+Un objeto `String` tiene una propiedad, `length`, que indica el número de unidades de código UTF-16 en la cadena. Por ejemplo, el siguiente código asigna a `helloLength` el valor 13, porque "¡Hola, mundo!" tiene 13 caracteres, cada uno representado por una unidad de código UTF-16. Puedes acceder a cada unidad de código utilizando la notación de corchete de los arreglos. No puedes cambiar caracteres individuales porque las cadenas son objetos inmutables similares a los arreglos:
+
+```js
+const hello = '¡Hola, mundo!';
+const helloLength = hello.length;
+hello[0] = 'L'; // Esto no tiene ningún efecto, porque las cadenas son inmutables
+hello[1]; // Esto devuelve "H"
+```
+
+Los caracteres cuyos valores escalares Unicode son mayores que U+FFFF (tal como algunos caracteres chinos/japoneses/coreanos/vietnamitas raros y algunos «emoji»s) se almacenan en UTF-16 con dos unidades de código sustituto cada uno. Por ejemplo, una cadena que contenga el caracter único U+1F600 "Cara sonriente de emoji" tendrá una longitud de 2. El acceso a las unidades de código individual en una cadena de este tipo utilizando corchetes puede tener consecuencias indeseables, como la formación de cadenas con diferentes unidades de código suplente, violando el estándar Unicode. (Se deben agregar ejemplos a esta página después de que se corrija el error MDN {{bug(857438)}}). Consulta también {{JSxRef("String.fromCodePoint()")}} o {{JSxRef("String.prototype.codePointAt()")}}.
+
+Un objeto `String` tiene una variedad de métodos: por ejemplo, aquellos que devuelven una variación de la cadena en sí, como `substring` y `toUpperCase`.
+
+La siguiente tabla resume los métodos de los objetos {{JSxRef("String")}}.
+
+| Método | Descripción |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
+| {{JSxRef("String.charAt", "charAt")}}, {{JSxRef("String.charCodeAt", "charCodeAt")}}, {{JSxRef("String.codePointAt", "codePointAt")}} | Devuelve el caracter o código de caracter en la posición especificada en la cadena. |
+| {{JSxRef("String.indexOf", "indexOf")}}, {{JSxRef("String.lastIndexOf", "lastIndexOf")}} | Devuelve la posición de la subcadena especificada en la cadena o la última posición de la subcadena especificada, respectivamente. |
+| {{JSxRef("String.startsWith", "startsWith")}}, {{JSxRef("String.endsWith", "endsWith")}}, {{JSxRef("String.includes", "includes")}} | Devuelve si o no la cadena comienza, termina o contiene una subcadena especificada. |
+| {{JSxRef("String.concat", "concat")}} | Combina el texto de dos cadenas y devuelve una nueva cadena. |
+| {{JSxRef("String.fromCharCode", "fromCharCode")}}, {{JSxRef("String.fromCodePoint", "fromCodePoint")}} | Construye una cadena a partir de la secuencia especificada de valores Unicode. Este es un método de la clase `String`, no una instancia de `String`. |
+| {{JSxRef("String.split", "split")}} | Divide un objeto `String` en un arreglo de cadenas separando la cadena en subcadenas. |
+| {{JSxRef("String.slice", "slice")}} | Extrae una sección de una cadena y devuelve una nueva cadena. |
+| {{JSxRef("String.substring", "substring")}}, {{JSxRef("String.substr", "substr")}} | Devuelve el subconjunto especificado de la cadena, ya sea especificando los índices inicial y final o el índice inicial y una longitud. |
+| {{JSxRef("String.match", "match")}}, {{JSxRef("String.matchAll", "matchAll")}}, {{JSxRef("String.replace", "replace")}}, {{JSxRef("String.replaceAll", "replaceAll")}}, {{JSxRef("String.search", "search")}} | Trabaja con expresiones regulares. |
+| {{JSxRef("String.toLowerCase", "toLowerCase")}}, {{JSxRef("String.toUpperCase", "toUpperCase")}} | Devuelve la cadena en minúsculas o mayúsculas, respectivamente. |
+| {{JSxRef("String.normalize", "normalize")}} | Devuelve la forma de normalización Unicode del valor de la cadena llamada. |
+| {{JSxRef("String.repeat", "repeat")}} | Devuelve una cadena que consta de los elementos del objeto repetidos las veces indicadas. |
+| {{JSxRef("String.trim", "trim")}} | Recorta los espacios en blanco desde el principio y el final de la cadena. |
+
+### Plantillas literales multilínea
+
+Las {{JSxRef("template_strings", "plantillas literales")}} son cadena literales que permiten expresiones incrustadas. Puedes utilizar cadenas de varias líneas y funciones de interpolación de cadenas con ellas.
+
+Las plantillas literales están encerradas por el carácter (` `` `) ({{Interwiki("wikipedia", "Acento_grave", "acento grave")}}) en lugar de comillas simples o dobles. Las plantillas literales pueden contener marcadores de posición. Estos se indican mediante el signo de dólar y llaves (`${expresión}`).
+
+#### Multilíneas
+
+Cualquier caracter de nueva línea insertado en la fuente es parte de la plantilla literal. Usando cadenas normales, tendrías que usar la siguiente sintaxis para obtener cadenas multilínea:
+
+```js
+console.log('cadena de texto línea 1\n\
+cadena de texto línea 2');
+// "cadena de texto línea 1
+// cadena de texto línea 2"
+```
+
+Para obtener el mismo efecto con cadenas multilínea, ahora puedes escribir:
+
+```js
+console.log(`cadena de texto línea 1
+cadena de texto línea 2`);
+// "cadena de texto línea 1
+// cadena de texto línea 2"
+```
+
+#### Expresiones incrustadas
+
+Para incrustar expresiones dentro de cadenas normales, usarías la siguiente sintaxis:
+
+```js
+const five = 5;
+const ten = 10;
+console.log('Quince es ' + (five + ten) + ' y no ' + (2 * five + ten) + '.');
+// "Quince es 15 y no 20."
+```
+
+Ahora, con las plantillas literales, puedes hacer uso del azúcar sintáctica haciendo que las sustituciones como esta sean más legibles:
+
+```js
+const five = 5;
+const ten = 10;
+console.log (`Quince es ${five + ten} y no ${2 * five + ten}.`);
+// "Quince es 15 y no 20."
+```
+
+Para obtener más información, lee acerca de {{JSxRef("template_strings", "plantillas literales")}} en la {{JSxRef("../Referencia", "Referencia de JavaScript")}}.
+
+## Internacionalización
+
+El objeto {{JSxRef("Intl")}} es el espacio de nombres para la API de internacionalización de ECMAScript, que proporciona comparación de cadenas sensible al idioma, formato de números y formato de fecha y hora. Los constructores de los objetos {{JSxRef("Collator")}}, {{JSxRef("NumberFormat")}} y {{JSxRef("DateTimeFormat")}} son propiedades del objeto `Intl`.
+
+### Formato de fecha y hora
+
+El objeto {{JSxRef("DateTimeFormat")}} es útil para formatear la fecha y la hora. El siguiente formato es una fecha para el Inglés como se usa en los Estados Unidos. (El resultado es diferente en otra zona horaria).
+
+```js
+const msPerDay = 24 * 60 * 60 * 1000;
+
+// July 17, 2014 00:00:00 UTC.
+const july172014 = new Date(msPerDay * (44 * 365 + 11 + 197));
+
+const options = { year: '2-digit', month: '2-digit', day: '2-digit',
+ hour: '2-digit', minute: '2-digit', timeZoneName: 'short' };
+const americanDateTime = new Intl.DateTimeFormat('en-US', options).format;
+
+console.log(americanDateTime(july172014)); // 07/16/14, 5:00 PM PDT
+```
+
+### Formato de número
+
+El objeto {{JSxRef("NumberFormat")}} es útil para formatear números, por ejemplo, monedas.
+
+```js
+const gasPrice = new Intl.NumberFormat('en-US',
+ { style: 'currency', currency: 'USD',
+ minimumFractionDigits: 3 });
+
+console.log(gasPrice.format(5.259)); // $5.259
+
+const hanDecimalRMBInChina = new Intl.NumberFormat('zh-CN-u-nu-hanidec',
+ { style: 'currency', currency: 'CNY' });
+
+console.log(hanDecimalRMBInChina.format(1314.25)); // ¥ 一,三一四.二五
+```
+
+### Colación
+
+El objeto {{JSxRef("Collator")}} es útil para comparar y ordenar cadenas.
+
+Por ejemplo, en realidad hay dos órdenes de clasificación diferentes en Alemán, «_phonebook_» y «_dictionary_». La clasificación «_phonebook_» enfatiza el sonido, y es como si "ä", "ö", etc. se expandieran a "ae", "oe", etc. antes de la clasificación.
+
+```js
+const names = ['Hochberg', 'Hönigswald', 'Holzman'];
+
+const germanPhonebook = new Intl.Collator('de-DE-u-co-phonebk');
+
+// como ordenando ["Hochberg", "Hoenigswald", "Holzman"]:
+console.log(names.sort(germanPhonebook.compare).join(', '));
+// registra "Hochberg, Hönigswald, Holzman"
+```
+
+Algunas palabras alemanas se conjugan con diéresis adicionales, por lo que en los diccionarios es sensato ordenar ignorando diéresis (excepto cuando se ordenan palabras que difieren _solo_ por las diéresis: «_schon_» antes de «_schön_»).
+
+```js
+const germanDictionary = new Intl.Collator('de-DE-u-co-dict');
+
+// como si ordenara ["Hochberg", "Honigswald", "Holzman"]:
+console.log(names.sort(germanDictionary.compare).join(', '));
+// registra "Hochberg, Holzman, Hönigswald"
+```
+
+Para obtener más información sobre la API de {{JSxRef("Intl")}}, consulta también la [Introducción a la API de internacionalización de JavaScript](https://hacks.mozilla.org/2014/12/introducing-the-javascript-internationalization-api/).
+
+{{PreviousNext("Web/JavaScript/Guide/Numbers_and_dates", "Web/JavaScript/Guide/Regular_Expressions")}}
diff --git a/files/es/web/javascript/language_overview/index.html b/files/es/web/javascript/language_overview/index.html
deleted file mode 100644
index 652ccaa316c4b2..00000000000000
--- a/files/es/web/javascript/language_overview/index.html
+++ /dev/null
@@ -1,961 +0,0 @@
----
-title: Una reintroducción a JavaScript (Tutorial de JS)
-slug: Web/JavaScript/Language_Overview
-tags:
- - Aprender
- - Guía
- - Intermedio
- - Intro
- - JavaScript
- - Tutorial
- - introducción
-translation_of: Web/JavaScript/A_re-introduction_to_JavaScript
-original_slug: Web/JavaScript/A_re-introduction_to_JavaScript
----
-{{jsSidebar}}
-
-
-¿Por qué una reintroducción? Porque {{Glossary("JavaScript")}} es conocido por ser el lenguaje de programación más incomprendido . A menudo se le ridiculiza como un juguete, pero debajo de esa capa de engañosa simplicidad, aguardan poderosas características del lenguaje. Ahora un increíble número de aplicaciones de alto perfil utilizan JavaScript, lo cual demuestra que un conocimiento más profundo de esta tecnología es una habilidad importante para cualquier desarrollador web o móvil.
-
-Es útil comenzar con una descripción general de la historia del lenguaje. JavaScript fue creado en 1995 por Brendan Eich mientras era ingeniero en Netscape. JavaScript se lanzó por primera vez con Netscape 2 a principios de 1996. Originalmente se iba a llamar LiveScript, pero se le cambió el nombre en una desafortunada decisión de marketing que intentó capitalizar la popularidad del lenguaje Java de Sun Microsystem, a pesar de que los dos tienen muy poco en común. Esto ha sido una fuente de confusión desde entonces.
-
-Varios meses después, Microsoft lanzó JScript con Internet Explorer 3. Era un JavaScript prácticamente compatible. Varios meses después de eso, Netscape envió JavaScript a Ecma International , una organización europea de estándares, que resultó en la primera edición del estándar {{Glossary("ECMAScript")}} ese año. El estándar recibió una actualización significativa como ECMAScript edición 3 en 1999, y se ha mantenido bastante estable desde entonces. La cuarta edición fue abandonada debido a diferencias políticas sobre la complejidad del lenguaje. Muchas partes de la cuarta edición formaron la base para la edición 5 de ECMAScript, publicada en diciembre de 2009, y para la sexta edición principal del estándar, publicada en junio de 2015.
-
-
-
Debido a que es más familiar, nos referiremos a ECMAScript como "JavaScript" de ahora en adelante.
-
-
-A diferencia de la mayoría de los lenguajes de programación, el lenguaje JavaScript no tiene un concepto de entrada o salida. Está diseñado para ejecutarse como un lenguaje de scripting
en un entorno hospedado, y depende del entorno para proporcionar los mecanismos para comunicarse con el mundo exterior. El entorno de alojamiento más común es el navegador, pero también se pueden encontrar intérpretes de JavaScript en una gran lista de otros lugares, incluidos Adobe Acrobat, Adobe Photoshop, imágenes SVG, el motor de widgets de Yahoo, entornos de lado del servidor como Node.js , bases de datos NoSQL como Apache CouchDB de código abierto, computadoras integradas, entornos de escritorio completos como GNOME (una de las IGU —Interfaz Gráfica de Usuario — más populares para sistemas operativos GNU/Linux), y otros.
-
-
-
-JavaScript es un lenguaje dinámico múltiparadigma con tipos y operadores, objetos estándar integrados y métodos. Su sintaxis se basa en los lenguajes Java y C — muchas estructuras de esos lenguajes también se aplican a JavaScript. JavaScript admite la programación orientada a objetos con prototipos de objetos, en lugar de clases (consulta más información sobre {{jsxref("Inheritance_and_the_prototype_chain", "herencia prototípica")}} y ES2015 {{jsxref("Reference/Classes", "clases")}}. JavaScript también admite la programación funcional — debido a que son objetos, las funciones se pueden almacenar en variables y pasarse como cualquier otro objeto.
-
-Comencemos observando los componentes básicos de cualquier lenguaje: los tipos. Los programas JavaScript manipulan valores, y todos esos valores pertenecen a un tipo. Los tipos de JavaScript son:
-
-
- {{jsxref("Number", "Números")}}
- {{jsxref("String", "Cadenas de texto (Strings)")}}
- {{jsxref("Boolean", "Booleanos")}}
- {{jsxref("Function", "Funciones")}}
- {{jsxref("Object", "Objetos")}}
- {{jsxref("Symbol", "Símbolos")}} (nuevo en ES2015)
-
-
-... oh, y {{jsxref("undefined")}} y {{jsxref("null")}}, que son ... ligeramente extraños. Y {{jsxref("Array")}}, que es un tipo de objeto especial. Y {{jsxref("Date", "Fechas (Date)")}} y {{jsxref("RegExp", "Expresiones regulares (RegExp)")}}, que son objetos que obtienes de forma gratuita. Y para ser técnicamente precisos, las funciones son solo un tipo especial de objeto. Por lo tanto, el diagrama de tipos se parece más a este:
-
-
- {{jsxref("Number", "Números")}}
- {{jsxref("String", "Cadenas de texto (Strings)")}}
- {{jsxref("Boolean", "Booleanos")}}
- {{jsxref("Symbol", "Símbolos")}} (nuevo en ES2015)
- {{jsxref("Object", "Objetos")}}
-
- {{jsxref("Function", "Funciones")}}
- {{jsxref("Array")}}
- {{jsxref("Date")}}
- {{jsxref("RegExp")}}
-
-
- {{jsxref("null")}}
- {{jsxref("undefined")}}
-
-
-Y también hay algunos tipos {{jsxref("Error")}} integrados. Sin embargo, las cosas son mucho más fáciles si nos atenemos al primer diagrama, por lo que discutiremos los tipos enumerados allí por ahora.
-
-Números
-
-Los números en JavaScript son "valores IEEE 754 de formato de 64 bits de doble precisión", de acuerdo con las especificaciones. No existen números enteros en JavaScript (excepto {{jsxref("BigInt")}}), por lo que debes tener un poco de cuidado. Ve este ejemplo:
-
-console.log(3 / 2); // 1.5, not 1
-console.log(Math.floor(3 / 2)); // 1
-
-Entonces, un entero aparente de hecho implícitamente es un float
.
-
-Además, ten cuidado con cosas como:
-
-0.1 + 0.2 == 0.30000000000000004;
-
-
-En la práctica, los valores enteros se tratan como enteros de 32 bits, y algunas implementaciones incluso los almacenan de esa manera hasta que se les pide que realicen una instrucción que sea válida en un Número pero no en un entero de 32 bits. Esto puede ser importante para operaciones bit a bit.
-
-Se admiten los {{jsxref("Operators", "operadores", "#Operadores_aritméticos")}} estándar, incluidas la aritmética de suma, resta, módulo (o resto), etc. También hay un objeto incorporado que no mencionamos anteriormente llamado {{jsxref("Math")}} que proporciona funciones matemáticas avanzadas y constantes:
-
-Math.sin(3.5);
-var circumference = 2 * Math.PI * r;
-
-
-Puedes convertir una cadena en un número entero usando la función {{jsxref("Objetos_Globales/parseInt", "parseInt()")}} incorporada. Esta toma la base para la conversión como un segundo argumento opcional, que siempre debes proporcionar:
-
-parseInt('123', 10); // 123
-parseInt('010', 10); // 10
-
-
-En los navegadores más antiguos, se supone que las cadenas que comienzan con un "0" están en octal (raíz 8), pero este no ha sido el caso desde 2013 más o menos. A menos que estés seguro de tu formato de cadena, puedes obtener resultados sorprendentes en esos navegadores más antiguos:
-
-parseInt('010'); // 8
-parseInt('0x10'); // 16
-
-
-Aquí, vemos que la función {{jsxref("Objetos_Globales/parseInt", "parseInt()")}} trata la primera cadena como octal debido al 0 inicial, y la segunda cadena como hexadecimal debido al "0x" inicial. La notación hexadecimal todavía está en su lugar ; solo se ha eliminado el octal.
-
-Si deseas convertir un número binario en un entero, simplemente cambia la base:
-
-parseInt('11', 2); // 3
-
-
-De manera similar, puedes analizar números de coma flotante utilizando la función incorporada {{jsxref("Objetos_Globales/parseFloat", "parseFloat()")}}. A diferencia de su primo {{jsxref("Objetos_Globales/parseInt", "parseInt()")}}, parseFloat()
siempre usa base 10.
-
-También puedes utilizar el operador +
unario para convertir valores en números:
-
-+ '42'; // 42
-+ '010'; // 10
-+ '0x10'; // 16
-
-
-Se devuelve un valor especial llamado {{jsxref("NaN")}} (abreviatura de "Not a Number" o "No es un número") si la cadena no es numérica:
-
-parseInt('hello', 10); // NaN
-
-
-NaN
es tóxico: si lo proporcionas como operando para cualquier operación matemática, el resultado también será NaN
:
-
-NaN + 5; // NaN
-
-
-Puedes probar si un valor es NaN
utilizando la función incorporada {{jsxref("Objetos_Globales/isNaN", "isNaN()")}}:
-
-isNaN(NaN); // true
-
-
-JavaScript también tiene los valores especiales {{jsxref("Infinity")}} e -Infinity
:
-
- 1 / 0; // Infinity
--1 / 0; // -Infinity
-
-
-Puedes probar los valores Infinity
, -Infinity
y NaN
utilizando la función integrada {{jsxref("Objetos_Globales/isFinite", "isFinite()")}}:
-
-isFinite(1 / 0); // false
-isFinite(-Infinity); // false
-isFinite(NaN); // false
-
-
-Las funciones {{jsxref("Objetos_Globales/parseInt", "parseInt()")}} y {{jsxref("Objetos_Globales/parseFloat", "parseFloat()")}} analizan una cadena hasta que alcancen un caracter que no es válido para el formato de número especificado, luego devuelve el número analizado hasta ese punto. Sin embargo, el operador "+" simplemente convierte la cadena a NaN
si contiene un caracter no válido. Intenta analizar la cadena "10.2abc" con cada método tú mismo en la consola y comprenderás mejor las diferencias.
-
-Strings
-
-Las cadenas en JavaScript son secuencias de caracteres Unicode . Esta debería ser una buena noticia para cualquiera que haya tenido que lidiar con la internacionalización. Exactamente, son secuencias de unidades de código UTF-16; cada unidad de código está representada por un número de 16 bits. Cada caracter Unicode está representado por 1 o 2 unidades de código.
-
-Si deseas representar un solo caracter, simplemente usa una cadena que consta de ese único caracter.
-
-Para encontrar la longitud de una cadena (en unidades de código), accede a su propiedad {{jsxref("Objetos_Globales/String/length", "lenght")}}:
-
-'hello'.length; // 5
-
-
-¡Aquí está nuestra primer pincelada con objetos JavaScript! ¿Mencionamos que también puedes usar cadenas como {{jsxref("Object", "objectos", "", 1)}}? También tienen {{jsxref("String", "métodos", "#Métodos", 1)}} que te permiten manipular la cadena y acceder a información sobre la cadena:
-
-'hello'.charAt(0); // "h"
-'hello, world'.replace('world', 'mars'); // "hello, mars"
-'hello'.toUpperCase(); // "HELLO"
-
-
-Otros tipos
-
-JavaScript distingue entre {{jsxref("null")}}, que es un valor que indica un no valor deliberado (y solo se puede acceder a él mediante la palabra clave null
), y {{jsxref("undefined")}}, que es un valor de tipo undefined
que indica una variable no iniciada es decir, que aún no se le ha asignado un valor. Hablaremos de variables más adelante, pero en JavaScript es posible declarar una variable sin asignarle un valor. Si hace esto, el tipo de la variable es undefined
. undefined
en realidad es una constante.
-
-JavaScript tiene un tipo booleano, con valores posibles true
y false
(ambos son palabras clave). Cualquier valor se puede convertir a booleano de acuerdo con las siguientes reglas:
-
-
- false
, 0
, cadenas vacías (""
), NaN
, null
, y undefined
todos se vuelven false.
- Todos los demás valores se vuelven true.
-
-
-Puedes realizar esta conversión explícitamente utilizando la función Boolean()
:
-
-Boolean(''); // false
-Boolean(234); // true
-
-
-Sin embargo, esto rara vez es necesario, ya que JavaScript realizará silenciosamente esta conversión cuando espera un booleano, como en una declaración if
(ve más adelante). Por esta razón, a veces hablamos simplemente de "valores verdaderos" y "valores falsos", es decir, valores que se convierten en true
y false
, respectivamente, cuando se convierten en booleanos. Alternativamente, estos valores se pueden llamar "veracidad" y "falsedad", respectivamente.
-
-Operaciones booleanas como &&
(and lógico), ||
(or lógico) y !
(not lógico) son compatibles; ve más adelante.
-
-Variables
-
-Las nuevas variables en JavaScript se declaran utilizando una de tres palabras clave: {{jsxref("Sentencias/let", "let")}}, {{jsxref("Sentencias/const", "const")}} o {{jsxref("Sentencias/var", "var")}}.
-
- let
te permite declarar variables a nivel de bloque. La variable declarada está disponible en el bloque en el que está incluida.
-
-let a;
-let name = 'Simon';
-
-
-El siguiente es un ejemplo de alcance con una variable declarada con let
:
-
-// myLetVariable *no* es visible aquí
-
-for (let myLetVariable = 0; myLetVariable < 5; myLetVariable++) {
- // myLetVariable solo es visible aquí
-}
-
-// myLetVariable *no* es visible aquí
-
-
-
-const
te permite declarar variables cuyos valores pretendes nunca cambiar. La variable está disponible en el bloque en el que se declara.
-
-const Pi = 3.14; // establece la variable Pi
-Pi = 1; // arrojará un error porque no puede cambiar una variable constante.
-
-
- var
es la palabra clave declarativa más común. No tiene las restricciones que tienen las otras dos palabras clave. Esto se debe a que tradicionalmente era la única forma de declarar una variable en JavaScript. Una variable declarada con la palabra clave var
está disponible en la función en la que se declara.
-
-var a;
-var name = 'Simon';
-
-Un ejemplo de ámbito con una variable declarada con var
:
-
-// myVarVariable *es* visible aquí
-
-for (var myVarVariable = 0; myVarVariable < 5; myVarVariable++) {
- // myVarVariable es visible para toda la función
-}
-
-// myVarVariable *es* visible aquí
-
-
-Si declaras una variable sin asignarle ningún valor, su tipo es undefined
.
-
-Una diferencia importante entre JavaScript y otros lenguajes como Java es que en JavaScript, los bloques no tienen alcance; solo las funciones tienen alcance. Entonces, si una variable se define usando var
en una declaración compuesta (por ejemplo, dentro de una estructura de control if
), será visible para toda la función. Sin embargo, a partir de ECMAScript 2015, las declaraciones {{jsxref("Sentencias/let", "let")}} y {{jsxref("Sentencias/const", "const")}} te permiten crear variables con alcance de bloque.
-
-Operadores
-
-Los operadores numéricos de JavaScript son +
, -
, *
, /
y %
que es el operador de residuo o resto (que es lo mismo que módulo ). Los valores se asignan usando =
, y también hay declaraciones de asignación compuestas como +=
y -=
. Estas se extienden hasta x = x operador y
.
-
-x += 5;
-x = x + 5;
-
-
-Puedes usar ++
y --
para incrementar y disminuir respectivamente. Estos se pueden utilizar como operadores prefijos o sufijos.
-
-El operador +
también hace concatenación de cadenas:
-
-'hello' + ' world'; // "hello world"
-
-
-Si agregas una cadena a un número (u otro valor), todo se convierte primero en cadena. Esto podría hacerte tropezar:
-
-'3' + 4 + 5; // "345"
- 3 + 4 + '5'; // "75"
-
-
-Agregar una cadena vacía a algo es una forma útil de convertirla en cadena.
-
-Se pueden realizar comparaciones en JavaScript utilizando <
, >
, <=
y >=
. Estas funcionan tanto para cadenas como para números. La igualdad es un poco menos sencilla. El operador doble-igual realiza la coerción de tipos si le das diferentes tipos, con resultados a veces interesantes:
-
-123 == '123'; // true
-1 == true; // true
-
-
-Para evitar la coerción de tipos, usa el operador triple-igual:
-
-123 === '123'; // false
-1 === true; // false
-
-
-También hay operadores !=
y !==
.
-
-JavaScript también tiene operaciones bit a bit . Si quieres usarlas, ahí están.
-
-Estructuras de control
-
-JavaScript tiene un conjunto de estructuras de control similar a otros lenguajes de la familia C. Las declaraciones condicionales son compatibles con if
y else
; las puedes encadenarlas si lo deseas:
-
-var name = 'kittens';
-if (name == 'puppies') {
- name += ' woof';
-} else if (name == 'kittens') {
- name += ' meow';
-} else {
- name += '!';
-}
-name == 'kittens meow';
-
-
-JavaScript tiene bucles while
y bucles do-while
. El primero es bueno para bucles básicos; el segundo bucle para donde deseas asegurarte de que el cuerpo del bucle se ejecute por lo menos una vez:
-
-while (true) {
- // ¡un bucle infinito!
-}
-
-var input;
-do {
- input = get_input();
-} while (inputIsNotValid(input));
-
-
-El bucle for
de JavaScript es igual que el de C y Java: te permite proporcione la información de control para tu bucle en una sola línea.
-
-for (var i = 0; i < 5; i++) {
- // Se ejecutará 5 veces
-}
-
-
-JavaScript también contiene otros dos bucles for
destacados: for
...of
-
-for (let value of array) {
- // haz algo con valor
-}
-
-
-y for
...in
:
-
-for (let property in object) {
- // hacer algo con la propiedad del objeto
-}
-
-
-Los operadores &&
y ||
utilizan evaluación de cortocircuito, lo cual significa que la evaluación del segundo operando depende del valor del primero. Esto es útil para verificar objetos nulos antes de acceder a sus atributos:
-
-var name = o && o.getName();
-
-
-O para almacenar en caché los valores (cuando los valores falsos no son válidos):
-
-var name = cachedName || (cachedName = getName());
-
-
-JavaScript tiene un operador ternario para expresiones condicionales:
-
-var allowed = (age > 18) ? 'yes' : 'no';
-
-
-La instrucción switch
se puede usar para múltiples ramas según un número o cadena:
-
-switch (action) {
- case 'draw':
- drawIt();
- break;
- case 'eat':
- eatIt();
- break;
- default:
- doNothing();
-}
-
-
-Si no agregas una instrucción break
, la ejecución "caerá" al siguiente nivel. Esto muy rara vez es lo que deseas; de hecho, vale la pena etiquetar específicamente la caída deliberada con un comentario si realmente lo pretendías para ayudar a la depuración:
-
-switch (a) {
- case 1: // caída deliberada
- case 2:
- eatIt();
- break;
- default:
- doNothing();
-}
-
-
-La cláusula default
es opcional. Puedes tener expresiones tanto en la parte del switch como en los casos si lo deseas; las comparaciones tienen lugar entre los dos utilizando el operador ===
:
-
-switch (1 + 3) {
- case 2 + 2:
- yay();
- break;
- default:
- neverhappens();
-}
-
-
-Objetos
-
-Los objetos de JavaScript se pueden considerar como simples colecciones de pares nombre-valor. Como tal, son similares a:
-
-
- Diccionarios en Python.
- Hashes en Perl y Ruby.
- Tablas hash en C y C++.
- HashMaps en Java.
- Arreglos asociativas en PHP.
-
-
-El hecho de que esta estructura de datos se utilice tan ampliamente es un testimonio de su versatilidad. Dado que todo (el núcleo, tipos bar) en JavaScript es un objeto, cualquier programa de JavaScript implica naturalmente una gran cantidad de búsquedas en tablas hash. ¡Qué bueno que sean tan rápidas!
-
-La parte "name" es una cadena JavaScript, mientras que el valor puede ser cualquier valor de JavaScript, incluidos más objetos. Esto te permite construir estructuras de datos de complejidad arbitraria.
-
-Hay dos formas básicas de crear un objeto vacío:
-
-var obj = new Object();
-
-
-Y:
-
-var obj = {};
-
-
-Estas son semánticamente equivalentes; la segunda se llama sintaxis literal de objeto y es más conveniente. Esta sintaxis también es el núcleo del formato JSON y se debe preferir en todo momento.
-
-La sintaxis de objeto literal se puede utilizar para iniciar un objeto en su totalidad:
-
-var obj = {
- name: 'Carrot',
- for: 'Max', // 'for' es una palabra reservada, use '_for' en su lugar.
- details: {
- color: 'orange',
- size: 12
- }
-};
-
-
-El acceso a los atributos se puede encadenar:
-
-obj.details.color; // orange
-obj['details']['size']; // 12
-
-
-El siguiente ejemplo crea un prototipo de objeto (Person
) y una instancia de ese prototipo (you
).
-
-function Person(name, age) {
- this.name = name;
- this.age = age;
-}
-
-// Define un objeto
-var you = new Person('You', 24);
-// Estamos creando una nueva persona llamada "You" de 24 años.
-
-
-
-Una vez creado , se puede volver a acceder a las propiedades de un objeto de dos formas:
-
-// notación de puntos
-obj.name = 'Simon';
-var name = obj.name;
-
-
-Y...
-
-// notación de corchetes
-obj['name'] = 'Simon';
-var name = obj['name'];
-// puedes usar una variable para definir una clave
-var user = prompt('¿cuál es su clave?')
-obj[user] = prompt('¿cuál es su valor?')
-
-
-Estas también son semánticamente equivalentes. El segundo método tiene la ventaja de que el nombre de la propiedad se proporciona como una cadena, lo cual significa que se puede calcular en tiempo de ejecución. Sin embargo, el uso de este método evita que se apliquen algunas optimizaciones de minificación y del motor de JavaScript. También se puede utilizar para establecer y obtener propiedades con nombres palabras reservadas :
-
-obj.for = 'Simon'; // Error de sintaxis, porque 'for' es una palabra reservada
-obj['for'] = 'Simon'; // trabaja bien
-
-
-
-
A partir de ECMAScript 5, las palabras reservadas se pueden utilizar como nombres de propiedad de objeto "en bruto". Esto significa que no necesitan "vestirse" entre comillas al definir objeto literales. Consulta la especificación de ES5.
-
-
-Para obtener más información sobre objetos y prototipos, consulta {{jsxref("Objetos_Globales/Object/prototype", "Object.prototype")}}. Para obtener una explicación de los prototipos de objetos y las cadenas de prototipos de objetos, consulta Herencia y la cadena de prototipos .
-
-
-
A partir de ECMAScript 2015, las claves de objeto se pueden definir mediante la variable en notación de corchetes al crearlas. {[phoneType]: 12345}
es posible en lugar de solo var userPhone = {}; userPhone[phoneType] = 12345
.
-
-
-Arreglos
-
-Los arreglos en JavaScript en son realidad un tipo especial de objeto. Funcionan de manera muy parecida a los objetos normales (las propiedades numéricas se pueden acceder naturalmente solo usando la sintaxis []
) pero tienen una propiedad mágica llamada 'length
'. Este siempre es uno más que el índice más alto de el arreglo.
-
-Una forma de crear arreglos es la siguiente:
-
-var a = new Array();
-a[0] = 'dog';
-a[1] = 'cat';
-a[2] = 'hen';
-a.length; // 3
-
-
-Una notación más conveniente es usar un arreglo literal:
-
-var a = ['dog', 'cat', 'hen'];
-a.length; // 3
-
-
-Ten en cuenta que array.length
no necesariamente es el número de elementos del arreglo. Considera lo siguiente:
-
-var a = ['dog', 'cat', 'hen'];
-a[100] = 'fox';
-a.length; // 101
-
-
-Recuerda — la longitud de el arreglo es uno más que el índice más alto.
-
-Si consultas un índice de arreglo que no existe, obtendrás un valor de undefined
:
-
-typeof a[90]; // undefined
-
-
-Si tienes en cuenta lo anterior sobre []
y length
, puedes iterar sobre un arreglo utilizando el siguiente bucle for
:
-
-for (var i = 0; i < a.length; i++) {
- // Haz algo con a[i]
-}
-
-
-ES2015 introdujo el bucle más conciso for
...of
para objetos iterables como arreglos:
-
-for (const currentValue of a) {
- // Haz algo con currentValue
-}
-
-También puedes iterar sobre un arreglo utilizando el bucle for
...in
, sin embargo, este no itera sobre los elementos del arreglo, sino los índices del arreglo. Además, si alguien agrega nuevas propiedades a Array.prototype
, también serán iteradas por dicho bucle. Por lo tanto, este tipo de bucle no se recomienda para arreglos.
-
-Otra forma de iterar sobre un arreglo que se agregó con ECMAScript 5 es {{jsxref("Objetos_Globales/Array/forEach", "arr.forEach()")}}:
-
-['dog', 'cat', 'hen'].forEach(function(currentValue, index, array) {
- // Hacer algo con currentValue o array[index]
-});
-
-
-Si deseas agregar un elemento a un arreglo, simplemente hazlo así:
-
-a.push(item);
-
-Los arreglos vienen con varios métodos. Consulta también la {{jsxref("Objetos_Globales/Array", "documentación completa para métodos de arreglo")}}.
-
-
-
-
- Nombre del método
- Descripción
-
-
-
-
- a.toString()
- Devuelve una cadena con el toString()
de cada elemento separado por comas.
-
-
- a.toLocaleString()
- Devuelve una cadena con el toLocaleString()
de cada elemento separado por comas.
-
-
- a.concat(item1[, item2[, ...[, itemN]]])
- Devuelve un nuevo arreglo con los elementos agregados.
-
-
- a.join(sep)
- Convierte el arreglo en una cadena, con valores delimitados por el parámetro sep
-
-
- a.pop()
- Elimina y devuelve el último elemento.
-
-
- a.push(item1, ..., itemN)
- Agrega elementos al final del arreglo.
-
-
- a.shift()
- Elimina y devuelve el primer elemento.
-
-
- a.unshift(item1[, item2[, ...[, itemN]]])
- Añade elementos al inicio del arreglo.
-
-
- a.slice(start[, end])
- Devuelve un subarreglo.
-
-
- a.sort([cmpfn])
- Toma una función de comparación opcional.
-
-
- a.splice(start, delcount[, item1[, ...[, itemN]]])
- Te permite modificar un arreglo eliminando una sección y reemplazándola con más elementos.
-
-
- a.reverse()
- Invierte el arreglo.
-
-
-
-
-Funciones
-
-Junto con los objetos, las funciones son el componente principal para comprender JavaScript. La función más básica no podría ser mucho más sencilla:
-
-function add(x, y) {
- var total = x + y;
- return total;
-}
-
-
-Esto demuestra una función básica. Una función de JavaScript puede tomar 0 o más parámetros con nombre. El cuerpo de la función puede contener tantas declaraciones como desees y puedes declarar tus propias variables que son locales para esa función. La declaración return
se puede usar para devolver un valor en cualquier momento, terminando la función. Si no se utiliza una declaración return
(o return
vacía sin valor), JavaScript devuelve undefined
.
-
-Los parámetros nombrados resultan ser más intuitivos que cualquier otra cosa. Puedes llamar a una función sin pasar los parámetros que espera, en cuyo caso se establecerán en undefined
.
-
-add(); // NaN
-// No puedes realizar sumas en undefined
-
-
-También puedes pasar más argumentos de los que espera la función:
-
-add(2, 3, 4); // 5
-// sumó los dos primeros; el 4 fue ignorado
-
-
-Eso puede parecer un poco tonto, pero las funciones tienen acceso a una variable adicional dentro de su cuerpo llamada argumentos
, que es un objeto tipo arreglo que contiene todos los valores pasados a la función. Reescribamos la función de suma para tomar tantos valores como queramos:
-
-function add() {
- var sum = 0;
- for (var i = 0, j = arguments.length; i < j; i++) {
- sum += arguments[i];
- }
- return sum;
-}
-
-add(2, 3, 4, 5); // 14
-
-
-Sin embargo, eso no es más útil que escribir 2 + 3 + 4 + 5
. Creemos una función de promedio:
-
-function avg() {
- var sum = 0;
- for (var i = 0, j = arguments.length; i < j; i++) {
- sum += arguments[i];
- }
- return sum / arguments.length;
-}
-
-avg(2, 3, 4, 5); // 3.5
-
-
-Esta es bastante útil, pero parece un poco detallada. Para reducir un poco más este código, podemos considerar la sustitución del uso del arreglo de argumentos a través de la sintaxis del parámetro Rest
. De esta manera, podemos pasar cualquier número de argumentos a la función manteniendo nuestro código mínimo. El operador de parámetro rest
se usa en listas de parámetros de función con el formato: ...variable e incluirá dentro de esa variable la lista completa de argumentos no capturados a los que se llamó la función. with
. También reemplazaremos el bucle for con un bucle for...of para devolver los valores dentro de nuestra variable.
-
-function avg(...args) {
- var sum = 0;
- for (let value of args) {
- sum += value;
- }
- return sum / args.length;
-}
-
-avg(2, 3, 4, 5); // 3.5
-
-
-En el código anterior, la variable args contiene todos los valores que se pasaron a la función.
-
-Es importante tener en cuenta que dondequiera que se coloque el operador de parámetro rest
en una declaración de función, almacenará todos los argumentos después de su declaración, pero no antes. es decir, function avg( firstValue, ...args) almacenará el primer valor pasado a la función en la variable firstValue y los argumentos restantes en args . Esa es otra característica útil del lenguaje, pero nos lleva a un nuevo problema. La función avg()
toma una lista de argumentos separados por comas, pero ¿qué sucede si deseas encontrar el promedio de un arreglo? Simplemente, podrías reescribir la función de la siguiente manera:
-
-function avgArray(arr) {
- var sum = 0;
- for (var i = 0, j = arr.length; i < j; i++) {
- sum += arr[i];
- }
- return sum / arr.length;
-}
-
-avgArray([2, 3, 4, 5]); // 3.5
-
-
-Pero sería bueno poder reutilizar la función que ya hemos creado. Afortunadamente, JavaScript te permite llamar a una función con un arreglo arbitrario de argumentos, usando el método {{jsxref("Function.apply", "apply()")}} de cualquier objeto función.
-
-avg.apply(null, [2, 3, 4, 5]); // 3.5
-
-
-El segundo argumento de apply()
es el arreglo que se utilizará como arguments
; el primero se explicará más adelante. Esto enfatiza el hecho de que las funciones también son objetos.
-
-
-
Puedes lograr el mismo resultado utilizando el operador de propagación en la llamada de función.
-
-
Por ejemplo: avg(...numbers)
-
-
-JavaScript te permite crear funciones anónimas.
-
-var avg = function() {
- var sum = 0;
- for (var i = 0, j = arguments.length; i < j; i++) {
- sum += arguments[i];
- }
- return sum / arguments.length;
-};
-
-
-Esto semánticamente es equivalente a la forma function avg()
. Es extremadamente poderosa, ya que te permite colocar una definición de función completa en cualquier lugar donde normalmente colocarías una expresión. Esto permite todo tipo de ingeniosos trucos. Aquí hay una forma de "ocultar" algunas variables locales — como alcance de bloque en C:
-
-var a = 1;
-var b = 2;
-
-(function() {
- var b = 3;
- a += b;
-})();
-
-a; // 4
-b; // 2
-
-
-JavaScript te permite llamar a funciones de forma recursiva. Esto es particularmente útil para tratar con estructuras de árbol, como las que se encuentran en el DOM del navegador.
-
-function countChars(elm) {
- if (elm.nodeType == 3) { // TEXT_NODE
- return elm.nodeValue.length;
- }
- var count = 0;
- for (var i = 0, child; child = elm.childNodes[i]; i++) {
- count += countChars(child);
- }
- return count;
-}
-
-
-Esto resalta un problema potencial con las funciones anónimas: ¿cómo las llama de forma recursiva si no tienen un nombre? JavaScript te permite nombrar expresiones de función para esto. Puedes utilizar {{Glossary("IIFE", "IIFE (expresiones de función invocadas inmediatamente)")}} con nombre como se muestra a continuación:
-
-var charsInBody = (function counter(elm) {
- if (elm.nodeType == 3) { // TEXT_NODE
- return elm.nodeValue.length;
- }
- var count = 0;
- for (var i = 0, child; child = elm.childNodes[i]; i++) {
- count += counter(child);
- }
- return count;
-})(document.body);
-
-
-El nombre proporcionado a una expresión de función como arriba solo está disponible para el alcance de la función. Esto permite que el motor realice más optimizaciones y da como resultado un código más legible. El nombre también aparece en el depurador y en algunos seguimientos de la pila, lo cual puede ahorrarte tiempo al depurar.
-
-Ten en cuenta que las funciones de JavaScript en sí mismas son objetos, como todo lo demás en JavaScript, y puedes agregar o cambiar propiedades en ellas tal como hemos visto anteriormente en la sección Objetos.
-
-Objetos personalizados
-
-
-
-En la programación clásica orientada a objetos, los objetos son colecciones de datos y métodos que operan sobre esos datos. JavaScript es un lenguaje basado en prototipos que no contiene una declaración de clase, como la encontrarías en C++ o Java (esto, a veces es confuso para los programadores acostumbrados a lenguajes con una declaración de clase). En cambio, JavaScript usa funciones como clases. Consideremos un objeto person
con campos first
y last name
. Hay dos formas de mostrar el nombre: como "primero último" o como "último, primero". Usando las funciones y objetos que hemos explicado anteriormente, podríamos mostrar los datos de esta manera:
-
-function makePerson(first, last) {
- return {
- first: first,
- last: last
- };
-}
-function personFullName(person) {
- return person.first + ' ' + person.last;
-}
-function personFullNameReversed(person) {
- return person.last + ', ' + person.first;
-}
-
-var s = makePerson('Simon', 'Willison');
-personFullName(s); // "Simon Willison"
-personFullNameReversed(s); // "Willison, Simon"
-
-
-Esto funciona, pero es bastante feo. Terminas con docenas de funciones en tu espacio de nombres global. Lo que realmente necesitamos es una forma de enlazar una función a un objeto. Dado que las funciones son objetos, esto es fácil:
-
-function makePerson(first, last) {
- return {
- first: first,
- last: last,
- fullName: function() {
- return this.first + ' ' + this.last;
- },
- fullNameReversed: function() {
- return this.last + ', ' + this.first;
- }
- };
-}
-
-var s = makePerson('Simon', 'Willison');
-s.fullName(); // "Simon Willison"
-s.fullNameReversed(); // "Willison, Simon"
-
-
-Nota sobre la palabra clave this
. Usada dentro de una función, this
se refiere al objeto actual. Lo que realmente significa está especificado por la forma en que llamaste a esa función. Si lo llamaste usando notación de puntos o notación de corchetes en un objeto, ese objeto se convierte en this
. Si la notación de puntos no se usó para la llamada, this
se refiere al objeto global.
-
-Ten en cuenta que this
es una frecuente causa de errores. Por ejemplo:
-
-var s = makePerson('Simon', 'Willison');
-var fullName = s.fullName;
-fullName(); // undefined undefined
-
-
-Cuando llamamos a fullName()
solo, sin usar s.fullName()
, this
está vinculado al objeto global. Debido a que no hay variables globales llamadas first
o last
obtenemos undefined
para cada una.
-
-Podemos aprovechar la palabra clave this
para mejorar nuestra función makePerson
:
-
-function Person(first, last) {
- this.first = first;
- this.last = last;
- this.fullName = function() {
- return this.first + ' ' + this.last;
- };
- this.fullNameReversed = function() {
- return this.last + ', ' + this.first;
- };
-}
-var s = new Person('Simon', 'Willison');
-
-
-Hemos introducido otra palabra clave: new
. new
está fuertemente relacionado con this
. Crea un nuevo objeto vacío y luego llama a la función especificada, con this
configurado para ese nuevo objeto. Sin embargo, ten en cuenta que la función especificada con this
no devuelve un valor, sino que simplemente modifica el objeto this
. Es new
que devuelve el objeto this
al sitio que realiza la llamada. Las funciones que están diseñadas para ser llamadas por new
se denominan funciones constructoras. La práctica común es poner en mayúscula estas funciones como recordatorio para llamarlas con new
.
-
-La función mejorada todavía tiene el mismo error al llamar a fullName()
sola.
-
-Nuestros objetos person
están mejorando, pero todavía tienen algunos bordes desagradables. Cada vez que creamos un objeto person
, estamos creando dos nuevos objetos de función dentro de él, ¿no sería mejor si este código fuera compartido?
-
-function personFullName() {
- return this.first + ' ' + this.last;
-}
-function personFullNameReversed() {
- return this.last + ', ' + this.first;
-}
-function Person(first, last) {
- this.first = first;
- this.last = last;
- this.fullName = personFullName;
- this.fullNameReversed = personFullNameReversed;
-}
-
-
-Eso es mejor: estamos creando las funciones como métodos solo una vez y asignándoles referencias dentro del constructor. ¿Podemos hacer algo mejor que eso? La respuesta es sí:
-
-function Person(first, last) {
- this.first = first;
- this.last = last;
-}
-Person.prototype.fullName = function() {
- return this.first + ' ' + this.last;
-};
-Person.prototype.fullNameReversed = function() {
- return this.last + ', ' + this.first;
-};
-
-
-Person.prototype
es un objeto compartido por todas las instancias de Person
. Forma parte de una cadena de búsqueda (que tiene un nombre especial, "cadena de prototipos"): cada vez que intentes acceder a una propiedad de Person
que no esté configurada, JavaScript revisará Person.prototype
para ver si esa propiedad existe allí. Como resultado, todo lo asignado a Person.prototype
pasa a estar disponible para todas las instancias de ese constructor a través del objeto this
.
-
-Esta es una herramienta increíblemente poderosa. JavaScript te permite modificar el prototipo de algo en cualquier momento en tu programa, lo cual significa que —en tiempo de ejecución— puedes agregar métodos adicionales a los objetos existentes:
-
-var s = new Person('Simon', 'Willison');
-s.firstNameCaps(); // TypeError en la línea 1: s.firstNameCaps no es una función
-
-Person.prototype.firstNameCaps = function() {
- return this.first.toUpperCase();
-};
-s.firstNameCaps(); // "SIMON"
-
-
-Curiosamente, también puedes agregar cosas al prototipo de objetos JavaScript integrados. Agreguemos un método a String
que devuelva esa cadena a la inversa:
-
-var s = 'Simon';
-s.reversed(); // TypeError en la línea 1: s.reversed no es una función
-
-String.prototype.reversed = function() {
- var r = '';
- for (var i = this.length - 1; i >= 0; i--) {
- r += this[i];
- }
- return r;
-};
-
-s.reversed(); // nomiS
-
-
-¡Nuestro método new
funciona incluso con cadenas literales!
-
-'Esto ahora se puede revertir'.reversed(); // ritrever edeup es aroha otsE
-
-
-Como se mencionó anteriormente, el prototipo forma parte de una cadena. La raíz de esa cadena es Object.prototype
, cuyos métodos incluyen toString()
; es este método el que se llama cuando intentas representar un objeto como una cadena. Esto es útil para depurar nuestros objetos Person
:
-
-var s = new Person('Simon', 'Willison');
-s.toString(); // [object Object]
-
-Person.prototype.toString = function() {
- return '<Person: ' + this.fullName() + '>';
-}
-
-s.toString(); // "<Person: Simon Willison>"
-
-
-¿Recuerda cómo avg.apply()
tenía un primer argumento null
? Ahora lo podemos revisar. El primer argumento de apply()
es el objeto que se debe tratar como 'this
'. Por ejemplo, aquí hay una implementación trivial de new
:
-
-function trivialNew(constructor, ...args) {
- var o = {}; // Crea un objeto
- constructor.apply(o, args);
- return o;
-}
-
-
-Esta no es una réplica exacta de new
ya que no configura la cadena de prototipos (sería difícil de ilustrar). Esto no es algo que use con mucha frecuencia, pero es útil conocerlo. En este fragmento, ...args
(incluidos los puntos suspensivos) se denomina "argumentos rest " — como su nombre indica, contiene el resto de los argumentos.
-
-Llamar a...
-
-var bill = trivialNew(Person, 'William', 'Orange');
-
-...por tanto, casi es equivalente a
-
-var bill = new Person('William', 'Orange');
-
-apply()
tiene una función hermana llamada {{jsxref("Objetos_Globales/Function/call", "call()")}}, que nuevamente te permite establecer this
pero toma una lista de argumentos expandida en lugar de un arreglo.
-
-function lastNameCaps() {
- return this.last.toUpperCase();
-}
-var s = new Person('Simon', 'Willison');
-lastNameCaps.call(s);
-// Es lo mismo que:
-s.lastNameCaps = lastNameCaps;
-s.lastNameCaps(); // WILLISON
-
-
-Funciones internas
-
-Las declaraciones de función de JavaScript están permitidas dentro de otras funciones. Hemos visto esto una vez antes, con la función makePerson()
anterior. Un detalle importante de las funciones anidadas en JavaScript es que pueden acceder a las variables en el alcance de su función padre:
-
-function parentFunc() {
- var a = 1;
-
- function nestedFunc() {
- var b = 4; // parentFunc no puede usar esto
- return a + b;
- }
- return nestedFunc(); // 5
-}
-
-
-Esto proporciona una gran utilidad para escribir un código más fácil de mantener. Si una función llamada se basa en una o dos funciones que no son útiles para ninguna otra parte de tu código, puedes anidar esas funciones de utilidad dentro de ella. Esto mantiene baja la cantidad de funciones que están en el alcance global, lo cual siempre es bueno.
-
-Esto también contrarresta el atractivo de las variables globales. Al escribir código complejo, a menudo es tentador utilizar variables globales para compartir valores entre múltiples funciones, lo que conduce a un código difícil de mantener. Las funciones anidadas pueden compartir variables en su padre, por lo que puedes usar ese mecanismo para unir funciones cuando tenga sentido sin contaminar tu espacio de nombres global — "globales locales" si lo deseas. Esta técnica se debe usar con precaución, pero es una útil habilidad.
-
-Cierres
-
-Esto nos lleva a una de las abstracciones más poderosas que JavaScript tiene para ofrecer — pero potencialmente, también la más confusa. ¿Qué hace esta?
-
-function makeAdder(a) {
- return function(b) {
- return a + b;
- };
-}
-var add5 = makeAdder(5);
-var add20 = makeAdder(20);
-add5(6); // ?
-add20(7); // ?
-
-
-El nombre de la función makeAdder()
lo debería revelar: crea nuevas funciones 'adder
', cada una de las cuales, cuando se llama con un argumento, lo suma al argumento con el que fue creada.
-
-Lo que está sucediendo aquí es más o menos lo mismo que sucedía anteriormente con las funciones internas: una función definida dentro de otra función tiene acceso a las variables de la función externa. La única diferencia aquí es que la función externa ha regresado y, por lo tanto, el sentido común parece dictar que sus variables locales ya no existen. Pero sí existen todavía — de lo contrario, las funciones de suma no podrían funcionar. Además, hay dos diferentes "copias" de las variables locales de makeAdder()
: una en la que a
es 5 y la otra en la que a
es 20. Entonces, el resultado de las llamadas a esa función es el siguiente:
-
-add5(6); // returns 11
-add20(7); // devuelve 27
-
-
-Esto es lo que está sucediendo realmente. Siempre que JavaScript ejecuta una función, se crea un objeto 'scope
' para contener las variables locales creadas dentro de esa función. Se inicia con cualquier variable pasada como parámetros de función. Esto es similar al objeto global en el que viven todas las variables y funciones globales, pero con un par de importantes diferencias: en primer lugar, se crea un objeto de alcance completamente nuevo cada vez que una función se comienza a ejecutar y, en segundo lugar, a diferencia del objeto global (que es accesible como this
y en los navegadores como window
) no se puede acceder directamente a estos objetos scope
desde tu código JavaScript. No hay ningún mecanismo para iterar sobre las propiedades del objeto scope
actual, por ejemplo.
-
-Entonces, cuando se llama a makeAdder()
, se crea un objeto scope
con una propiedad: a
, que es el argumento que se pasa a la función makeAdder()
. makeAdder()
luego devuelve una función recién creada. Normalmente, el recolector de basura de JavaScript limpiaría el objeto scope
creado para makeAdder()
en este punto, pero la función devuelta mantiene una referencia a ese objeto de ámbito. Como resultado, el objeto scope
no será recolectado como basura hasta que no haya más referencias al objeto función que makeAdder()
devolvió.
-
-Los objetos scope
forman una cadena llamada cadena de ámbito, similar a la cadena de prototipos utilizada por el sistema de objetos de JavaScript.
-
-Un cierre es la combinación de una función y el objeto scope
en el que se creó. Los cierres te permiten guardar el estado — como tal, a menudo se pueden usar en lugar de objetos. Puedes encontrar varias presentaciones excelentes de los cierres .
diff --git a/files/es/web/javascript/language_overview/index.md b/files/es/web/javascript/language_overview/index.md
new file mode 100644
index 00000000000000..8f9da62fc77646
--- /dev/null
+++ b/files/es/web/javascript/language_overview/index.md
@@ -0,0 +1,984 @@
+---
+title: Una reintroducción a JavaScript (Tutorial de JS)
+slug: Web/JavaScript/Language_Overview
+tags:
+ - Aprender
+ - Guía
+ - Intermedio
+ - Intro
+ - JavaScript
+ - Tutorial
+ - introducción
+translation_of: Web/JavaScript/A_re-introduction_to_JavaScript
+original_slug: Web/JavaScript/A_re-introduction_to_JavaScript
+---
+{{jsSidebar}}
+
+¿Por qué una reintroducción? Porque {{Glossary("JavaScript")}} es conocido por ser [el lenguaje de programación más incomprendido](http://crockford.com/javascript/javascript.html). A menudo se le ridiculiza como un juguete, pero debajo de esa capa de engañosa simplicidad, aguardan poderosas características del lenguaje. Ahora un increíble número de aplicaciones de alto perfil utilizan JavaScript, lo cual demuestra que un conocimiento más profundo de esta tecnología es una habilidad importante para cualquier desarrollador web o móvil.
+
+Es útil comenzar con una descripción general de la historia del lenguaje. JavaScript fue creado en 1995 por Brendan Eich mientras era ingeniero en Netscape. JavaScript se lanzó por primera vez con Netscape 2 a principios de 1996. Originalmente se iba a llamar LiveScript, pero se le cambió el nombre en una desafortunada decisión de marketing que intentó capitalizar la popularidad del lenguaje Java de Sun Microsystem, a pesar de que los dos tienen muy poco en común. Esto ha sido una fuente de confusión desde entonces.
+
+Varios meses después, Microsoft lanzó JScript con Internet Explorer 3. Era un JavaScript prácticamente compatible. Varios meses después de eso, Netscape envió JavaScript a [Ecma International](http://www.ecma-international.org/), una organización europea de estándares, que resultó en la primera edición del estándar {{Glossary("ECMAScript")}} ese año. El estándar recibió una actualización significativa como [ECMAScript edición 3](http://www.ecma-international.org/publications/standards/Ecma-262.htm) en 1999, y se ha mantenido bastante estable desde entonces. La cuarta edición fue abandonada debido a diferencias políticas sobre la complejidad del lenguaje. Muchas partes de la cuarta edición formaron la base para la edición 5 de ECMAScript, publicada en diciembre de 2009, y para la sexta edición principal del estándar, publicada en junio de 2015.
+
+> **Nota:** Debido a que es más familiar, nos referiremos a ECMAScript como "JavaScript" de ahora en adelante.
+
+A diferencia de la mayoría de los lenguajes de programación, el lenguaje JavaScript no tiene un concepto de entrada o salida. Está diseñado para ejecutarse como un lenguaje de `scripting` en un entorno hospedado, y depende del entorno para proporcionar los mecanismos para comunicarse con el mundo exterior. El entorno de alojamiento más común es el navegador, pero también se pueden encontrar intérpretes de JavaScript en una gran lista de otros lugares, incluidos Adobe Acrobat, Adobe Photoshop, imágenes SVG, el motor de widgets de Yahoo, entornos de lado del servidor como [Node.js](http://nodejs.org/), bases de datos NoSQL como [Apache CouchDB](http://couchdb.apache.org/) de código abierto, computadoras integradas, entornos de escritorio completos como [GNOME](http://www.gnome.org/) (una de las IGU —_Interfaz Gráfica de Usuario_— más populares para sistemas operativos GNU/Linux), y otros.
+
+## Información general
+
+JavaScript es un lenguaje dinámico múltiparadigma con tipos y operadores, objetos estándar integrados y métodos. Su sintaxis se basa en los lenguajes Java y C — muchas estructuras de esos lenguajes también se aplican a JavaScript. JavaScript admite la programación orientada a objetos con prototipos de objetos, en lugar de clases (consulta más información sobre {{jsxref("Inheritance_and_the_prototype_chain", "herencia prototípica")}} y ES2015 {{jsxref("Reference/Classes", "clases")}}. JavaScript también admite la programación funcional — debido a que son objetos, las funciones se pueden almacenar en variables y pasarse como cualquier otro objeto.
+
+Comencemos observando los componentes básicos de cualquier lenguaje: los tipos. Los programas JavaScript manipulan valores, y todos esos valores pertenecen a un tipo. Los tipos de JavaScript son:
+
+- {{jsxref("Number", "Números")}}
+- {{jsxref("String", "Cadenas de texto (Strings)")}}
+- {{jsxref("Boolean", "Booleanos")}}
+- {{jsxref("Function", "Funciones")}}
+- {{jsxref("Object", "Objetos")}}
+- {{jsxref("Symbol", "Símbolos")}} (nuevo en ES2015)
+
+... oh, y {{jsxref("undefined")}} y {{jsxref("null")}}, que son ... ligeramente extraños. Y {{jsxref("Array")}}, que es un tipo de objeto especial. Y {{jsxref("Date", "Fechas (Date)")}} y {{jsxref("RegExp", "Expresiones regulares (RegExp)")}}, que son objetos que obtienes de forma gratuita. Y para ser técnicamente precisos, las funciones son solo un tipo especial de objeto. Por lo tanto, el diagrama de tipos se parece más a este:
+
+- {{jsxref("Number", "Números")}}
+- {{jsxref("String", "Cadenas de texto (Strings)")}}
+- {{jsxref("Boolean", "Booleanos")}}
+- {{jsxref("Symbol", "Símbolos")}} (nuevo en ES2015)
+- {{jsxref("Object", "Objetos")}}
+
+ - {{jsxref("Function", "Funciones")}}
+ - {{jsxref("Array")}}
+ - {{jsxref("Date")}}
+ - {{jsxref("RegExp")}}
+
+- {{jsxref("null")}}
+- {{jsxref("undefined")}}
+
+Y también hay algunos tipos {{jsxref("Error")}} integrados. Sin embargo, las cosas son mucho más fáciles si nos atenemos al primer diagrama, por lo que discutiremos los tipos enumerados allí por ahora.
+
+## Números
+
+Los números en JavaScript son "valores IEEE 754 de formato de 64 bits de doble precisión", de acuerdo con las especificaciones. **_No existen números enteros_** en JavaScript (excepto {{jsxref("BigInt")}}), por lo que debes tener un poco de cuidado. Ve este ejemplo:
+
+```
+console.log(3 / 2); // 1.5, not 1
+console.log(Math.floor(3 / 2)); // 1
+```
+
+Entonces, un _entero aparente_ de hecho _implícitamente es un `float`_.
+
+Además, ten cuidado con cosas como:
+
+```js
+0.1 + 0.2 == 0.30000000000000004;
+```
+
+En la práctica, los valores enteros se tratan como enteros de 32 bits, y algunas implementaciones incluso los almacenan de esa manera hasta que se les pide que realicen una instrucción que sea válida en un Número pero no en un entero de 32 bits. Esto puede ser importante para operaciones bit a bit.
+
+Se admiten los {{jsxref("Operators", "operadores", "#Operadores_aritméticos")}} estándar, incluidas la aritmética de suma, resta, módulo (o resto), etc. También hay un objeto incorporado que no mencionamos anteriormente llamado {{jsxref("Math")}} que proporciona funciones matemáticas avanzadas y constantes:
+
+```js
+Math.sin(3.5);
+var circumference = 2 * Math.PI * r;
+```
+
+Puedes convertir una cadena en un número entero usando la función {{jsxref("Objetos_Globales/parseInt", "parseInt()")}} incorporada. Esta toma la base para la conversión como un segundo argumento opcional, que siempre debes proporcionar:
+
+```js
+parseInt('123', 10); // 123
+parseInt('010', 10); // 10
+```
+
+En los navegadores más antiguos, se supone que las cadenas que comienzan con un "0" están en octal (raíz 8), pero este no ha sido el caso desde 2013 más o menos. A menos que estés seguro de tu formato de cadena, puedes obtener resultados sorprendentes en esos navegadores más antiguos:
+
+```js
+parseInt('010'); // 8
+parseInt('0x10'); // 16
+```
+
+Aquí, vemos que la función {{jsxref("Objetos_Globales/parseInt", "parseInt()")}} trata la primera cadena como octal debido al 0 inicial, y la segunda cadena como hexadecimal debido al "0x" inicial. La _notación hexadecimal todavía está en su lugar_; solo se ha eliminado el octal.
+
+Si deseas convertir un número binario en un entero, simplemente cambia la base:
+
+```js
+parseInt('11', 2); // 3
+```
+
+De manera similar, puedes analizar números de coma flotante utilizando la función incorporada {{jsxref("Objetos_Globales/parseFloat", "parseFloat()")}}. A diferencia de su primo {{jsxref("Objetos_Globales/parseInt", "parseInt()")}}, `parseFloat()` siempre usa base 10.
+
+También puedes utilizar el operador `+` unario para convertir valores en números:
+
+```js
++ '42'; // 42
++ '010'; // 10
++ '0x10'; // 16
+```
+
+Se devuelve un valor especial llamado {{jsxref("NaN")}} (abreviatura de "Not a Number" o "No es un número") si la cadena no es numérica:
+
+```js
+parseInt('hello', 10); // NaN
+```
+
+`NaN` es tóxico: si lo proporcionas como operando para cualquier operación matemática, el resultado también será `NaN`:
+
+```js
+NaN + 5; // NaN
+```
+
+Puedes probar si un valor es `NaN` utilizando la función incorporada {{jsxref("Objetos_Globales/isNaN", "isNaN()")}}:
+
+```js
+isNaN(NaN); // true
+```
+
+JavaScript también tiene los valores especiales {{jsxref("Infinity")}} e `-Infinity`:
+
+```js
+ 1 / 0; // Infinity
+-1 / 0; // -Infinity
+```
+
+Puedes probar los valores `Infinity`, `-Infinity` y `NaN` utilizando la función integrada {{jsxref("Objetos_Globales/isFinite", "isFinite()")}}:
+
+```js
+isFinite(1 / 0); // false
+isFinite(-Infinity); // false
+isFinite(NaN); // false
+```
+
+> **Nota:** Las funciones {{jsxref("Objetos_Globales/parseInt", "parseInt()")}} y {{jsxref("Objetos_Globales/parseFloat", "parseFloat()")}} analizan una cadena hasta que alcancen un caracter que no es válido para el formato de número especificado, luego devuelve el número analizado hasta ese punto. Sin embargo, el operador "+" simplemente convierte la cadena a `NaN` si contiene un caracter no válido. Intenta analizar la cadena "10.2abc" con cada método tú mismo en la consola y comprenderás mejor las diferencias.
+
+## Strings
+
+Las cadenas en JavaScript son secuencias de [caracteres Unicode](/es/docs/Web/JavaScript/Guide/Values,_variables,_and_literals#Unicode). Esta debería ser una buena noticia para cualquiera que haya tenido que lidiar con la internacionalización. Exactamente, son secuencias de unidades de código UTF-16; cada unidad de código está representada por un número de 16 bits. Cada caracter Unicode está representado por 1 o 2 unidades de código.
+
+Si deseas representar un solo caracter, simplemente usa una cadena que consta de ese único caracter.
+
+Para encontrar la longitud de una cadena (en unidades de código), accede a su propiedad {{jsxref("Objetos_Globales/String/length", "lenght")}}:
+
+```js
+'hello'.length; // 5
+```
+
+¡Aquí está nuestra primer pincelada con objetos JavaScript! ¿Mencionamos que también puedes usar cadenas como {{jsxref("Object", "objectos", "", 1)}}? También tienen {{jsxref("String", "métodos", "#Métodos", 1)}} que te permiten manipular la cadena y acceder a información sobre la cadena:
+
+```js
+'hello'.charAt(0); // "h"
+'hello, world'.replace('world', 'mars'); // "hello, mars"
+'hello'.toUpperCase(); // "HELLO"
+```
+
+## Otros tipos
+
+JavaScript distingue entre {{jsxref("null")}}, que es un valor que indica un no valor deliberado (y solo se puede acceder a él mediante la palabra clave `null`), y {{jsxref("undefined")}}, que es un valor de tipo `undefined` que indica una variable no iniciada es decir, que aún no se le ha asignado un valor. Hablaremos de variables más adelante, pero en JavaScript es posible declarar una variable sin asignarle un valor. Si hace esto, el tipo de la variable es `undefined`. `undefined` en realidad es una constante.
+
+JavaScript tiene un tipo booleano, con valores posibles `true` y `false` (ambos son palabras clave). Cualquier valor se puede convertir a booleano de acuerdo con las siguientes reglas:
+
+1. `false`, `0`, cadenas vacías (`""`), `NaN`, `null`, y `undefined` todos se vuelven `false.`
+2. Todos los demás valores se vuelven `true.`
+
+Puedes realizar esta conversión explícitamente utilizando la función `Boolean()`:
+
+```js
+Boolean(''); // false
+Boolean(234); // true
+```
+
+Sin embargo, esto rara vez es necesario, ya que JavaScript realizará silenciosamente esta conversión cuando espera un booleano, como en una declaración `if` (ve más adelante). Por esta razón, a veces hablamos simplemente de "valores verdaderos" y "valores falsos", es decir, valores que se convierten en `true` y `false`, respectivamente, cuando se convierten en booleanos. Alternativamente, estos valores se pueden llamar "veracidad" y "falsedad", respectivamente.
+
+Operaciones booleanas como `&&` (_and_ lógico), `||` (_or_ lógico) y `!` (_not_ lógico) son compatibles; ve más adelante.
+
+## Variables
+
+Las nuevas variables en JavaScript se declaran utilizando una de tres palabras clave: {{jsxref("Sentencias/let", "let")}}, {{jsxref("Sentencias/const", "const")}} o {{jsxref("Sentencias/var", "var")}}.
+
+**`let`** te permite declarar variables a nivel de bloque. La variable declarada está disponible en el _bloque_ en el que está incluida.
+
+```js
+let a;
+let name = 'Simon';
+```
+
+El siguiente es un ejemplo de alcance con una variable declarada con **`let`**:
+
+```js
+// myLetVariable *no* es visible aquí
+
+for (let myLetVariable = 0; myLetVariable < 5; myLetVariable++) {
+ // myLetVariable solo es visible aquí
+}
+
+// myLetVariable *no* es visible aquí
+```
+
+**`const`** te permite declarar variables cuyos valores pretendes nunca cambiar. La variable está disponible en el _bloque_ en el que se declara.
+
+```js
+const Pi = 3.14; // establece la variable Pi
+Pi = 1; // arrojará un error porque no puede cambiar una variable constante.
+```
+
+**`var`** es la palabra clave declarativa más común. No tiene las restricciones que tienen las otras dos palabras clave. Esto se debe a que tradicionalmente era la única forma de declarar una variable en JavaScript. Una variable declarada con la palabra clave **`var`** está disponible en la _función_ en la que se declara.
+
+```js
+var a;
+var name = 'Simon';
+```
+
+Un ejemplo de ámbito con una variable declarada con **`var`:**
+
+```js
+// myVarVariable *es* visible aquí
+
+for (var myVarVariable = 0; myVarVariable < 5; myVarVariable++) {
+ // myVarVariable es visible para toda la función
+}
+
+// myVarVariable *es* visible aquí
+```
+
+Si declaras una variable sin asignarle ningún valor, su tipo es `undefined`.
+
+Una diferencia importante entre JavaScript y otros lenguajes como Java es que en JavaScript, los bloques no tienen alcance; solo las funciones tienen alcance. Entonces, si una variable se define usando `var` en una declaración compuesta (por ejemplo, dentro de una estructura de control `if`), será visible para toda la función. Sin embargo, a partir de ECMAScript 2015, las declaraciones {{jsxref("Sentencias/let", "let")}} y {{jsxref("Sentencias/const", "const")}} te permiten crear variables con alcance de bloque.
+
+## Operadores
+
+Los operadores numéricos de JavaScript son `+`, `-`, `*`, `/` y `%` que es el operador de residuo o resto ([que es lo mismo que módulo](/es/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Remainder_%28%29)). Los valores se asignan usando `=`, y también hay declaraciones de asignación compuestas como `+=` y `-=`. Estas se extienden hasta `x = x operador y`.
+
+```js
+x += 5;
+x = x + 5;
+```
+
+Puedes usar `++` y `--` para incrementar y disminuir respectivamente. Estos se pueden utilizar como operadores prefijos o sufijos.
+
+El [operador `+`](/es/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Addition) también hace concatenación de cadenas:
+
+```js
+'hello' + ' world'; // "hello world"
+```
+
+Si agregas una cadena a un número (u otro valor), todo se convierte primero en cadena. Esto podría hacerte tropezar:
+
+```js
+'3' + 4 + 5; // "345"
+ 3 + 4 + '5'; // "75"
+```
+
+Agregar una cadena vacía a algo es una forma útil de convertirla en cadena.
+
+[Se pueden realizar comparaciones](/es/docs/Web/JavaScript/Reference/Operators/Comparison_Operators) en JavaScript utilizando `<`, `>`, `<=` y `>=`. Estas funcionan tanto para cadenas como para números. La igualdad es un poco menos sencilla. El operador doble-igual realiza la coerción de tipos si le das diferentes tipos, con resultados a veces interesantes:
+
+```js
+123 == '123'; // true
+1 == true; // true
+```
+
+Para evitar la coerción de tipos, usa el operador triple-igual:
+
+```js
+123 === '123'; // false
+1 === true; // false
+```
+
+También hay operadores `!=` y `!==`.
+
+JavaScript también tiene [operaciones bit a bit](/es/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators). Si quieres usarlas, ahí están.
+
+## Estructuras de control
+
+JavaScript tiene un conjunto de estructuras de control similar a otros lenguajes de la familia C. Las declaraciones condicionales son compatibles con `if` y `else`; las puedes encadenarlas si lo deseas:
+
+```js
+var name = 'kittens';
+if (name == 'puppies') {
+ name += ' woof';
+} else if (name == 'kittens') {
+ name += ' meow';
+} else {
+ name += '!';
+}
+name == 'kittens meow';
+```
+
+JavaScript tiene bucles `while` y bucles `do-while`. El primero es bueno para bucles básicos; el segundo bucle para donde deseas asegurarte de que el cuerpo del bucle se ejecute por lo menos una vez:
+
+```js
+while (true) {
+ // ¡un bucle infinito!
+}
+
+var input;
+do {
+ input = get_input();
+} while (inputIsNotValid(input));
+```
+
+El [bucle `for`](/es/docs/Web/JavaScript/Reference/Statements/for) de JavaScript es igual que el de C y Java: te permite proporcione la información de control para tu bucle en una sola línea.
+
+```js
+for (var i = 0; i < 5; i++) {
+ // Se ejecutará 5 veces
+}
+```
+
+JavaScript también contiene otros dos bucles `for` destacados: [`for`...`of`](/es/docs/Web/JavaScript/Reference/Statements/for...of)
+
+```js
+for (let value of array) {
+ // haz algo con valor
+}
+```
+
+y [`for`...`in`](/es/docs/Web/JavaScript/Reference/Statements/for...in):
+
+```js
+for (let property in object) {
+ // hacer algo con la propiedad del objeto
+}
+```
+
+Los operadores `&&` y `||` utilizan evaluación de cortocircuito, lo cual significa que la evaluación del segundo operando depende del valor del primero. Esto es útil para verificar objetos nulos antes de acceder a sus atributos:
+
+```js
+var name = o && o.getName();
+```
+
+O para almacenar en caché los valores (cuando los valores falsos no son válidos):
+
+```js
+var name = cachedName || (cachedName = getName());
+```
+
+JavaScript tiene un operador ternario para expresiones condicionales:
+
+```js
+var allowed = (age > 18) ? 'yes' : 'no';
+```
+
+La instrucción `switch` se puede usar para múltiples ramas según un número o cadena:
+
+```js
+switch (action) {
+ case 'draw':
+ drawIt();
+ break;
+ case 'eat':
+ eatIt();
+ break;
+ default:
+ doNothing();
+}
+```
+
+Si no agregas una instrucción `break`, la ejecución "caerá" al siguiente nivel. Esto muy rara vez es lo que deseas; de hecho, vale la pena etiquetar específicamente la caída deliberada con un comentario si realmente lo pretendías para ayudar a la depuración:
+
+```js
+switch (a) {
+ case 1: // caída deliberada
+ case 2:
+ eatIt();
+ break;
+ default:
+ doNothing();
+}
+```
+
+La cláusula `default` es opcional. Puedes tener expresiones tanto en la parte del switch como en los casos si lo deseas; las comparaciones tienen lugar entre los dos utilizando el operador `===`:
+
+```js
+switch (1 + 3) {
+ case 2 + 2:
+ yay();
+ break;
+ default:
+ neverhappens();
+}
+```
+
+## Objetos
+
+Los objetos de JavaScript se pueden considerar como simples colecciones de pares nombre-valor. Como tal, son similares a:
+
+- Diccionarios en Python.
+- Hashes en Perl y Ruby.
+- Tablas hash en C y C++.
+- HashMaps en Java.
+- Arreglos asociativas en PHP.
+
+El hecho de que esta estructura de datos se utilice tan ampliamente es un testimonio de su versatilidad. Dado que todo (el núcleo, tipos bar) en JavaScript es un objeto, cualquier programa de JavaScript implica naturalmente una gran cantidad de búsquedas en tablas hash. ¡Qué bueno que sean tan rápidas!
+
+La parte "name" es una cadena JavaScript, mientras que el valor puede ser cualquier valor de JavaScript, incluidos más objetos. Esto te permite construir estructuras de datos de complejidad arbitraria.
+
+Hay dos formas básicas de crear un objeto vacío:
+
+```js
+var obj = new Object();
+```
+
+Y:
+
+```js
+var obj = {};
+```
+
+Estas son semánticamente equivalentes; la segunda se llama sintaxis literal de objeto y es más conveniente. Esta sintaxis también es el núcleo del formato JSON y se debe preferir en todo momento.
+
+La sintaxis de objeto literal se puede utilizar para iniciar un objeto en su totalidad:
+
+```js
+var obj = {
+ name: 'Carrot',
+ for: 'Max', // 'for' es una palabra reservada, use '_for' en su lugar.
+ details: {
+ color: 'orange',
+ size: 12
+ }
+};
+```
+
+El acceso a los atributos se puede encadenar:
+
+```js
+obj.details.color; // orange
+obj['details']['size']; // 12
+```
+
+El siguiente ejemplo crea un prototipo de objeto (`Person`) y una instancia de ese prototipo (`you`).
+
+```js
+function Person(name, age) {
+ this.name = name;
+ this.age = age;
+}
+
+// Define un objeto
+var you = new Person('You', 24);
+// Estamos creando una nueva persona llamada "You" de 24 años.
+```
+
+**Una vez creado**, se puede volver a acceder a las propiedades de un objeto de dos formas:
+
+```js
+// notación de puntos
+obj.name = 'Simon';
+var name = obj.name;
+```
+
+Y...
+
+```js
+// notación de corchetes
+obj['name'] = 'Simon';
+var name = obj['name'];
+// puedes usar una variable para definir una clave
+var user = prompt('¿cuál es su clave?')
+obj[user] = prompt('¿cuál es su valor?')
+```
+
+Estas también son semánticamente equivalentes. El segundo método tiene la ventaja de que el nombre de la propiedad se proporciona como una cadena, lo cual significa que se puede calcular en tiempo de ejecución. Sin embargo, el uso de este método evita que se apliquen algunas optimizaciones de minificación y del motor de JavaScript. También se puede utilizar para establecer y obtener propiedades con nombres [palabras reservadas](/es/docs/Web/JavaScript/Reference/Lexical_grammar#Keywords):
+
+```js
+obj.for = 'Simon'; // Error de sintaxis, porque 'for' es una palabra reservada
+obj['for'] = 'Simon'; // trabaja bien
+```
+
+> **Nota:** A partir de ECMAScript 5, las palabras reservadas se pueden utilizar como nombres de propiedad de objeto "en bruto". Esto significa que no necesitan "vestirse" entre comillas al definir objeto literales. Consulta la [especificación](http://es5.github.io/#x7.6.1) de ES5.
+
+Para obtener más información sobre objetos y prototipos, consulta {{jsxref("Objetos_Globales/Object/prototype", "Object.prototype")}}. Para obtener una explicación de los prototipos de objetos y las cadenas de prototipos de objetos, consulta [Herencia y la cadena de prototipos](/es/docs/Web/JavaScript/Inheritance_and_the_prototype_chain).
+
+> **Nota:** A partir de ECMAScript 2015, las claves de objeto se pueden definir mediante la variable en notación de corchetes al crearlas. `{[phoneType]: 12345}` es posible en lugar de solo `var userPhone = {}; userPhone[phoneType] = 12345`.
+
+## Arreglos
+
+Los arreglos en JavaScript en son realidad un tipo especial de objeto. Funcionan de manera muy parecida a los objetos normales (las propiedades numéricas se pueden acceder naturalmente solo usando la sintaxis `[]`) pero tienen una propiedad mágica llamada '`length`'. Este siempre es uno más que el índice más alto de el arreglo.
+
+Una forma de crear arreglos es la siguiente:
+
+```js
+var a = new Array();
+a[0] = 'dog';
+a[1] = 'cat';
+a[2] = 'hen';
+a.length; // 3
+```
+
+Una notación más conveniente es usar un arreglo literal:
+
+```js
+var a = ['dog', 'cat', 'hen'];
+a.length; // 3
+```
+
+Ten en cuenta que `array.length` no necesariamente es el número de elementos del arreglo. Considera lo siguiente:
+
+```js
+var a = ['dog', 'cat', 'hen'];
+a[100] = 'fox';
+a.length; // 101
+```
+
+Recuerda — la longitud de el arreglo es uno más que el índice más alto.
+
+Si consultas un índice de arreglo que no existe, obtendrás un valor de `undefined`:
+
+```js
+typeof a[90]; // undefined
+```
+
+Si tienes en cuenta lo anterior sobre `[]` y `length`, puedes iterar sobre un arreglo utilizando el siguiente bucle `for`:
+
+```js
+for (var i = 0; i < a.length; i++) {
+ // Haz algo con a[i]
+}
+```
+
+ES2015 introdujo el bucle más conciso [`for`...`of`](/es/docs/Web/JavaScript/Reference/Statements/for...of) para objetos iterables como arreglos:
+
+```js
+for (const currentValue of a) {
+ // Haz algo con currentValue
+}
+```
+
+También puedes iterar sobre un arreglo utilizando el bucle [`for`...`in`](/es/docs/Web/JavaScript/Reference/Statements/for...in), sin embargo, este no itera sobre los elementos del arreglo, sino los índices del arreglo. Además, si alguien agrega nuevas propiedades a `Array.prototype`, también serán iteradas por dicho bucle. Por lo tanto, este tipo de bucle no se recomienda para arreglos.
+
+Otra forma de iterar sobre un arreglo que se agregó con ECMAScript 5 es {{jsxref("Objetos_Globales/Array/forEach", "arr.forEach()")}}:
+
+```js
+['dog', 'cat', 'hen'].forEach(function(currentValue, index, array) {
+ // Hacer algo con currentValue o array[index]
+});
+```
+
+Si deseas agregar un elemento a un arreglo, simplemente hazlo así:
+
+```js
+a.push(item);
+```
+
+Los arreglos vienen con varios métodos. Consulta también la {{jsxref("Objetos_Globales/Array", "documentación completa para métodos de arreglo")}}.
+
+| Nombre del método | Descripción |
+| ---------------------------------------------------- | ------------------------------------------------------------------------------------------ |
+| `a.toString()` | Devuelve una cadena con el `toString()` de cada elemento separado por comas. |
+| `a.toLocaleString()` | Devuelve una cadena con el `toLocaleString()` de cada elemento separado por comas. |
+| `a.concat(item1[, item2[, ...[, itemN]]])` | Devuelve un nuevo arreglo con los elementos agregados. |
+| `a.join(sep)` | Convierte el arreglo en una cadena, con valores delimitados por el parámetro `sep` |
+| `a.pop()` | Elimina y devuelve el último elemento. |
+| `a.push(item1, ..., itemN)` | Agrega elementos al final del arreglo. |
+| `a.shift()` | Elimina y devuelve el primer elemento. |
+| `a.unshift(item1[, item2[, ...[, itemN]]])` | Añade elementos al inicio del arreglo. |
+| `a.slice(start[, end])` | Devuelve un subarreglo. |
+| `a.sort([cmpfn])` | Toma una función de comparación opcional. |
+| `a.splice(start, delcount[, item1[, ...[, itemN]]])` | Te permite modificar un arreglo eliminando una sección y reemplazándola con más elementos. |
+| `a.reverse()` | Invierte el arreglo. |
+
+## Funciones
+
+Junto con los objetos, las funciones son el componente principal para comprender JavaScript. La función más básica no podría ser mucho más sencilla:
+
+```js
+function add(x, y) {
+ var total = x + y;
+ return total;
+}
+```
+
+Esto demuestra una función básica. Una función de JavaScript puede tomar 0 o más parámetros con nombre. El cuerpo de la función puede contener tantas declaraciones como desees y puedes declarar tus propias variables que son locales para esa función. La declaración `return` se puede usar para devolver un valor en cualquier momento, terminando la función. Si no se utiliza una declaración `return` (o `return` vacía sin valor), JavaScript devuelve `undefined`.
+
+Los parámetros nombrados resultan ser más intuitivos que cualquier otra cosa. Puedes llamar a una función sin pasar los parámetros que espera, en cuyo caso se establecerán en `undefined`.
+
+```js
+add(); // NaN
+// No puedes realizar sumas en undefined
+```
+
+También puedes pasar más argumentos de los que espera la función:
+
+```js
+add(2, 3, 4); // 5
+// sumó los dos primeros; el 4 fue ignorado
+```
+
+Eso puede parecer un poco tonto, pero las funciones tienen acceso a una variable adicional dentro de su cuerpo llamada [`argumentos`](/es/docs/Web/JavaScript/Reference/Functions/argument), que es un objeto tipo arreglo que contiene todos los valores pasados a la función. Reescribamos la función de suma para tomar tantos valores como queramos:
+
+```js
+function add() {
+ var sum = 0;
+ for (var i = 0, j = arguments.length; i < j; i++) {
+ sum += arguments[i];
+ }
+ return sum;
+}
+
+add(2, 3, 4, 5); // 14
+```
+
+Sin embargo, eso no es más útil que escribir `2 + 3 + 4 + 5`. Creemos una función de promedio:
+
+```js
+function avg() {
+ var sum = 0;
+ for (var i = 0, j = arguments.length; i < j; i++) {
+ sum += arguments[i];
+ }
+ return sum / arguments.length;
+}
+
+avg(2, 3, 4, 5); // 3.5
+```
+
+Esta es bastante útil, pero parece un poco detallada. Para reducir un poco más este código, podemos considerar la sustitución del uso del arreglo de argumentos a través de la [sintaxis del parámetro `Rest`](/es/docs/Web/JavaScript/Reference/Functions/rest_parameters). De esta manera, podemos pasar cualquier número de argumentos a la función manteniendo nuestro código mínimo. El **operador de parámetro `rest`** se usa en listas de parámetros de función con el formato: **...variable** e incluirá dentro de esa variable la lista completa de argumentos no capturados a los que se llamó la función. `with`. También reemplazaremos el bucle **for** con un bucle **for...of** para devolver los valores dentro de nuestra variable.
+
+```js
+function avg(...args) {
+ var sum = 0;
+ for (let value of args) {
+ sum += value;
+ }
+ return sum / args.length;
+}
+
+avg(2, 3, 4, 5); // 3.5
+```
+
+> **Nota:** En el código anterior, la variable **args** contiene todos los valores que se pasaron a la función.
+>
+> Es importante tener en cuenta que dondequiera que se coloque el operador de parámetro `rest` en una declaración de función, almacenará todos los argumentos _después_ de su declaración, pero no antes. _es decir, function_ _avg(_**firstValue,** _...args)_ almacenará el primer valor pasado a la función en la variable **firstValue** y los argumentos restantes en **args**. Esa es otra característica útil del lenguaje, pero nos lleva a un nuevo problema. La función `avg()`toma una lista de argumentos separados por comas, pero ¿qué sucede si deseas encontrar el promedio de un arreglo? Simplemente, podrías reescribir la función de la siguiente manera:
+
+```js
+function avgArray(arr) {
+ var sum = 0;
+ for (var i = 0, j = arr.length; i < j; i++) {
+ sum += arr[i];
+ }
+ return sum / arr.length;
+}
+
+avgArray([2, 3, 4, 5]); // 3.5
+```
+
+Pero sería bueno poder reutilizar la función que ya hemos creado. Afortunadamente, JavaScript te permite llamar a una función con un arreglo arbitrario de argumentos, usando el método {{jsxref("Function.apply", "apply()")}} de cualquier objeto función.
+
+```js
+avg.apply(null, [2, 3, 4, 5]); // 3.5
+```
+
+El segundo argumento de `apply()` es el arreglo que se utilizará como `arguments`; el primero se explicará más adelante. Esto enfatiza el hecho de que las funciones también son objetos.
+
+> **Nota:** Puedes lograr el mismo resultado utilizando el [operador de propagación](/es/docs/Web/JavaScript/Reference/Operators/Spread_operator) en la llamada de función.
+>
+> Por ejemplo: `avg(...numbers)`
+
+JavaScript te permite crear funciones anónimas.
+
+```js
+var avg = function() {
+ var sum = 0;
+ for (var i = 0, j = arguments.length; i < j; i++) {
+ sum += arguments[i];
+ }
+ return sum / arguments.length;
+};
+```
+
+Esto semánticamente es equivalente a la forma `function avg()`. Es extremadamente poderosa, ya que te permite colocar una definición de función completa en cualquier lugar donde normalmente colocarías una expresión. Esto permite todo tipo de ingeniosos trucos. Aquí hay una forma de "ocultar" algunas variables locales — como alcance de bloque en C:
+
+```js
+var a = 1;
+var b = 2;
+
+(function() {
+ var b = 3;
+ a += b;
+})();
+
+a; // 4
+b; // 2
+```
+
+JavaScript te permite llamar a funciones de forma recursiva. Esto es particularmente útil para tratar con estructuras de árbol, como las que se encuentran en el DOM del navegador.
+
+```js
+function countChars(elm) {
+ if (elm.nodeType == 3) { // TEXT_NODE
+ return elm.nodeValue.length;
+ }
+ var count = 0;
+ for (var i = 0, child; child = elm.childNodes[i]; i++) {
+ count += countChars(child);
+ }
+ return count;
+}
+```
+
+Esto resalta un problema potencial con las funciones anónimas: ¿cómo las llama de forma recursiva si no tienen un nombre? JavaScript te permite nombrar expresiones de función para esto. Puedes utilizar {{Glossary("IIFE", "IIFE (expresiones de función invocadas inmediatamente)")}} con nombre como se muestra a continuación:
+
+```js
+var charsInBody = (function counter(elm) {
+ if (elm.nodeType == 3) { // TEXT_NODE
+ return elm.nodeValue.length;
+ }
+ var count = 0;
+ for (var i = 0, child; child = elm.childNodes[i]; i++) {
+ count += counter(child);
+ }
+ return count;
+})(document.body);
+```
+
+El nombre proporcionado a una expresión de función como arriba solo está disponible para el alcance de la función. Esto permite que el motor realice más optimizaciones y da como resultado un código más legible. El nombre también aparece en el depurador y en algunos seguimientos de la pila, lo cual puede ahorrarte tiempo al depurar.
+
+Ten en cuenta que las funciones de JavaScript en sí mismas son objetos, como todo lo demás en JavaScript, y puedes agregar o cambiar propiedades en ellas tal como hemos visto anteriormente en la sección Objetos.
+
+## Objetos personalizados
+
+> **Nota:** Para obtener una descripción más detallada de la programación orientada a objetos en JavaScript, consulta [Introducción a JavaScript orientado a objetos](/es/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript).
+
+En la programación clásica orientada a objetos, los objetos son colecciones de datos y métodos que operan sobre esos datos. JavaScript es un lenguaje basado en prototipos que no contiene una declaración de clase, como la encontrarías en C++ o Java (esto, a veces es confuso para los programadores acostumbrados a lenguajes con una declaración de clase). En cambio, JavaScript usa funciones como clases. Consideremos un objeto `person` con campos `first` y `last name`. Hay dos formas de mostrar el nombre: como "primero último" o como "último, primero". Usando las funciones y objetos que hemos explicado anteriormente, podríamos mostrar los datos de esta manera:
+
+```js
+function makePerson(first, last) {
+ return {
+ first: first,
+ last: last
+ };
+}
+function personFullName(person) {
+ return person.first + ' ' + person.last;
+}
+function personFullNameReversed(person) {
+ return person.last + ', ' + person.first;
+}
+
+var s = makePerson('Simon', 'Willison');
+personFullName(s); // "Simon Willison"
+personFullNameReversed(s); // "Willison, Simon"
+```
+
+Esto funciona, pero es bastante feo. Terminas con docenas de funciones en tu espacio de nombres global. Lo que realmente necesitamos es una forma de enlazar una función a un objeto. Dado que las funciones son objetos, esto es fácil:
+
+```js
+function makePerson(first, last) {
+ return {
+ first: first,
+ last: last,
+ fullName: function() {
+ return this.first + ' ' + this.last;
+ },
+ fullNameReversed: function() {
+ return this.last + ', ' + this.first;
+ }
+ };
+}
+
+var s = makePerson('Simon', 'Willison');
+s.fullName(); // "Simon Willison"
+s.fullNameReversed(); // "Willison, Simon"
+```
+
+Nota sobre la palabra clave [`this`](/es/docs/Web/JavaScript/Reference/Operators/this). Usada dentro de una función, `this` se refiere al objeto actual. Lo que realmente significa está especificado por la forma en que llamaste a esa función. Si lo llamaste usando [notación de puntos o notación de corchetes](/es/docs/Web/JavaScript/Reference/Operators/Object_initializer#Accessing_properties) en un objeto, ese objeto se convierte en `this`. Si la notación de puntos no se usó para la llamada, `this` se refiere al objeto global.
+
+Ten en cuenta que `this` es una frecuente causa de errores. Por ejemplo:
+
+```js
+var s = makePerson('Simon', 'Willison');
+var fullName = s.fullName;
+fullName(); // undefined undefined
+```
+
+Cuando llamamos a `fullName()` solo, sin usar `s.fullName()`, `this` está vinculado al objeto global. Debido a que no hay variables globales llamadas `first` o `last` obtenemos `undefined` para cada una.
+
+Podemos aprovechar la palabra clave `this` para mejorar nuestra función `makePerson`:
+
+```js
+function Person(first, last) {
+ this.first = first;
+ this.last = last;
+ this.fullName = function() {
+ return this.first + ' ' + this.last;
+ };
+ this.fullNameReversed = function() {
+ return this.last + ', ' + this.first;
+ };
+}
+var s = new Person('Simon', 'Willison');
+```
+
+Hemos introducido otra palabra clave: [`new`](/es/docs/Web/JavaScript/Reference/Operators/new). `new` está fuertemente relacionado con `this`. Crea un nuevo objeto vacío y luego llama a la función especificada, con `this` configurado para ese nuevo objeto. Sin embargo, ten en cuenta que la función especificada con `this` no devuelve un valor, sino que simplemente modifica el objeto `this`. Es `new` que devuelve el objeto `this` al sitio que realiza la llamada. Las funciones que están diseñadas para ser llamadas por `new` se denominan funciones constructoras. La práctica común es poner en mayúscula estas funciones como recordatorio para llamarlas con `new`.
+
+La función mejorada todavía tiene el mismo error al llamar a `fullName()` sola.
+
+Nuestros objetos `person` están mejorando, pero todavía tienen algunos bordes desagradables. Cada vez que creamos un objeto `person`, estamos creando dos nuevos objetos de función dentro de él, ¿no sería mejor si este código fuera compartido?
+
+```js
+function personFullName() {
+ return this.first + ' ' + this.last;
+}
+function personFullNameReversed() {
+ return this.last + ', ' + this.first;
+}
+function Person(first, last) {
+ this.first = first;
+ this.last = last;
+ this.fullName = personFullName;
+ this.fullNameReversed = personFullNameReversed;
+}
+```
+
+Eso es mejor: estamos creando las funciones como métodos solo una vez y asignándoles referencias dentro del constructor. ¿Podemos hacer algo mejor que eso? La respuesta es sí:
+
+```js
+function Person(first, last) {
+ this.first = first;
+ this.last = last;
+}
+Person.prototype.fullName = function() {
+ return this.first + ' ' + this.last;
+};
+Person.prototype.fullNameReversed = function() {
+ return this.last + ', ' + this.first;
+};
+```
+
+`Person.prototype` es un objeto compartido por todas las instancias de `Person`. Forma parte de una cadena de búsqueda (que tiene un nombre especial, "cadena de prototipos"): cada vez que intentes acceder a una propiedad de `Person` que no esté configurada, JavaScript revisará `Person.prototype` para ver si esa propiedad existe allí. Como resultado, todo lo asignado a `Person.prototype` pasa a estar disponible para todas las instancias de ese constructor a través del objeto `this`.
+
+Esta es una herramienta increíblemente poderosa. JavaScript te permite modificar el prototipo de algo en cualquier momento en tu programa, lo cual significa que —en tiempo de ejecución— puedes agregar métodos adicionales a los objetos existentes:
+
+```js
+var s = new Person('Simon', 'Willison');
+s.firstNameCaps(); // TypeError en la línea 1: s.firstNameCaps no es una función
+
+Person.prototype.firstNameCaps = function() {
+ return this.first.toUpperCase();
+};
+s.firstNameCaps(); // "SIMON"
+```
+
+Curiosamente, también puedes agregar cosas al prototipo de objetos JavaScript integrados. Agreguemos un método a `String` que devuelva esa cadena a la inversa:
+
+```js
+var s = 'Simon';
+s.reversed(); // TypeError en la línea 1: s.reversed no es una función
+
+String.prototype.reversed = function() {
+ var r = '';
+ for (var i = this.length - 1; i >= 0; i--) {
+ r += this[i];
+ }
+ return r;
+};
+
+s.reversed(); // nomiS
+```
+
+¡Nuestro método `new` funciona incluso con cadenas literales!
+
+```js
+'Esto ahora se puede revertir'.reversed(); // ritrever edeup es aroha otsE
+```
+
+Como se mencionó anteriormente, el prototipo forma parte de una cadena. La raíz de esa cadena es `Object.prototype`, cuyos métodos incluyen `toString()`; es este método el que se llama cuando intentas representar un objeto como una cadena. Esto es útil para depurar nuestros objetos `Person`:
+
+```js
+var s = new Person('Simon', 'Willison');
+s.toString(); // [object Object]
+
+Person.prototype.toString = function() {
+ return '';
+}
+
+s.toString(); // ""
+```
+
+¿Recuerda cómo `avg.apply()` tenía un primer argumento `null`? Ahora lo podemos revisar. El primer argumento de `apply()` es el objeto que se debe tratar como '`this`'. Por ejemplo, aquí hay una implementación trivial de `new`:
+
+```js
+function trivialNew(constructor, ...args) {
+ var o = {}; // Crea un objeto
+ constructor.apply(o, args);
+ return o;
+}
+```
+
+Esta no es una réplica exacta de `new` ya que no configura la cadena de prototipos (sería difícil de ilustrar). Esto no es algo que use con mucha frecuencia, pero es útil conocerlo. En este fragmento, `...args` (incluidos los puntos suspensivos) se denomina "[argumentos rest](/es/docs/Web/JavaScript/Reference/Functions/rest_parameters)" — como su nombre indica, contiene el resto de los argumentos.
+
+Llamar a...
+
+```js
+var bill = trivialNew(Person, 'William', 'Orange');
+```
+
+...por tanto, casi es equivalente a
+
+```js
+var bill = new Person('William', 'Orange');
+```
+
+`apply()` tiene una función hermana llamada {{jsxref("Objetos_Globales/Function/call", "call()")}}, que nuevamente te permite establecer `this` pero toma una lista de argumentos expandida en lugar de un arreglo.
+
+```js
+function lastNameCaps() {
+ return this.last.toUpperCase();
+}
+var s = new Person('Simon', 'Willison');
+lastNameCaps.call(s);
+// Es lo mismo que:
+s.lastNameCaps = lastNameCaps;
+s.lastNameCaps(); // WILLISON
+```
+
+### Funciones internas
+
+Las declaraciones de función de JavaScript están permitidas dentro de otras funciones. Hemos visto esto una vez antes, con la función `makePerson()` anterior. Un detalle importante de las funciones anidadas en JavaScript es que pueden acceder a las variables en el alcance de su función padre:
+
+```js
+function parentFunc() {
+ var a = 1;
+
+ function nestedFunc() {
+ var b = 4; // parentFunc no puede usar esto
+ return a + b;
+ }
+ return nestedFunc(); // 5
+}
+```
+
+Esto proporciona una gran utilidad para escribir un código más fácil de mantener. Si una función llamada se basa en una o dos funciones que no son útiles para ninguna otra parte de tu código, puedes anidar esas funciones de utilidad dentro de ella. Esto mantiene baja la cantidad de funciones que están en el alcance global, lo cual siempre es bueno.
+
+Esto también contrarresta el atractivo de las variables globales. Al escribir código complejo, a menudo es tentador utilizar variables globales para compartir valores entre múltiples funciones, lo que conduce a un código difícil de mantener. Las funciones anidadas pueden compartir variables en su padre, por lo que puedes usar ese mecanismo para unir funciones cuando tenga sentido sin contaminar tu espacio de nombres global — "globales locales" si lo deseas. Esta técnica se debe usar con precaución, pero es una útil habilidad.
+
+## Cierres
+
+Esto nos lleva a una de las abstracciones más poderosas que JavaScript tiene para ofrecer — pero potencialmente, también la más confusa. ¿Qué hace esta?
+
+```js
+function makeAdder(a) {
+ return function(b) {
+ return a + b;
+ };
+}
+var add5 = makeAdder(5);
+var add20 = makeAdder(20);
+add5(6); // ?
+add20(7); // ?
+```
+
+El nombre de la función `makeAdder()` lo debería revelar: crea nuevas funciones '`adder`', cada una de las cuales, cuando se llama con un argumento, lo suma al argumento con el que fue creada.
+
+Lo que está sucediendo aquí es más o menos lo mismo que sucedía anteriormente con las funciones internas: una función definida dentro de otra función tiene acceso a las variables de la función externa. La única diferencia aquí es que la función externa ha regresado y, por lo tanto, el sentido común parece dictar que sus variables locales ya no existen. Pero _sí_ existen todavía — de lo contrario, las funciones de suma no podrían funcionar. Además, hay dos diferentes "copias" de las variables locales de `makeAdder()`: una en la que `a` es 5 y la otra en la que `a` es 20. Entonces, el resultado de las llamadas a esa función es el siguiente:
+
+```js
+add5(6); // returns 11
+add20(7); // devuelve 27
+```
+
+Esto es lo que está sucediendo realmente. Siempre que JavaScript ejecuta una función, se crea un objeto '`scope`' para contener las variables locales creadas dentro de esa función. Se inicia con cualquier variable pasada como parámetros de función. Esto es similar al objeto global en el que viven todas las variables y funciones globales, pero con un par de importantes diferencias: en primer lugar, se crea un objeto de alcance completamente nuevo cada vez que una función se comienza a ejecutar y, en segundo lugar, a diferencia del objeto global (que es accesible como `this` y en los navegadores como `window`) no se puede acceder directamente a estos objetos `scope` desde tu código JavaScript. No hay ningún mecanismo para iterar sobre las propiedades del objeto `scope` actual, por ejemplo.
+
+Entonces, cuando se llama a `makeAdder()`, se crea un objeto `scope` con una propiedad: `a`, que es el argumento que se pasa a la función `makeAdder()`. `makeAdder()` luego devuelve una función recién creada. Normalmente, el recolector de basura de JavaScript limpiaría el objeto `scope` creado para `makeAdder()` en este punto, pero la función devuelta mantiene una referencia a ese objeto de ámbito. Como resultado, el objeto `scope` no será recolectado como basura hasta que no haya más referencias al objeto función que `makeAdder()` devolvió.
+
+Los objetos `scope` forman una cadena llamada cadena de ámbito, similar a la cadena de prototipos utilizada por el sistema de objetos de JavaScript.
+
+Un **cierre** es la combinación de una función y el objeto `scope` en el que se creó. Los cierres te permiten guardar el estado — como tal, a menudo se pueden usar en lugar de objetos. Puedes encontrar [varias presentaciones excelentes de los cierres](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work).
diff --git a/files/es/web/javascript/reference/classes/index.html b/files/es/web/javascript/reference/classes/index.html
deleted file mode 100644
index 526181e23e664d..00000000000000
--- a/files/es/web/javascript/reference/classes/index.html
+++ /dev/null
@@ -1,330 +0,0 @@
----
-title: Clases
-slug: Web/JavaScript/Reference/Classes
-tags:
- - Classes
- - ECMAScript 2015
- - Herencia
- - Intermedio
- - JavaScript
- - NeedsContent
- - NeedsTranslation
- - Reference
- - TopicStub
-translation_of: Web/JavaScript/Reference/Classes
-original_slug: Web/JavaScript/Referencia/Classes
----
-{{JsSidebar("Classes")}}
-
-Las clases de javascript, introducidas en ECMAScript 2015, son una mejora sintáctica sobre la herencia basada en prototipos de JavaScript. La sintaxis de las clases no introduce un nuevo modelo de herencia orientada a objetos en JavaScript. Las clases de JavaScript proveen una sintaxis mucho más clara y simple para crear objetos y lidiar con la herencia.
-
-Definiendo clases
-
-Las clases son "funciones especiales", como las expresiones de funciones y declaraciones de funciones , la sintaxis de una clase tiene dos componentes: expresiones de clases y declaraciones de clases .
-
-Declaración de clases
-
-Una manera de definir una clase es mediante una declaración de clase . Para declarar una clase, se utiliza la palabra reservada class
y un nombre para la clase "Rectangulo".
-
-class Rectangulo {
- constructor(alto, ancho) {
- this.alto = alto;
- this.ancho = ancho;
- }
-}
-
-Alojamiento
-
-Una importante diferencia entre las declaraciones de funciones y las declaraciones de clases es que las declaraciones de funciones son alojadas y las declaraciones de clases no lo son. En primer lugar necesitas declarar tu clase y luego acceder a ella, de otro modo el ejemplo de código siguiente arrojará un {{jsxref("ReferenceError")}}:
-
-const p = new Rectangle(); // ReferenceError
-
-class Rectangle {}
-
-
-Expresiones de clases
-
-Una expresión de clase es otra manera de definir una clase. Las expresiones de clase pueden ser nombradas o anónimas. El nombre dado a la expresión de clase nombrada es local dentro del cuerpo de la misma.
-
-// Anonima
-let Rectangulo = class {
- constructor(alto, ancho) {
- this.alto = alto;
- this.ancho = ancho;
- }
-};
-
-console.log(Rectangulo.name);
-// output: "Rectangulo"
-
-// Nombrada
-let Rectangulo = class Rectangulo2 {
- constructor(alto, ancho) {
- this.alto = alto;
- this.ancho = ancho;
- }
-};
-console.log(Rectangulo.name);
-// output: "Rectangulo2"
-
-
-
-
Nota: Las expresiones de clase están sujetas a las mismas restricciones de elevación que se describen en la sección Class declarations .
-
-
-Cuerpo de la clase y definición de métodos
-
-El contenido de una clase es la parte que se encuentra entre las llaves {}
. Este es el lugar se definen los miembros de clase, como los métodos o constructores.
-
-Modo estricto
-
-El cuerpo de las declaraciones de clase y las expresiones de clase son ejecutadas en modo estricto. En otras palabras, el código escrito aquí está sujeto a una sintaxis más estricta para aumentar el rendimiento, se arrojarán algunos errores silenciosos y algunas palabras clave están reservadas para versiones futuras de ECMAScript.
-
-Constructor
-
-El método constructor
es un método especial para crear e inicializar un objeto creado con una clase
. Solo puede haber un método especial con el nombre "constructor" en una clase. Si esta contiene mas de una ocurrencia del método constructor,
se arrojará un Error {{jsxref("SyntaxError")}}
-
-Un constructor puede usar la palabra reservada super
para llamar al constructor de una superclase
-
-Métodos prototipo
-
-Vea también métodos definidos .
-
-class Rectangulo {
- constructor (alto, ancho) {
- this.alto = alto;
- this.ancho = ancho;
- }
- // Getter
- get area() {
- return this.calcArea();
- }
- // Método
- calcArea () {
- return this.alto * this.ancho;
- }
-}
-
-const cuadrado = new Rectangulo(10, 10);
-
-console.log(cuadrado.area); // 100
-
-
-
-Métodos estáticos
-
-La palabra clave static
define un método estático para una clase. Los métodos estáticos son llamados sin instanciar su clase y no pueden ser llamados mediante una instancia de clase. Los métodos estáticos son a menudo usados para crear funciones de utilidad para una aplicación.
-
-class Punto {
- constructor ( x , y ){
- this.x = x;
- this.y = y;
- }
-
- static distancia ( a , b) {
- const dx = a.x - b.x;
- const dy = a.y - b.y;
-
- return Math.sqrt ( dx * dx + dy * dy );
- }
-}
-
-const p1 = new Punto(5, 5);
-const p2 = new Punto(10, 10);
-
-console.log (Punto.distancia(p1, p2)); // 7.0710678118654755
-
-"Boxing" con prototipos y métodos estáticos
-
-Cuando un método estático o método del prototipo es llamado sin un valor para "this" (o con "this" como booleano, cadena, número, undefined o null), entonces el valor de "this" será undefined dentro de la funciona llamada. Autoboxing no ocurrirá. El comportamiento será igual inclusive si se escribe el código en modo no estricto.
-
-class Animal {
- hablar() {
- return this;
- }
- static comer() {
- return this;
- }
-}
-
-let obj = new Animal();
-obj.hablar(); // Animal {}
-let hablar = obj.hablar;
-hablar(); // undefined
-
-Animal.comer() // class Animal
-let comer = Animal.comer;
-comer(); // undefined
-
-Si se escribe el código del cuadro superior usando clases función tradicionales, entonces autoboxing ocurrirara porque tomará valor de "this" sobre la función que es llamada.
-
-function Animal() { }
-
-Animal.prototype.hablar = function(){
- return this;
-}
-
-Animal.comer = function() {
- return this;
-}
-
-let obj = new Animal();
-let hablar = obj.hablar;
-hablar(); // global object
-
-let hablar = Animal.hablar;
-hablar(); // global object
-
-Subclases con extends
-
-La palabra clave extends
es usada en declaraciones de clase o expresiones de clase para crear una clase hija.
-
-class Animal {
- constructor(nombre) {
- this.nombre = nombre;
- }
-
- hablar() {
- console.log(this.nombre + ' hace un ruido.');
- }
-}
-
-class Perro extends Animal {
- hablar() {
- console.log(this.nombre + ' ladra.');
- }
-}
-
-También se pueden extender las clases tradicionales basadas en funciones:
-
-function Animal (nombre) {
- this.nombre = nombre;
-}
-Animal.prototype.hablar = function () {
- console.log(this.nombre + 'hace un ruido.');
-}
-
-class Perro extends Animal {
- hablar() {
- super.hablar();
- console.log(this.nombre + ' ladra.');
- }
-}
-
-var p = new Perro('Mitzie');
-p.hablar();
-
-Fijarse que las clases no pueden extender objectos regulares (literales). Si se quiere heredar de un objecto regular, se debe user {{jsxref("Object.setPrototypeOf()")}}::
-
-var Animal = {
- hablar() {
- console.log(this.nombre + ' hace ruido.');
- },
- comer() {
- console.log(this.nombre + ' se alimenta.');
- }
-};
-
-class Perro {
- constructor(nombre) {
- this.nombre = nombre;
- }
- hablar() {
- console.log(this.nombre + ' ladra.');
- }
-}
-
-// Solo adjunta los métodos aún no definidos
-Object.setPrototypeOf(Perro.prototype, Animal);
-
-var d = new Perro('Mitzie');
-d.hablar(); // Mitzie ladra.
-d.comer(); // Mitzie se alimenta.
-
-Especies
-
-Quizás se quiera devolver objetos {{jsxref("Array")}} derivados de la clase array MyArray. El patron species permite sobreescribir constructores por defecto.
-
-Por ejemplo, cuando se usan metodos del tipo {{jsxref("Array.map", "map()")}} que devuelven el constructor por defecto, se quiere que esos métodos devuelvan un objeto padre Array, en vez de MyArray. El símbolo {{jsxref("Symbol.species")}} permite hacer:
-
-class MyArray extends Array {
- // Sobreescribe species sobre el constructor padre Array
- static get [Symbol.species]() { return Array; }
-}
-
-var a = new MyArray(1,2,3);
-var mapped = a.map(x => x * x);
-
-console.log(mapped instanceof MyArray); // false
-console.log(mapped instanceof Array); // true
-
-
-Llamadas a súperclases con super
-
-La palabra clave super
es usada para llamar funciones del objeto padre.
-
-class Gato {
- constructor(nombre) {
- this.nombre = nombre;
- }
-
- hablar() {
- console.log(this.nombre + ' hace ruido.');
- }
-}
-
-class Leon extends Gato {
- hablar() {
- super.hablar();
- console.log(this.nombre + ' maulla.');
- }
-}
-
-Mix-ins
-
-Subclases abstractas or mix-ins son plantillas de clases. Una clase ECMAScript solo puede tener una clase padre, con lo cual la herencia multiple no es posible. La funcionalidad debe ser proporcionada por la clase padre.
-
-Una función con una clase padre como entrada y una subclase extendiendo la clase padre como salida puede ser usado para implementar mix-ins en EMCAScript:
-
-var calculatorMixin = Base => class extends Base {
- calc() { }
-};
-
-var randomizerMixin = Base => class extends Base {
- randomize() { }
-};
-
-Una clase que use este método puede ser escrita tal que así:
-
-class Foo { }
-class Bar extends calculatorMixin(randomizerMixin(Foo)) { }
-
-Especificaciones
-
-
-
-
- Specification
- Status
- Comment
-
-
- {{SpecName('ES2015', '#sec-class-definitions', 'Class definitions')}}
- {{Spec2('ES2015')}}
- Initial definition.
-
-
-
-
-Compatibilidad entre navegadores
-
-{{Compat("javascript.classes")}}
-
-Ver también
-
-
- Funciones
- {{jsxref("Statements/class", "class declaration")}}
- {{jsxref("Operators/class", "class expression")}}
- {{jsxref("Operators/super", "super")}}
-
diff --git a/files/es/web/javascript/reference/classes/index.md b/files/es/web/javascript/reference/classes/index.md
new file mode 100644
index 00000000000000..6fc24aa98bde58
--- /dev/null
+++ b/files/es/web/javascript/reference/classes/index.md
@@ -0,0 +1,338 @@
+---
+title: Clases
+slug: Web/JavaScript/Reference/Classes
+tags:
+ - Classes
+ - ECMAScript 2015
+ - Herencia
+ - Intermedio
+ - JavaScript
+ - NeedsContent
+ - NeedsTranslation
+ - Reference
+ - TopicStub
+translation_of: Web/JavaScript/Reference/Classes
+original_slug: Web/JavaScript/Referencia/Classes
+---
+{{JsSidebar("Classes")}}
+
+Las clases de javascript, introducidas en ECMAScript 2015, son una mejora sintáctica sobre la herencia basada en prototipos de JavaScript. La sintaxis de las clases **no** introduce un nuevo modelo de herencia orientada a objetos en JavaScript. Las clases de JavaScript proveen una sintaxis mucho más clara y simple para crear objetos y lidiar con la herencia.
+
+## Definiendo clases
+
+Las clases son "[funciones](/es/docs/Web/JavaScript/Reference/Functions) especiales", como las [expresiones de funciones](/es/docs/Web/JavaScript/Reference/Operators/function) y [declaraciones de funciones](/es/docs/Web/JavaScript/Reference/Statements/function), la sintaxis de una clase tiene dos componentes: [expresiones de clases](/es/docs/Web/JavaScript/Reference/Operators/class) y [declaraciones de clases](/es/docs/Web/JavaScript/Reference/Statements/class).
+
+### Declaración de clases
+
+Una manera de definir una clase es mediante una **declaración de clase**_._ Para declarar una clase, se utiliza la palabra reservada `class` y un nombre para la clase "Rectangulo".
+
+```js
+class Rectangulo {
+ constructor(alto, ancho) {
+ this.alto = alto;
+ this.ancho = ancho;
+ }
+}
+```
+
+#### Alojamiento
+
+Una importante diferencia entre las **declaraciones de funciones** y las **declaraciones de clases** es que las **declaraciones de funciones** son alojadas y las **declaraciones de clases** no lo son. En primer lugar necesitas declarar tu clase y luego acceder a ella, de otro modo el ejemplo de código siguiente arrojará un {{jsxref("ReferenceError")}}:
+
+```js example-bad
+const p = new Rectangle(); // ReferenceError
+
+class Rectangle {}
+```
+
+### Expresiones de clases
+
+Una **expresión de clase** es otra manera de definir una clase. Las expresiones de clase pueden ser nombradas o anónimas. El nombre dado a la **expresión de clase** nombrada es local dentro del cuerpo de la misma.
+
+```
+// Anonima
+let Rectangulo = class {
+ constructor(alto, ancho) {
+ this.alto = alto;
+ this.ancho = ancho;
+ }
+};
+
+console.log(Rectangulo.name);
+// output: "Rectangulo"
+
+// Nombrada
+let Rectangulo = class Rectangulo2 {
+ constructor(alto, ancho) {
+ this.alto = alto;
+ this.ancho = ancho;
+ }
+};
+console.log(Rectangulo.name);
+// output: "Rectangulo2"
+```
+
+> **Nota:** Las **expresiones** de clase están sujetas a las mismas restricciones de elevación que se describen en la sección [Class declarations](#class_declarations).
+
+## Cuerpo de la clase y definición de métodos
+
+El contenido de una **clase** es la parte que se encuentra entre las llaves `{}`. Este es el lugar se definen los **miembros de clase,** como los **métodos** o **constructores.**
+
+### Modo estricto
+
+El cuerpo de las _declaraciones de clase_ y las _expresiones de clase_ son ejecutadas en [modo estricto.](/es/docs/Web/JavaScript/Reference/Strict_mode) En otras palabras, el código escrito aquí está sujeto a una sintaxis más estricta para aumentar el rendimiento, se arrojarán algunos errores silenciosos y algunas palabras clave están reservadas para versiones futuras de ECMAScript.
+
+### Constructor
+
+El método [`constructor`](/en-US/docs/Web/JavaScript/Reference/Classes/constructor) es un método especial para crear e inicializar un objeto creado con una `clase`. Solo puede haber un método especial con el nombre "constructor" en una clase. Si esta contiene mas de una ocurrencia del método **`constructor`**, se arrojará un _Error_ {{jsxref("SyntaxError")}}
+
+Un **constructor** puede usar la _palabra reservada_ **`super`** para llamar al **constructor** de una _superclase_
+
+### Métodos prototipo
+
+Vea también [métodos definidos](/es/docs/Web/JavaScript/Reference/Functions/Method_definitions).
+
+```js
+class Rectangulo {
+ constructor (alto, ancho) {
+ this.alto = alto;
+ this.ancho = ancho;
+ }
+ // Getter
+ get area() {
+ return this.calcArea();
+ }
+ // Método
+ calcArea () {
+ return this.alto * this.ancho;
+ }
+}
+
+const cuadrado = new Rectangulo(10, 10);
+
+console.log(cuadrado.area); // 100
+```
+
+### Métodos estáticos
+
+La _palabra clave_ [`static`](/en-US/docs/Web/JavaScript/Reference/Classes/static) define un método estático para una clase. Los métodos estáticos son llamados sin instanciar su clase y **no** pueden ser llamados mediante una instancia de clase. Los métodos estáticos son a menudo usados para crear funciones de utilidad para una aplicación.
+
+```js
+class Punto {
+ constructor ( x , y ){
+ this.x = x;
+ this.y = y;
+ }
+
+ static distancia ( a , b) {
+ const dx = a.x - b.x;
+ const dy = a.y - b.y;
+
+ return Math.sqrt ( dx * dx + dy * dy );
+ }
+}
+
+const p1 = new Punto(5, 5);
+const p2 = new Punto(10, 10);
+
+console.log (Punto.distancia(p1, p2)); // 7.0710678118654755
+```
+
+### "Boxing" con prototipos y métodos estáticos
+
+Cuando un método estático o método del prototipo es llamado sin un valor para "this" (o con "this" como booleano, cadena, número, undefined o null), entonces el valor de "this" será **undefined** dentro de la funciona llamada. _Autoboxing_ no ocurrirá. El comportamiento será igual inclusive si se escribe el código en modo no estricto.
+
+```
+class Animal {
+ hablar() {
+ return this;
+ }
+ static comer() {
+ return this;
+ }
+}
+
+let obj = new Animal();
+obj.hablar(); // Animal {}
+let hablar = obj.hablar;
+hablar(); // undefined
+
+Animal.comer() // class Animal
+let comer = Animal.comer;
+comer(); // undefined
+```
+
+Si se escribe el código del cuadro superior usando clases función tradicionales, entonces autoboxing ocurrirara porque tomará valor de "this" sobre la función que es llamada.
+
+```
+function Animal() { }
+
+Animal.prototype.hablar = function(){
+ return this;
+}
+
+Animal.comer = function() {
+ return this;
+}
+
+let obj = new Animal();
+let hablar = obj.hablar;
+hablar(); // global object
+
+let hablar = Animal.hablar;
+hablar(); // global object
+```
+
+## Subclases con `extends`
+
+La palabra clave [`extends`](/en-US/docs/Web/JavaScript/Reference/Classes/extends) es usada en _declaraciones de clase_ o _expresiones de clase_ para crear una clase hija.
+
+```js
+class Animal {
+ constructor(nombre) {
+ this.nombre = nombre;
+ }
+
+ hablar() {
+ console.log(this.nombre + ' hace un ruido.');
+ }
+}
+
+class Perro extends Animal {
+ hablar() {
+ console.log(this.nombre + ' ladra.');
+ }
+}
+```
+
+También se pueden extender las clases tradicionales basadas en funciones:
+
+```js
+function Animal (nombre) {
+ this.nombre = nombre;
+}
+Animal.prototype.hablar = function () {
+ console.log(this.nombre + 'hace un ruido.');
+}
+
+class Perro extends Animal {
+ hablar() {
+ super.hablar();
+ console.log(this.nombre + ' ladra.');
+ }
+}
+
+var p = new Perro('Mitzie');
+p.hablar();
+```
+
+Fijarse que las clases no pueden extender objectos regulares (literales). Si se quiere heredar de un objecto regular, se debe user {{jsxref("Object.setPrototypeOf()")}}::
+
+```
+var Animal = {
+ hablar() {
+ console.log(this.nombre + ' hace ruido.');
+ },
+ comer() {
+ console.log(this.nombre + ' se alimenta.');
+ }
+};
+
+class Perro {
+ constructor(nombre) {
+ this.nombre = nombre;
+ }
+ hablar() {
+ console.log(this.nombre + ' ladra.');
+ }
+}
+
+// Solo adjunta los métodos aún no definidos
+Object.setPrototypeOf(Perro.prototype, Animal);
+
+var d = new Perro('Mitzie');
+d.hablar(); // Mitzie ladra.
+d.comer(); // Mitzie se alimenta.
+```
+
+## Especies
+
+Quizás se quiera devolver objetos {{jsxref("Array")}} derivados de la clase array MyArray. El patron _species_ permite sobreescribir constructores por defecto.
+
+Por ejemplo, cuando se usan metodos del tipo {{jsxref("Array.map", "map()")}} que devuelven el constructor por defecto, se quiere que esos métodos devuelvan un objeto padre Array, en vez de MyArray. El símbolo {{jsxref("Symbol.species")}} permite hacer:
+
+```js
+class MyArray extends Array {
+ // Sobreescribe species sobre el constructor padre Array
+ static get [Symbol.species]() { return Array; }
+}
+
+var a = new MyArray(1,2,3);
+var mapped = a.map(x => x * x);
+
+console.log(mapped instanceof MyArray); // false
+console.log(mapped instanceof Array); // true
+```
+
+## Llamadas a súperclases con `super`
+
+La palabra clave [`super`](/en-US/docs/Web/JavaScript/Reference/Operators/super) es usada para llamar funciones del objeto padre.
+
+```
+class Gato {
+ constructor(nombre) {
+ this.nombre = nombre;
+ }
+
+ hablar() {
+ console.log(this.nombre + ' hace ruido.');
+ }
+}
+
+class Leon extends Gato {
+ hablar() {
+ super.hablar();
+ console.log(this.nombre + ' maulla.');
+ }
+}
+```
+
+## Mix-ins
+
+Subclases abstractas or _mix-ins_ son plantillas de clases. Una clase ECMAScript solo puede tener una clase padre, con lo cual la herencia multiple no es posible. La funcionalidad debe ser proporcionada por la clase padre.
+
+Una función con una clase padre como entrada y una subclase extendiendo la clase padre como salida puede ser usado para implementar mix-ins en EMCAScript:
+
+```js
+var calculatorMixin = Base => class extends Base {
+ calc() { }
+};
+
+var randomizerMixin = Base => class extends Base {
+ randomize() { }
+};
+```
+
+Una clase que use este método puede ser escrita tal que así:
+
+```js
+class Foo { }
+class Bar extends calculatorMixin(randomizerMixin(Foo)) { }
+```
+
+## Especificaciones
+
+| Specification | Status | Comment |
+| -------------------------------------------------------------------------------------------- | ------------------------ | ------------------- |
+| {{SpecName('ES2015', '#sec-class-definitions', 'Class definitions')}} | {{Spec2('ES2015')}} | Initial definition. |
+
+## Compatibilidad entre navegadores
+
+{{Compat("javascript.classes")}}
+
+## Ver también
+
+- [Funciones](/es/docs/Web/JavaScript/Referencia/Funciones)
+- {{jsxref("Statements/class", "class declaration")}}
+- {{jsxref("Operators/class", "class expression")}}
+- {{jsxref("Operators/super", "super")}}
diff --git a/files/es/web/javascript/reference/errors/invalid_array_length/index.html b/files/es/web/javascript/reference/errors/invalid_array_length/index.html
deleted file mode 100644
index ad40fb4b5ab5a5..00000000000000
--- a/files/es/web/javascript/reference/errors/invalid_array_length/index.html
+++ /dev/null
@@ -1,78 +0,0 @@
----
-title: 'RangeError: invalid array length'
-slug: Web/JavaScript/Reference/Errors/Invalid_array_length
-tags:
- - Array
- - JavaScript
- - RangeError
- - errores
-translation_of: Web/JavaScript/Reference/Errors/Invalid_array_length
----
-{{jsSidebar("Errors")}}
-
-Mensaje
-
-RangeError: invalid array length (Firefox)
-RangeError: Invalid array length (Chrome)
-RangeError: Invalid array buffer length (Chrome)
-
-
-Tipo de error
-
-{{jsxref("RangeError")}}
-
-¿Cuál es el problema?
-
-Una longitud de array inválida puede presentarse en éstas situaciones:
-
-
- Cuando se crea un {{jsxref("Array")}} o un {{jsxref("ArrayBuffer")}} el cual tiene una longitud negativa o es igual o mayor a 232 , o
- cuando se define la propiedad {{jsxref("Array.length")}} a un valor el cual es negativo o es igual o mayor a 232 .
-
-
-¿Por qué el Array
y ArrayBuffer
tienen longitud limitada? La propiedad de longitud de un Array
o un ArrayBuffer
está representada con un entero sin signo de 32 bits, el cual sólo puede almacenar valores que estén en el rango de 0 a 232 -1.
-
-Si estás creando un Array
usando el constructor, es mejor que utilices la notación literal, ya que el primer argumento es interpretado como la longitud del Array
.
-
-De lo contrario, puedes especificar un mínimo y un máximo para la longitud antes de definir la propiedad de longitud, o puedes usarla como el argumento del constructor.
-
-Ejemplos
-
-Casos inválidos
-
-new Array(Math.pow(2, 40))
-new Array(-1)
-new ArrayBuffer(Math.pow(2, 32))
-new ArrayBuffer(-1)
-
-let a = [];
-a.length = a.length - 1; // definir la propiedad de longitud a -1
-
-let b = new Array(Math.pow(2, 32) - 1);
-b.length = b.length + 1; // definir la propiedad de longitud a 2^32
-
-
-Casos válidos
-
-[ Math.pow(2, 40) ] // [ 1099511627776 ]
-[ -1 ] // [ -1 ]
-new ArrayBuffer(Math.pow(2, 32) - 1)
-new ArrayBuffer(0)
-
-let a = [];
-a.length = Math.max(0, a.length - 1);
-
-let b = new Array(Math.pow(2, 32) - 1);
-b.length = Math.min(0xffffffff, b.length + 1);
-
-// 0xffffffff es la notación hexadecimal de 2^32 - 1
-// el cual también se puede especificar como (-1 >>> 0)
-
-
-Véase también
-
-
- {{jsxref("Array")}}
- {{jsxref("Array.length")}}
- {{jsxref("ArrayBuffer")}}
-
diff --git a/files/es/web/javascript/reference/errors/invalid_array_length/index.md b/files/es/web/javascript/reference/errors/invalid_array_length/index.md
new file mode 100644
index 00000000000000..e92d1f6ada7341
--- /dev/null
+++ b/files/es/web/javascript/reference/errors/invalid_array_length/index.md
@@ -0,0 +1,77 @@
+---
+title: 'RangeError: invalid array length'
+slug: Web/JavaScript/Reference/Errors/Invalid_array_length
+tags:
+ - Array
+ - JavaScript
+ - RangeError
+ - errores
+translation_of: Web/JavaScript/Reference/Errors/Invalid_array_length
+---
+{{jsSidebar("Errors")}}
+
+## Mensaje
+
+```
+RangeError: invalid array length (Firefox)
+RangeError: Invalid array length (Chrome)
+RangeError: Invalid array buffer length (Chrome)
+```
+
+## Tipo de error
+
+{{jsxref("RangeError")}}
+
+## ¿Cuál es el problema?
+
+Una longitud de array inválida puede presentarse en éstas situaciones:
+
+- Cuando se crea un {{jsxref("Array")}} o un {{jsxref("ArrayBuffer")}} el cual tiene una longitud negativa o es igual o mayor a 2^32, o
+- cuando se define la propiedad {{jsxref("Array.length")}} a un valor el cual es negativo o es igual o mayor a 2^32.
+
+¿Por qué el `Array` y `ArrayBuffer` tienen longitud limitada? La propiedad de longitud de un `Array` o un `ArrayBuffer` está representada con un entero sin signo de 32 bits, el cual sólo puede almacenar valores que estén en el rango de 0 a (2^32)-1.
+
+Si estás creando un `Array` usando el constructor, es mejor que utilices la notación literal, ya que el primer argumento es interpretado como la longitud del `Array`.
+
+De lo contrario, puedes especificar un mínimo y un máximo para la longitud antes de definir la propiedad de longitud, o puedes usarla como el argumento del constructor.
+
+## Ejemplos
+
+### Casos inválidos
+
+```js example-bad
+new Array(Math.pow(2, 40))
+new Array(-1)
+new ArrayBuffer(Math.pow(2, 32))
+new ArrayBuffer(-1)
+
+let a = [];
+a.length = a.length - 1; // definir la propiedad de longitud a -1
+
+let b = new Array(Math.pow(2, 32) - 1);
+b.length = b.length + 1; // definir la propiedad de longitud a 2^32
+```
+
+### Casos válidos
+
+```js example-good
+[ Math.pow(2, 40) ] // [ 1099511627776 ]
+[ -1 ] // [ -1 ]
+new ArrayBuffer(Math.pow(2, 32) - 1)
+new ArrayBuffer(0)
+
+let a = [];
+a.length = Math.max(0, a.length - 1);
+
+let b = new Array(Math.pow(2, 32) - 1);
+b.length = Math.min(0xffffffff, b.length + 1);
+
+// 0xffffffff es la notación hexadecimal de 2^32 - 1
+// el cual también se puede especificar como (-1 >>> 0)
+```
+
+## Véase también
+
+- {{jsxref("Array")}}
+- {{jsxref("Array.length")}}
+- {{jsxref("ArrayBuffer")}}
diff --git a/files/es/web/javascript/reference/errors/invalid_date/index.html b/files/es/web/javascript/reference/errors/invalid_date/index.html
deleted file mode 100644
index 819ea8d281e05e..00000000000000
--- a/files/es/web/javascript/reference/errors/invalid_date/index.html
+++ /dev/null
@@ -1,58 +0,0 @@
----
-title: 'RangeError: invalid date'
-slug: Web/JavaScript/Reference/Errors/Invalid_date
-tags:
- - ErrorDeRango
- - JavaScript
- - errores
-translation_of: Web/JavaScript/Reference/Errors/Invalid_date
----
-{{jsSidebar("Errors")}}
-
-Mensaje
-
-RangeError: invalid date (Firefox)
-RangeError: invalid time value (Chrome)
-RangeError: Provided date is not in valid range (Chrome)
-
-
-Tipo de error
-
-{{jsxref("RangeError")}}
-
-¿Cuál es el problema?Edit
-
-Se ha proporcionado una cadena con una fecha no válida para {{jsxref("Date")}} o {{jsxref("Date.parse()")}}.
-
-Ejemplos
-
-Casos no válidos
-
-
-
Las cadenas o fechas irreconocibles que contienen valores de elementos ilegales en cadenas con formato ISO suelen devolver {{jsxref("Nan")}}. Sin embargo, dependiendo de la implementación, las cadenas de formato ISO no conformes, también pueden lanzar RangeError: invalid date
, como los siguientes casos en Firefox:
-
-
-
-
-new Date('foo-bar 2014');
-new Date('2014-25-23').toISOString();
-new Date('foo-bar 2014').toString();
-
-
-Esto, sin embargo, devuelve {{jsxref("NaN")}} en Firefox:
-
-Date.parse('foo-bar 2014'); // NaN
-
-Para más información, consulte la documentación de {{jsxref("Date.parse()")}}.
-
-Casos válidos
-
-new Date('05 October 2011 14:48 UTC');
-
-Véase también
-
-
- {{jsxref("Date")}}
- {{jsxref("Date.prototype.parse()")}}
- {{jsxref("Date.prototype.toISOString()")}}
-
diff --git a/files/es/web/javascript/reference/errors/invalid_date/index.md b/files/es/web/javascript/reference/errors/invalid_date/index.md
new file mode 100644
index 00000000000000..57da979c2233ba
--- /dev/null
+++ b/files/es/web/javascript/reference/errors/invalid_date/index.md
@@ -0,0 +1,58 @@
+---
+title: 'RangeError: invalid date'
+slug: Web/JavaScript/Reference/Errors/Invalid_date
+tags:
+ - ErrorDeRango
+ - JavaScript
+ - errores
+translation_of: Web/JavaScript/Reference/Errors/Invalid_date
+---
+{{jsSidebar("Errors")}}
+
+## Mensaje
+
+```
+RangeError: invalid date (Firefox)
+RangeError: invalid time value (Chrome)
+RangeError: Provided date is not in valid range (Chrome)
+```
+
+## Tipo de error
+
+{{jsxref("RangeError")}}
+
+## ¿Cuál es el problema?[Edit](/es/docs/Web/JavaScript/Reference/Errors/Invalid_array_length$edit#¿Cuál_es_el_problema)
+
+Se ha proporcionado una cadena con una fecha no válida para {{jsxref("Date")}} o {{jsxref("Date.parse()")}}.
+
+## Ejemplos
+
+### Casos no válidos
+
+Las cadenas o fechas irreconocibles que contienen valores de elementos ilegales en cadenas con formato ISO suelen devolver {{jsxref("Nan")}}. Sin embargo, dependiendo de la implementación, las cadenas de formato ISO no conformes, también pueden lanzar `RangeError: invalid date`, como los siguientes casos en Firefox:
+
+```js example-bad
+new Date('foo-bar 2014');
+new Date('2014-25-23').toISOString();
+new Date('foo-bar 2014').toString();
+```
+
+Esto, sin embargo, devuelve {{jsxref("NaN")}} en Firefox:
+
+```js example-bad
+Date.parse('foo-bar 2014'); // NaN
+```
+
+Para más información, consulte la documentación de {{jsxref("Date.parse()")}}.
+
+### Casos válidos
+
+```js example-good
+new Date('05 October 2011 14:48 UTC');
+```
+
+## Véase también
+
+- {{jsxref("Date")}}
+- {{jsxref("Date.prototype.parse()")}}
+- {{jsxref("Date.prototype.toISOString()")}}
diff --git a/files/es/web/javascript/reference/functions/arguments/index.html b/files/es/web/javascript/reference/functions/arguments/index.html
deleted file mode 100644
index 2457bd759ea6c7..00000000000000
--- a/files/es/web/javascript/reference/functions/arguments/index.html
+++ /dev/null
@@ -1,230 +0,0 @@
----
-title: El objeto arguments
-slug: Web/JavaScript/Reference/Functions/arguments
-tags:
- - Funciones
- - JavaScript
- - Namespace
- - argumentos
- - arguments
- - espacio de nombres
- - multiples
-translation_of: Web/JavaScript/Reference/Functions/arguments
-original_slug: Web/JavaScript/Referencia/Funciones/arguments
----
-{{jsSidebar("Functions", "Funciones")}}
-
-arguments
es un objeto similar a Array
accesible dentro de funciones que contiene los valores de los argumentos pasados a esa función.
-
-{{EmbedInteractiveExample("pages/js/functions-arguments.html")}}
-
-La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si deseas contribuir al proyecto de ejemplos interactivos, clona
https://github.com/mdn/interactive-examples y envíanos una solicitud de extracción.
-
-Descripción
-
-
-
Nota : Si estás escribiendo código compatible con ES6, entonces se deben preferir los {{jsxref("Functions/rest_parameters", "parámetros resto")}}.
-
-
-
-
Nota : "similar a Array" significa que arguments
tiene una propiedad {{jsxref("Functions/arguments/length", "lenght")}} y propiedades indexadas desde cero, pero no tiene métodos integrados de {{jsxref("Array")}} como {{jsxref("Array.forEach", "forEach()")}} o {{jsxref("Array.map", "map()")}}. Ve la §Descripción para obtener más detalles.
-
-
-El objeto arguments
es una variable local disponible en todas las funciones que no son {{jsxref("Functions/Arrow_functions", "funciones flecha")}}. Puedes hacer referencia a los argumentos de una función dentro de esa función utilizando su objeto arguments
. Tiene entradas para cada argumento con el que se llamó a la función, con el índice de la primera entrada en 0
.
-
-Por ejemplo, si a una función se le pasan 3 argumentos, puedes acceder a ellos de la siguiente manera:
-
-arguments[0] // primer argumento
-arguments[1] // segundo argumento
-arguments[2] // tercer argumento
-
-
-También puedes establecer o reasignar cada argumento:
-
-arguments[1] = 'new value';
-
-
-El objeto arguments
no es un {{jsxref("Array")}}. Es similar, pero carece de todas las propiedades de Array
excepto de {{jsxref("Array.length", "length")}}. Por ejemplo, no tiene el método {{jsxref("Array.pop", "pop()")}}.
-
-Sin embargo, se puede convertir en un Array
real:
-
-var args = Array.prototype.slice.call(arguments);
-// El uso de un arreglo literal es más corto que el anterior pero asigna un arreglo vacío
-var args = [].slice.call(arguments);
-
-
-Así como puedes hacer con cualquier objeto tipo Array
, puedes usar el método {{jsxref("Array.from()")}} de ES2015 o la {{jsxref("Operators/Spread_syntax", "propagación de sintaxis")}} para convertir arguments
en un arreglo real:
-
-let args = Array.from(arguments);
-// o
-let args = [...arguments];
-
-
-El objeto arguments
es útil para funciones llamadas con más argumentos de los que declara aceptar formalmente. Esta técnica es útil para funciones a las que se les puede pasar un número variable de argumentos, como {{jsxref("Math.min()")}}. Esta función de ejemplo acepta cualquier número de argumentos de cadena y devuelve la más larga:
-
-function longestString() {
- var longest = '';
- for (var i=0; i < arguments.length; i++) {
- if (arguments[i].length > longest.length) {
- longest = arguments[i];
- }
- }
- return longest;
-}
-
-
-Puedes usar {{jsxref("Functions/arguments/lenght", "arguments.length")}} para contar con cuántos argumentos se llamó a la función. Si, en cambio, deseas contar cuántos parámetros se declara que acepta una función, inspecciona la propiedad {{jsxref("Function.length", "length")}} de esa función.
-
-Usar typeof
con arguments
-
-El operador {{jsxref("Operators/typeof", "typeof")}} devuelve 'object'
cuando se usa con arguments
-
-console.log(typeof arguments); // 'object'
-
-El tipo de argumentos individuales se puede determinar indexando arguments
:
-
-console.log(typeof arguments[0]); // devuelve el tipo del primer argumento
-
-Propiedades
-
-
- {{jsxref("Functions/arguments/callee", "arguments.callee")}}
- Referencia a la función en ejecución a la que pertenecen los argumentos. Prohibida en modo estricto.
- {{jsxref("Functions/arguments/length", "arguments.length")}}
- El número de argumentos que se pasaron a la función.
- {{jsxref("Functions/arguments/@@iterator", "arguments[@@iterator]")}}
- Devuelve un nuevo objeto {{jsxref("Array/@@iterator", "Array iterator", "", 0)}} que contiene los valores de cada índice en arguments
.
-
-
-Ejemplos
-
-Definición de una función que concatena varias cadenas
-
-Este ejemplo define una función que concatena varias cadenas. El único argumento formal de la función es una cadena que contiene los caracteres que separan los elementos a concatenar.
-
-function myConcat(separator) {
- let args = Array.prototype.slice.call(arguments, 1);
- return args.join(separator);
-}
-
-Puedes pasar tantos argumentos como desees a esta función. Devuelve una lista de cadenas usando cada argumento en la lista:
-
-// returns "red, orange, blue"
-myConcat(', ', 'red', 'orange', 'blue');
-
-// devuelve "elephant; giraffe; lion; cheetah"
-myConcat('; ', 'elephant', 'giraffe', 'lion', 'cheetah');
-
-// devuelve "sage. basil. oregano. pepper. parsley"
-myConcat('. ', 'sage', 'basil', 'oregano', 'pepper', 'parsley');
-
-Definición de una función que crea listas HTML
-
-Este ejemplo define una función que crea una cadena que contiene HTML para una lista. El único argumento formal para la función es una cadena que es "u
" si la lista debe estar {{htmlelement("ul", "desordenada (con viñetas)")}}, u "o
" si la lista es {{htmlelement("ol", "ordenada (numerada)")}}. La función se define de la siguiente manera:
-
-function list(type) {
- var html = '<' + type + 'l><li>';
- var args = Array.prototype.slice.call(arguments, 1);
- html += args.join('</li><li>');
- html += '</li></' + type + 'l>'; // fin de la lista
- return html;
-}
-
-Puedes pasar cualquier número de argumentos a esta función y agregar cada argumento como un elemento de lista a una lista del tipo indicado. Por ejemplo:
-
-let listHTML = list('u', 'One', 'Two', 'Three');
-
-/* la listHTML es:
-"<ul><li>One</li><li>Two</li><li>Three</li></ul>"
-*/
-
-Parámetros rest
, predeterminados y desestructurados
-
-
-
El objeto arguments
se puede utilizar junto con parámetros {{jsxref("Functions/rest_parameters", "rest")}}, {{jsxref("Functions/Default_parameters", "predeterminados")}} y {{jsxref("Operators/Destructuring_assignment", "desestructurados")}}.
-
-
-function foo(...args) {
- return args;
-}
-foo(1, 2, 3); // [1, 2, 3]
-
-
-Si bien la presencia de parámetros rest
, predeterminados o desestructurados no altera el comportamiento del objeto arguments
en el código de modo estricto , existen sutiles diferencias para el código no estricto.
-
-En el código de modo estricto, el objeto arguments
se comporta de la misma manera independientemente de que se pasen parámetros rest
, predeterminados o desestructurados a una función. Es decir, asignar nuevos valores a las variables en el cuerpo de la función no afectará al objeto arguments
. La asignación de nuevas variables al objeto arguments
tampoco afectará el valor de las variables.
-
-
-
Nota : No puedes escribir una directiva "use strict";
en el cuerpo de una definición de función que acepte parámetros rest
, predeterminados o desestructurados. Si lo haces, generará un {{jsxref("Errors/Strict_Non_Simple_Params", "error de sintaxis")}}.
-
-
-Las funciones no estrictas a las que se les pasan solo parámetros simples (es decir, no parámetros rest
, predeterminados o desestructurados) sincronizarán el valor de los nuevos valores de las variables en el cuerpo de la función con el objeto arguments
, y viceversa:
-
-function func(a) {
- arguments[0] = 99; // actualiza arguments[0] además actualiza a
- console.log(a);
-}
-func(10); // 99
-
-
-Y también:
-
-function func(a) {
- a = 99; // la actualización también actualiza arguments[0]
- console.log(arguments[0]);
-}
-func(10); // 99
-
-
-Por el contrario, las funciones no estrictas a las que se les pasan parámetros rest
, predeterminados o desestructurados no sincronizarán los nuevos valores asignados a las variables de los argumentos en el cuerpo de la función con el objeto arguments
. En cambio, el objeto arguments
en funciones no estrictas con parámetros complejos siempre reflejarán los valores pasados a la función cuando se invocó (este es el mismo comportamiento exhibido por todas las funciones en modo estricto, independientemente del tipo de variables que se le pasen):
-
-function func(a = 55) {
- arguments[0] = 99; // actualizar arguments[0] tampoco actualiza a
- console.log(a);
-}
-func(10); // 10
-
-Y también:
-
-function func(a = 55) {
- a = 99; // actualizar a tampoco actualiza arguments[0]
- console.log(arguments[0]);
-}
-func(10); // 10
-
-
-Y también:
-
-// Un parámetro predeterminado sin seguimiento
-function func(a = 55) {
- console.log(arguments[0]);
-}
-func(); // undefined
-
-Especificaciones
-
-
-
-
- Especificación
-
-
-
-
- {{SpecName('ESDraft', '#sec-arguments-exotic-objects', 'Objectos arguments exóticos')}}
-
-
-
-
-Compatibilidad del navegador
-
-
-
-{{Compat("javascript.functions.arguments")}}
-
-Ve también
-
-
- {{jsxref("Function", "Función")}}
- {{jsxref("Functions/rest_parameters", "Parámetros resto")}}
-
diff --git a/files/es/web/javascript/reference/functions/arguments/index.md b/files/es/web/javascript/reference/functions/arguments/index.md
new file mode 100644
index 00000000000000..33b2a9f0d5a9e6
--- /dev/null
+++ b/files/es/web/javascript/reference/functions/arguments/index.md
@@ -0,0 +1,230 @@
+---
+title: El objeto arguments
+slug: Web/JavaScript/Reference/Functions/arguments
+tags:
+ - Funciones
+ - JavaScript
+ - Namespace
+ - argumentos
+ - arguments
+ - espacio de nombres
+ - multiples
+translation_of: Web/JavaScript/Reference/Functions/arguments
+original_slug: Web/JavaScript/Referencia/Funciones/arguments
+---
+{{jsSidebar("Functions", "Funciones")}}
+
+**`arguments`** es un objeto similar a `Array` accesible dentro de [funciones](/es/docs/Web/JavaScript/Guide/Functions) que contiene los valores de los argumentos pasados a esa función.
+
+{{EmbedInteractiveExample("pages/js/functions-arguments.html")}}La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si deseas contribuir al proyecto de ejemplos interactivos, clona y envíanos una solicitud de extracción.
+
+## Descripción
+
+> **Nota:** Si estás escribiendo código compatible con ES6, entonces se deben preferir los {{jsxref("Functions/rest_parameters", "parámetros resto")}}.
+
+> **Nota:** "similar a Array" significa que `arguments` tiene una propiedad {{jsxref("Functions/arguments/length", "lenght")}} y propiedades indexadas desde cero, pero no tiene métodos integrados de {{jsxref("Array")}} como {{jsxref("Array.forEach", "forEach()")}} o {{jsxref("Array.map", "map()")}}. Ve la [§Descripción](#Descripción) para obtener más detalles.
+
+El objeto `arguments` es una variable local disponible en todas las funciones que no son {{jsxref("Functions/Arrow_functions", "funciones flecha")}}. Puedes hacer referencia a los argumentos de una función dentro de esa función utilizando su objeto `arguments`. Tiene entradas para cada argumento con el que se llamó a la función, con el índice de la primera entrada en `0`.
+
+Por ejemplo, si a una función se le pasan 3 argumentos, puedes acceder a ellos de la siguiente manera:
+
+```js
+arguments[0] // primer argumento
+arguments[1] // segundo argumento
+arguments[2] // tercer argumento
+```
+
+También puedes establecer o reasignar cada argumento:
+
+```js
+arguments[1] = 'new value';
+```
+
+El objeto `arguments` no es un {{jsxref("Array")}}. Es similar, pero carece de todas las propiedades de `Array` excepto de {{jsxref("Array.length", "length")}}. Por ejemplo, no tiene el método {{jsxref("Array.pop", "pop()")}}.
+
+Sin embargo, se puede convertir en un `Array` real:
+
+```js
+var args = Array.prototype.slice.call(arguments);
+// El uso de un arreglo literal es más corto que el anterior pero asigna un arreglo vacío
+var args = [].slice.call(arguments);
+```
+
+Así como puedes hacer con cualquier objeto tipo `Array`, puedes usar el método {{jsxref("Array.from()")}} de ES2015 o la {{jsxref("Operators/Spread_syntax", "propagación de sintaxis")}} para convertir `arguments` en un arreglo real:
+
+```js
+let args = Array.from(arguments);
+// o
+let args = [...arguments];
+```
+
+El objeto `arguments` es útil para funciones llamadas con más argumentos de los que declara aceptar formalmente. Esta técnica es útil para funciones a las que se les puede pasar un número variable de argumentos, como {{jsxref("Math.min()")}}. Esta función de ejemplo acepta cualquier número de argumentos de cadena y devuelve la más larga:
+
+```js
+function longestString() {
+ var longest = '';
+ for (var i=0; i < arguments.length; i++) {
+ if (arguments[i].length > longest.length) {
+ longest = arguments[i];
+ }
+ }
+ return longest;
+}
+```
+
+Puedes usar {{jsxref("Functions/arguments/lenght", "arguments.length")}} para contar con cuántos argumentos se llamó a la función. Si, en cambio, deseas contar cuántos parámetros se declara que acepta una función, inspecciona la propiedad {{jsxref("Function.length", "length")}} de esa función.
+
+### Usar `typeof` con `arguments`
+
+El operador {{jsxref("Operators/typeof", "typeof")}} devuelve `'object'` cuando se usa con `arguments`
+
+```js
+console.log(typeof arguments); // 'object'
+```
+
+El tipo de argumentos individuales se puede determinar indexando `arguments`:
+
+```
+console.log(typeof arguments[0]); // devuelve el tipo del primer argumento
+```
+
+## Propiedades
+
+- {{jsxref("Functions/arguments/callee", "arguments.callee")}}
+ - : Referencia a la función en ejecución a la que pertenecen los argumentos. Prohibida en modo estricto.
+- {{jsxref("Functions/arguments/length", "arguments.length")}}
+ - : El número de argumentos que se pasaron a la función.
+- {{jsxref("Functions/arguments/@@iterator", "arguments[@@iterator]")}}
+ - : Devuelve un nuevo objeto {{jsxref("Array/@@iterator", "Array iterator", "", 0)}} que contiene los valores de cada índice en `arguments`.
+
+## Ejemplos
+
+### Definición de una función que concatena varias cadenas
+
+Este ejemplo define una función que concatena varias cadenas. El único argumento formal de la función es una cadena que contiene los caracteres que separan los elementos a concatenar.
+
+```js
+function myConcat(separator) {
+ let args = Array.prototype.slice.call(arguments, 1);
+ return args.join(separator);
+}
+```
+
+Puedes pasar tantos argumentos como desees a esta función. Devuelve una lista de cadenas usando cada argumento en la lista:
+
+```js
+// returns "red, orange, blue"
+myConcat(', ', 'red', 'orange', 'blue');
+
+// devuelve "elephant; giraffe; lion; cheetah"
+myConcat('; ', 'elephant', 'giraffe', 'lion', 'cheetah');
+
+// devuelve "sage. basil. oregano. pepper. parsley"
+myConcat('. ', 'sage', 'basil', 'oregano', 'pepper', 'parsley');
+```
+
+### Definición de una función que crea listas HTML
+
+Este ejemplo define una función que crea una cadena que contiene HTML para una lista. El único argumento formal para la función es una cadena que es "`u`" si la lista debe estar {{htmlelement("ul", "desordenada (con viñetas)")}}, u "`o`" si la lista es {{htmlelement("ol", "ordenada (numerada)")}}. La función se define de la siguiente manera:
+
+```js
+function list(type) {
+ var html = '<' + type + 'l>';
+ var args = Array.prototype.slice.call(arguments, 1);
+ html += args.join(' ');
+ html += ' ' + type + 'l>'; // fin de la lista
+ return html;
+}
+```
+
+Puedes pasar cualquier número de argumentos a esta función y agregar cada argumento como un elemento de lista a una lista del tipo indicado. Por ejemplo:
+
+```js
+let listHTML = list('u', 'One', 'Two', 'Three');
+
+/* la listHTML es:
+""
+*/
+```
+
+### Parámetros `rest`, predeterminados y desestructurados
+
+El objeto `arguments` se puede utilizar junto con parámetros {{jsxref("Functions/rest_parameters", "rest")}}, {{jsxref("Functions/Default_parameters", "predeterminados")}} y {{jsxref("Operators/Destructuring_assignment", "desestructurados")}}.
+
+```js
+function foo(...args) {
+ return args;
+}
+foo(1, 2, 3); // [1, 2, 3]
+```
+
+Si bien la presencia de parámetros `rest`, predeterminados o desestructurados no altera [el comportamiento del objeto `arguments` en el código de modo estricto](/es/docs/Web/JavaScript/Reference/Strict_mode#Haciendo_eval_y_arguments_más_simples), existen sutiles diferencias para el código no estricto.
+
+En el código de modo estricto, el objeto `arguments` se comporta de la misma manera independientemente de que se pasen parámetros `rest`, predeterminados o desestructurados a una función. Es decir, asignar nuevos valores a las variables en el cuerpo de la función no afectará al objeto `arguments`. La asignación de nuevas variables al objeto `arguments` tampoco afectará el valor de las variables.
+
+> **Nota:** No puedes escribir una directiva `"use strict";` en el cuerpo de una definición de función que acepte parámetros `rest`, predeterminados o desestructurados. Si lo haces, generará un {{jsxref("Errors/Strict_Non_Simple_Params", "error de sintaxis")}}.
+
+Las funciones no estrictas a las que se les pasan solo parámetros simples (es decir, no parámetros `rest`, predeterminados o desestructurados) sincronizarán el valor de los nuevos valores de las variables en el cuerpo de la función con el objeto `arguments`, y viceversa:
+
+```js
+function func(a) {
+ arguments[0] = 99; // actualiza arguments[0] además actualiza a
+ console.log(a);
+}
+func(10); // 99
+```
+
+Y también:
+
+```js
+function func(a) {
+ a = 99; // la actualización también actualiza arguments[0]
+ console.log(arguments[0]);
+}
+func(10); // 99
+```
+
+Por el contrario, las funciones no estrictas a las que **se les pasan** parámetros `rest`, predeterminados o desestructurados **no** sincronizarán los nuevos valores asignados a las variables de los argumentos en el cuerpo de la función con el objeto `arguments`. En cambio, el objeto `arguments` en funciones no estrictas con parámetros complejos **siempre** reflejarán los valores pasados a la función cuando se invocó (este es el mismo comportamiento exhibido por todas las funciones en modo estricto, independientemente del tipo de variables que se le pasen):
+
+```js
+function func(a = 55) {
+ arguments[0] = 99; // actualizar arguments[0] tampoco actualiza a
+ console.log(a);
+}
+func(10); // 10
+```
+
+Y también:
+
+```js
+function func(a = 55) {
+ a = 99; // actualizar a tampoco actualiza arguments[0]
+ console.log(arguments[0]);
+}
+func(10); // 10
+```
+
+Y también:
+
+```js
+// Un parámetro predeterminado sin seguimiento
+function func(a = 55) {
+ console.log(arguments[0]);
+}
+func(); // undefined
+```
+
+## Especificaciones
+
+| Especificación |
+| -------------------------------------------------------------------------------------------------------------------- |
+| {{SpecName('ESDraft', '#sec-arguments-exotic-objects', 'Objectos arguments exóticos')}} |
+
+## Compatibilidad del navegador
+
+{{Compat("javascript.functions.arguments")}}
+
+## Ve también
+
+- {{jsxref("Function", "Función")}}
+- {{jsxref("Functions/rest_parameters", "Parámetros resto")}}
diff --git a/files/es/web/javascript/reference/functions/arrow_functions/index.html b/files/es/web/javascript/reference/functions/arrow_functions/index.html
deleted file mode 100644
index 43d2bbb250a53f..00000000000000
--- a/files/es/web/javascript/reference/functions/arrow_functions/index.html
+++ /dev/null
@@ -1,531 +0,0 @@
----
-title: Funciones Flecha
-slug: Web/JavaScript/Reference/Functions/Arrow_functions
-tags:
- - ECMAScript6
- - Intermedio
- - JavaScript
- - Referencia
- - función
-translation_of: Web/JavaScript/Reference/Functions/Arrow_functions
-original_slug: Web/JavaScript/Referencia/Funciones/Arrow_functions
----
-{{jsSidebar("Functions", "Funciones")}}
-
-Una expresión de función flecha es una alternativa compacta a una {{JSxRef("Operadores/function", "expresión de función")}} tradicional, pero es limitada y no se puede utilizar en todas las situaciones.
-
-Diferencias y limitaciones:
-
-
- No tiene sus propios enlaces a {{JSxRef("Operadores/this", "this")}} o {{JSxRef("Operadores/super", "super")}} y no se debe usar como {{Glossary("Method", "métodos")}}.
- No tiene {{JSxRef("Funciones/arguments", "argumentos")}} o palabras clave {{JSxRef("../Operadores/new.target", "new.target")}}.
- No apta para los métodos {{JSxRef("Objetos_globales/Function/call", "call")}}, {{JSxRef("Objetos_globales/Function/apply", "apply")}} y {{JSxRef("Objetos_globales/Function/bind", "bind")}}, que generalmente se basan en establecer un {{Glossary("Scope", "ámbito o alcance")}}
- No se puede utilizar como {{Glossary("constructor", "constructor")}}.
- No se puede utilizar {{JSxRef("Operadores/yield", "yield")}} dentro de su cuerpo.
-
-
-{{EmbedInteractiveExample("pages/js/functions-arrow.html")}}
-
-Comparación de funciones tradicionales con funciones flecha
-
-Observa, paso a paso, la descomposición de una "función tradicional" hasta la "función flecha" más simple:
- Nota : Cada paso a lo largo del camino es una "función flecha" válida
-
-// Función tradicional
-function (a){
- return a + 100;
-}
-
-// Desglose de la función flecha
-
-// 1. Elimina la palabra "function" y coloca la flecha entre el argumento y el corchete de apertura.
-(a) => {
- return a + 100;
-}
-
-// 2. Quita los corchetes del cuerpo y la palabra "return" — el return está implícito.
-(a) => a + 100;
-
-// 3. Suprime los paréntesis de los argumentos
-a => a + 100;
-
-
-
Como se muestra arriba, los { corchetes }, ( paréntesis ) y "return" son opcionales, pero pueden ser obligatorios.
-
-
-Por ejemplo, si tienes varios argumentos o ningún argumento , deberás volver a introducir paréntesis alrededor de los argumentos:
-
-// Función tradicional
-function (a, b){
- return a + b + 100;
-}
-
-// Función flecha
-(a, b) => a + b + 100;
-
-// Función tradicional (sin argumentos)
-let a = 4;
-let b = 2;
-function (){
- return a + b + 100;
-}
-
-// Función flecha (sin argumentos)
-let a = 4;
-let b = 2;
-() => a + b + 100;
-
-Del mismo modo, si el cuerpo requiere líneas de procesamiento adicionales , deberás volver a introducir los corchetes Más el "return" (las funciones flecha no adivinan mágicamente qué o cuándo quieres "volver"):
-
-// Función tradicional
-function (a, b){
- let chuck = 42;
- return a + b + chuck;
-}
-
-// Función flecha
-(a, b) => {
- let chuck = 42;
- return a + b + chuck;
-}
-
-Y finalmente, en las funciones con nombre tratamos las expresiones de flecha como variables
-
-
-
// Función tradicional
-function bob (a){
- return a + 100;
-}
-
-// Función flecha
-let bob = a => a + 100;
-
-
-
-
-
-
-Sintaxis
-
-Sintaxis básica
-
-Un parámetro. Con una expresión simple no se necesita return
:
-
-param => expression
-
-Varios parámetros requieren paréntesis. Con una expresión simple no se necesita return
:
-
-(param1, paramN) => expression
-
-Las declaraciones de varias líneas requieren corchetes y return
:
-
-param => {
- let a = 1;
- return a + b;
-}
-
-Varios parámetros requieren paréntesis. Las declaraciones de varias líneas requieren corchetes y return
:
-
-(param1, paramN) => {
- let a = 1;
- return a + b;
-}
-
-Sintaxis avanzada
-
-Para devolver una expresión de objeto literal, se requieren paréntesis alrededor de la expresión:
-
-params => ({foo: "a"}) // devuelve el objeto {foo: "a"}
-
-Los {{JSxRef("Funciones/parametros_rest", "parámetros rest")}} son compatibles:
-
-(a, b, ...r) => expression
-
-Se admiten los {{JSxRef("Funciones/Parametros_por_defecto", "parámetros predeterminados")}}:
-
-(a=400, b=20, c) => expression
-
-{{JSxRef("Operadores/Destructuring_assignment", "Desestructuración")}} dentro de los parámetros admitidos:
-
-([a, b] = [10, 20]) => a + b; // el resultado es 30
-({ a, b } = { a: 10, b: 20 }) => a + b; // resultado es 30
-
-
-Descripción
-
-Consulta también "ES6 en profundidad: funciones flecha" en hacks.mozilla.org .
-
-"this
" y funciones flecha
-
-Una de las razones por las que se introdujeron las funciones flecha fue para eliminar complejidades del ámbito ({{JSxRef("Operadores/this", "this")}}) y hacer que la ejecución de funciones sea mucho más intuitiva.
-
-
-
Si this
es un misterio para ti, consulta {{JSxRef("Operadores/this", "este documento")}} para obtener más información sobre cómo funciona this
. Para resumir, this
se refiere a la instancia. Las instancias se crean cuando se invoca la palabra clave new
. De lo contrario, this
se establecerá —de forma predeterminada— en el {{Glossary("Scope", "ámbito o alcance")}} de window.
-
-
-En las funciones tradicionales de manera predeterminada this
está en el ámbito de window
:
-
-
-
-window.age = 10; // <-- ¿me notas?
-function Person() {
- this.age = 42; // <-- ¿me notas?
- setTimeout(function () {// <-- La función tradicional se está ejecutando en el ámbito de window
- console.log("this.age", this.age); // genera "10" porque la función se ejecuta en el ámbito de window
- }, 100);
-}
-
-var p = new Person();
-
-
-
-Las funciones flecha no predeterminan this
al {{Glossary("Scope", "ámbito o alcance")}} de window
, más bien se ejecutan en el {{Glossary("Scope", "ámbito o alcance")}} en que se crean:
-
-window.age = 10; // <-- ¿me notas?
-function Person() {
- this.age = 42; // <-- ¿me notas?
- setTimeout(() => {// <-- Función flecha ejecutándose en el ámbito de "p" (una instancia de Person)
- console.log("this.age", this.age); // genera "42" porque la función se ejecuta en el ámbito de Person
- }, 100);
-}
-
-var p = new Person();
-
-
-
-En el ejemplo anterior, la función flecha no tiene su propio this
. Se utiliza el valor this
del {{Glossary("Scope", "ámbito")}} léxico adjunto; las funciones flecha siguen las reglas normales de búsqueda de variables. Entonces, mientras busca this
que no está presente en el {{Glossary("Scope", "ámbito")}} actual, una función flecha termina encontrando el this
de su {{Glossary("Scope", "ámbito")}} adjunto.
-
-Relación con el modo estricto
-
-Dado que this
proviene del contexto léxico circundante, en el {{JSxRef("Modo_estricto", "modo estricto")}} se ignoran las reglas con respecto a this
.
-
-var f = () => {
- 'use strict';
- return this;
-};
-
-f() === window; // o el objeto global
-
-Todas las demás reglas del {{JSxRef("Modo_estricto", "modo estricto")}} se aplican normalmente.
-
-
-
Nota : Comprueba las notas sobre el {{JSxRef("Modo_estricto", "modo estricto")}}.
-
-
-Funciones flecha utilizadas como métodos
-
-Como se indicó anteriormente, las expresiones de función flecha son más adecuadas para funciones que no son métodos. Observa qué sucede cuando intentas usarlas como métodos:
-
-'use strict';
-
-var obj = { // no crea un nuevo ámbito
- i: 10,
- b: () => console.log(this.i, this),
- c: function() {
- console.log(this.i, this);
- }
-}
-
-obj.b(); // imprime indefinido, Window {...} (o el objeto global)
-obj.c(); // imprime 10, Object {...}
-
-Las funciones flecha no tienen su propio this
. Otro ejemplo que involucra {{JSxRef("Object.defineProperty()")}}:
-
-'use strict';
-
-var obj = {
- a: 10
-};
-
-Object.defineProperty(obj, 'b', {
- get: () => {
- console.log(this.a, typeof this.a, this); // indefinida 'undefined' Window {...} (o el objeto global)
- return this.a + 10; // representa el objeto global 'Window', por lo tanto 'this.a' devuelve 'undefined'
- }
-});
-
-
-call
, apply
y bind
-
-Los métodos {{JSxRef("Objetos_globales/Function/call", "call")}}, {{JSxRef("Objetos_globales/Function/apply", "apply")}} y {{JSxRef("Objetos_globales/Function/bind", "bind")}} NO son adecuados para las funciones flecha, ya que fueron diseñados para permitir que los métodos se ejecuten dentro de diferentes ámbitos, porque las funciones flecha establecen "this
" según el ámbito dentro del cual se define la función flecha.
-
-Por ejemplo, {{JSxRef("Objetos_globales/Function/call", "call")}}, {{JSxRef("Objetos_globales/Function/apply", "apply")}} y {{JSxRef("Objetos_globales/Function/bind", "bind")}} funcionan como se esperaba con las funciones tradicionales, porque establecen el ámbito para cada uno de los métodos:
-
-// ----------------------
-// Ejemplo tradicional
-// ----------------------
-// Un objeto simplista con su propio "this".
-var obj = {
- num: 100
-}
-
-// Establece "num" en window para mostrar cómo NO se usa.
-window.num = 2020; // ¡Ay!
-
-// Una función tradicional simple para operar en "this"
-var add = function (a, b, c) {
- return this.num + a + b + c;
-}
-
-// call
-var result = add.call(obj, 1, 2, 3) // establece el ámbito como "obj"
-console.log(result) // resultado 106
-
-// apply
-const arr = [1, 2, 3]
-var result = add.apply(obj, arr) // establece el ámbito como "obj"
-console.log(result) // resultado 106
-
-// bind
-var result = add.bind(obj) // estable el ámbito como "obj"
-console.log(result(1, 2, 3)) // resultado 106
-
-Con las funciones flecha, dado que la función add
esencialmente se crea en el ámbito del window
(global), asumirá que this
es window.
-
-// ----------------------
-// Ejemplo de flecha
-// ----------------------
-
-// Un objeto simplista con su propio "this".
-var obj = {
- num: 100
-}
-
-// Establecer "num" en window para mostrar cómo se recoge.
-window.num = 2020; // ¡Ay!
-
-// Función flecha
-var add = (a, b, c) => this.num + a + b + c;
-
-// call
-console.log(add.call(obj, 1, 2, 3)) // resultado 2026
-
-// apply
-const arr = [1, 2, 3]
-console.log(add.apply(obj, arr)) // resultado 2026
-
-// bind
-const bound = add.bind(obj)
-console.log(bound(1, 2, 3)) // resultado 2026
-
-
-Quizás el mayor beneficio de usar las funciones flecha es con los métodos a nivel del DOM (setTimeout
, setInterval
, addEventListener
) que generalmente requieren algún tipo de cierre, llamada, aplicación o vinculación para garantizar que la función se ejecute en el ámbito adecuado.
-
-Ejemplo tradicional:
-
-var obj = {
- count : 10,
- doSomethingLater : function (){
- setTimeout(function(){ // la función se ejecuta en el ámbito de window
- this.count++;
- console.log(this.count);
- }, 300);
- }
-}
-
-obj.doSomethingLater(); // la consola imprime "NaN", porque la propiedad "count" no está en el ámbito de window.
-
-Ejemplo de flecha:
-
-var obj = {
- count : 10,
- doSomethingLater : function(){ // por supuesto, las funciones flecha no son adecuadas para métodos
- setTimeout( () => { // dado que la función flecha se creó dentro del "obj", asume el "this" del objeto
- this.count++;
- console.log(this.count);
- }, 300);
- }
-}
-
-obj.doSomethingLater();
-
-Sin enlace de arguments
-
-Las funciones flecha no tienen su propio objeto {{JSxRef("Funciones/arguments", "arguments")}}. Por tanto, en este ejemplo, arguments
simplemente es una referencia a los argumentos del ámbito adjunto:
-
-var arguments = [1, 2, 3];
-var arr = () => arguments[0];
-
-arr(); // 1
-
-function foo(n) {
- var f = () => arguments[0] + n; // Los argumentos implícitos de foo son vinculantes. arguments[0] es n
- return f();
-}
-
-foo(3); // 6
-
-En la mayoría de los casos, usar {{JSxRef("Funciones/parametros_rest", "parámetros rest")}} es una buena alternativa a usar un objeto arguments
.
-
-function foo(n) {
- var f = (...args) => args[0] + n;
- return f(10);
-}
-
-foo(1); // 11
-
-Uso del operador new
-
-Las funciones flecha no se pueden usar como constructores y arrojarán un error cuando se usen con new
.
-
-var Foo = () => {};
-var foo = new Foo(); // TypeError: Foo no es un constructor
-
-Uso de la propiedad prototype
-
-Las funciones flecha no tienen una propiedad prototype
.
-
-var Foo = () => {};
-console.log(Foo.prototype); // undefined
-
-
-Uso de la palabra clave yield
-
-La palabra clave {{JSxRef("Operadores/yield", "yield")}} no se puede utilizar en el cuerpo de una función flecha (excepto cuando está permitido dentro de las funciones anidadas dentro de ella). Como consecuencia, las funciones flecha no se pueden utilizar como generadores.
-
-Cuerpo de función
-
-Las funciones flecha pueden tener un "cuerpo conciso" o el "cuerpo de bloque" habitual.
-
-En un cuerpo conciso, solo se especifica una expresión, que se convierte en el valor de retorno implícito. En el cuerpo de un bloque, debes utilizar una instrucción return
explícita.
-
-var func = x => x * x;
-// sintaxis de cuerpo conciso, "return" implícito
-
-var func = (x, y) => { return x + y; };
-// con cuerpo de bloque, se necesita un "return" explícito
-
-
-Devolver objetos literales
-
-Ten en cuenta que devolver objetos literales utilizando la sintaxis de cuerpo conciso params => {object: literal}
no funcionará como se esperaba.
-
-var func = () => { foo: 1 };
-// ¡Llamar a func() devuelve undefined!
-
-var func = () => { foo: function() {} };
-// SyntaxError: la declaración function requiere un nombre
-
-Esto se debe a que el código entre llaves ({}) se procesa como una secuencia de declaraciones (es decir, foo
se trata como una etiqueta, no como una clave en un objeto literal).
-
-Debes envolver el objeto literal entre paréntesis:
-
-var func = () => ({ foo: 1 });
-
-Saltos de línea
-
-Una función flecha no puede contener un salto de línea entre sus parámetros y su flecha.
-
-var func = (a, b, c)
- => 1;
-// SyntaxError: expresión esperada, obtuve '=>'
-
-Sin embargo, esto se puede modificar colocando el salto de línea después de la flecha o usando paréntesis/llaves como se ve a continuación para garantizar que el código se mantenga bonito y esponjoso. También puedes poner saltos de línea entre argumentos.
-
-var func = (a, b, c) =>
- 1;
-
-var func = (a, b, c) => (
- 1
-);
-
-var func = (a, b, c) => {
- return 1
-};
-
-var func = (
- a,
- b,
- c
-) => 1;
-
-// no se lanza SyntaxError
-
-Orden de procesamiento
-
-Aunque la flecha en una función flecha no es un operador, las funciones flecha tienen reglas de procesamiento especiales que interactúan de manera diferente con {{JSxRef("Operadores/Operator_Precedence", "prioridad de operadores")}} en comparación con las funciones regulares.
-
-let callback;
-
-callback = callback || function() {}; // ok
-
-callback = callback || () => {};
-// SyntaxError: argumentos de función flecha no válidos
-
-callback = callback || (() => {}); // bien
-
-
-Ejemplos
-
-Uso básico
-
-// Una función flecha vacía devuelve undefinided
-let empty = () => {};
-
-(() => 'foobar')();
-// Devuelve "foobar"
-// (esta es una expresión de función invocada inmediatamente)
-
-var simple = a => a > 15 ? 15 : a;
-simple(16); // 15
-simple(10); // 10
-
-let max = (a, b) => a > b ? a : b;
-
-// Fácil filtrado de arreglos, mapeo, ...
-
-var arr = [5, 6, 13, 0, 1, 18, 23];
-
-var sum = arr.reduce((a, b) => a + b);
-// 66
-
-var even = arr.filter(v => v % 2 == 0);
-// [6, 0, 18]
-
-var double = arr.map(v => v * 2);
-// [10, 12, 26, 0, 2, 36, 46]
-
-// Cadenas de promesas más concisas
-promise.then(a => {
- // ...
-}).then(b => {
- // ...
-});
-
-// Funciones flecha sin parámetros que son visualmente más fáciles de procesar
-setTimeout( () => {
- console.log('sucederá antes');
- setTimeout( () => {
- // código más profundo
- console.log ('Sucederá más tarde');
- }, 1);
-}, 1);
-
-
-Especificaciones
-
-
-
-
- Especificación
-
-
- {{SpecName('ESDraft', '#sec-arrow-function-definitions', 'Definición de función flecha')}}
-
-
-
-
-Compatibilidad del navegador
-
-
-
-
-
{{Compat("javascript.functions.arrow_functions")}}
-
-
-Ve también
-
-
diff --git a/files/es/web/javascript/reference/functions/arrow_functions/index.md b/files/es/web/javascript/reference/functions/arrow_functions/index.md
new file mode 100644
index 00000000000000..ba0c2f43456696
--- /dev/null
+++ b/files/es/web/javascript/reference/functions/arrow_functions/index.md
@@ -0,0 +1,554 @@
+---
+title: Funciones Flecha
+slug: Web/JavaScript/Reference/Functions/Arrow_functions
+tags:
+ - ECMAScript6
+ - Intermedio
+ - JavaScript
+ - Referencia
+ - función
+translation_of: Web/JavaScript/Reference/Functions/Arrow_functions
+original_slug: Web/JavaScript/Referencia/Funciones/Arrow_functions
+---
+{{jsSidebar("Functions", "Funciones")}}
+
+Una **expresión de función flecha** es una alternativa compacta a una {{JSxRef("Operadores/function", "expresión de función")}} tradicional, pero es limitada y no se puede utilizar en todas las situaciones.
+
+**Diferencias y limitaciones:**
+
+- No tiene sus propios enlaces a {{JSxRef("Operadores/this", "this")}} o {{JSxRef("Operadores/super", "super")}} y no se debe usar como {{Glossary("Method", "métodos")}}.
+- No tiene {{JSxRef("Funciones/arguments", "argumentos")}} o palabras clave {{JSxRef("../Operadores/new.target", "new.target")}}.
+- No apta para los métodos {{JSxRef("Objetos_globales/Function/call", "call")}}, {{JSxRef("Objetos_globales/Function/apply", "apply")}} y {{JSxRef("Objetos_globales/Function/bind", "bind")}}, que generalmente se basan en establecer un {{Glossary("Scope", "ámbito o alcance")}}
+- No se puede utilizar como {{Glossary("constructor", "constructor")}}.
+- No se puede utilizar {{JSxRef("Operadores/yield", "yield")}} dentro de su cuerpo.
+
+{{EmbedInteractiveExample("pages/js/functions-arrow.html")}}
+
+### Comparación de funciones tradicionales con funciones flecha
+
+Observa, paso a paso, la descomposición de una "función tradicional" hasta la "función flecha" más simple:
+**Nota**: Cada paso a lo largo del camino es una "función flecha" válida
+
+```js
+// Función tradicional
+function (a){
+ return a + 100;
+}
+
+// Desglose de la función flecha
+
+// 1. Elimina la palabra "function" y coloca la flecha entre el argumento y el corchete de apertura.
+(a) => {
+ return a + 100;
+}
+
+// 2. Quita los corchetes del cuerpo y la palabra "return" — el return está implícito.
+(a) => a + 100;
+
+// 3. Suprime los paréntesis de los argumentos
+a => a + 100;
+```
+
+> **Nota:** Como se muestra arriba, los { corchetes }, ( paréntesis ) y "return" son opcionales, pero pueden ser obligatorios.
+
+Por ejemplo, si tienes **varios argumentos** o **ningún argumento**, deberás volver a introducir paréntesis alrededor de los argumentos:
+
+```js
+// Función tradicional
+function (a, b){
+ return a + b + 100;
+}
+
+// Función flecha
+(a, b) => a + b + 100;
+
+// Función tradicional (sin argumentos)
+let a = 4;
+let b = 2;
+function (){
+ return a + b + 100;
+}
+
+// Función flecha (sin argumentos)
+let a = 4;
+let b = 2;
+() => a + b + 100;
+```
+
+Del mismo modo, si el cuerpo requiere **líneas de procesamiento adicionales**, deberás volver a introducir los corchetes **Más el "return"** (las funciones flecha no adivinan mágicamente qué o cuándo quieres "volver"):
+
+```js
+// Función tradicional
+function (a, b){
+ let chuck = 42;
+ return a + b + chuck;
+}
+
+// Función flecha
+(a, b) => {
+ let chuck = 42;
+ return a + b + chuck;
+}
+```
+
+Y finalmente, en las **funciones con nombre** tratamos las expresiones de flecha como variables
+
+```js
+// Función tradicional
+function bob (a){
+ return a + 100;
+}
+
+// Función flecha
+let bob = a => a + 100;
+```
+
+## Sintaxis
+
+### Sintaxis básica
+
+Un parámetro. Con una expresión simple no se necesita `return`:
+
+```js
+param => expression
+```
+
+Varios parámetros requieren paréntesis. Con una expresión simple no se necesita `return`:
+
+```js
+(param1, paramN) => expression
+```
+
+Las declaraciones de varias líneas requieren corchetes y `return`:
+
+```js
+param => {
+ let a = 1;
+ return a + b;
+}
+```
+
+Varios parámetros requieren paréntesis. Las declaraciones de varias líneas requieren corchetes y `return`:
+
+```js
+(param1, paramN) => {
+ let a = 1;
+ return a + b;
+}
+```
+
+### Sintaxis avanzada
+
+Para devolver una expresión de objeto literal, se requieren paréntesis alrededor de la expresión:
+
+```js
+params => ({foo: "a"}) // devuelve el objeto {foo: "a"}
+```
+
+Los {{JSxRef("Funciones/parametros_rest", "parámetros rest")}} son compatibles:
+
+```js
+(a, b, ...r) => expression
+```
+
+Se admiten los {{JSxRef("Funciones/Parametros_por_defecto", "parámetros predeterminados")}}:
+
+```js
+(a=400, b=20, c) => expression
+```
+
+{{JSxRef("Operadores/Destructuring_assignment", "Desestructuración")}} dentro de los parámetros admitidos:
+
+```js
+([a, b] = [10, 20]) => a + b; // el resultado es 30
+({ a, b } = { a: 10, b: 20 }) => a + b; // resultado es 30
+```
+
+## Descripción
+
+Consulta también ["ES6 en profundidad: funciones flecha" en hacks.mozilla.org](https://hacks.mozilla.org/2015/06/es6-in-depth-arrow-functions/).
+
+### "`this`" y funciones flecha
+
+Una de las razones por las que se introdujeron las funciones flecha fue para eliminar complejidades del ámbito ({{JSxRef("Operadores/this", "this")}}) y hacer que la ejecución de funciones sea mucho más intuitiva.
+
+> **Nota:** Si `this` es un misterio para ti, consulta {{JSxRef("Operadores/this", "este documento")}} para obtener más información sobre cómo funciona `this`. Para resumir, `this` se refiere a la instancia. Las instancias se crean cuando se invoca la palabra clave `new`. De lo contrario, `this` se establecerá —de forma predeterminada— en el {{Glossary("Scope", "ámbito o alcance")}} de window.
+
+En las **funciones tradicionales** de manera predeterminada `this` está en el ámbito de `window`:
+
+```js
+window.age = 10; // <-- ¿me notas?
+function Person() {
+ this.age = 42; // <-- ¿me notas?
+ setTimeout(function () {// <-- La función tradicional se está ejecutando en el ámbito de window
+ console.log("this.age", this.age); // genera "10" porque la función se ejecuta en el ámbito de window
+ }, 100);
+}
+
+var p = new Person();
+```
+
+Las **funciones flecha** **no** predeterminan `this` al {{Glossary("Scope", "ámbito o alcance")}} de `window`, más bien se ejecutan en el {{Glossary("Scope", "ámbito o alcance")}} en que se crean:
+
+```js
+window.age = 10; // <-- ¿me notas?
+function Person() {
+ this.age = 42; // <-- ¿me notas?
+ setTimeout(() => {// <-- Función flecha ejecutándose en el ámbito de "p" (una instancia de Person)
+ console.log("this.age", this.age); // genera "42" porque la función se ejecuta en el ámbito de Person
+ }, 100);
+}
+
+var p = new Person();
+```
+
+En el ejemplo anterior, la función flecha no tiene su propio `this`. Se utiliza el valor `this` del {{Glossary("Scope", "ámbito")}} léxico adjunto; las funciones flecha siguen las reglas normales de búsqueda de variables. Entonces, mientras busca `this` que no está presente en el {{Glossary("Scope", "ámbito")}} actual, una función flecha termina encontrando el `this` de su {{Glossary("Scope", "ámbito")}} adjunto.
+
+**Relación con el modo estricto**
+
+Dado que `this` proviene del contexto léxico circundante, en el {{JSxRef("Modo_estricto", "modo estricto")}} se ignoran las reglas con respecto a `this`.
+
+```js
+var f = () => {
+ 'use strict';
+ return this;
+};
+
+f() === window; // o el objeto global
+```
+
+Todas las demás reglas del {{JSxRef("Modo_estricto", "modo estricto")}} se aplican normalmente.
+
+> **Advertencia:** Comprueba las notas sobre el {{JSxRef("Modo_estricto", "modo estricto")}}.
+
+### Funciones flecha utilizadas como métodos
+
+Como se indicó anteriormente, las expresiones de función flecha son más adecuadas para funciones que no son métodos. Observa qué sucede cuando intentas usarlas como métodos:
+
+```js
+'use strict';
+
+var obj = { // no crea un nuevo ámbito
+ i: 10,
+ b: () => console.log(this.i, this),
+ c: function() {
+ console.log(this.i, this);
+ }
+}
+
+obj.b(); // imprime indefinido, Window {...} (o el objeto global)
+obj.c(); // imprime 10, Object {...}
+```
+
+Las funciones flecha no tienen su propio `this`. Otro ejemplo que involucra {{JSxRef("Object.defineProperty()")}}:
+
+```js
+'use strict';
+
+var obj = {
+ a: 10
+};
+
+Object.defineProperty(obj, 'b', {
+ get: () => {
+ console.log(this.a, typeof this.a, this); // indefinida 'undefined' Window {...} (o el objeto global)
+ return this.a + 10; // representa el objeto global 'Window', por lo tanto 'this.a' devuelve 'undefined'
+ }
+});
+```
+
+### `call`, `apply` y `bind`
+
+Los métodos {{JSxRef("Objetos_globales/Function/call", "call")}}, {{JSxRef("Objetos_globales/Function/apply", "apply")}} y {{JSxRef("Objetos_globales/Function/bind", "bind")}} **NO son adecuados** para las funciones flecha, ya que fueron diseñados para permitir que los métodos se ejecuten dentro de diferentes ámbitos, porque **las funciones flecha establecen "`this`" según el ámbito dentro del cual se define la función flecha.**
+
+Por ejemplo, {{JSxRef("Objetos_globales/Function/call", "call")}}, {{JSxRef("Objetos_globales/Function/apply", "apply")}} y {{JSxRef("Objetos_globales/Function/bind", "bind")}} funcionan como se esperaba con las funciones tradicionales, porque establecen el ámbito para cada uno de los métodos:
+
+```js
+// ----------------------
+// Ejemplo tradicional
+// ----------------------
+// Un objeto simplista con su propio "this".
+var obj = {
+ num: 100
+}
+
+// Establece "num" en window para mostrar cómo NO se usa.
+window.num = 2020; // ¡Ay!
+
+// Una función tradicional simple para operar en "this"
+var add = function (a, b, c) {
+ return this.num + a + b + c;
+}
+
+// call
+var result = add.call(obj, 1, 2, 3) // establece el ámbito como "obj"
+console.log(result) // resultado 106
+
+// apply
+const arr = [1, 2, 3]
+var result = add.apply(obj, arr) // establece el ámbito como "obj"
+console.log(result) // resultado 106
+
+// bind
+var result = add.bind(obj) // estable el ámbito como "obj"
+console.log(result(1, 2, 3)) // resultado 106
+```
+
+Con las funciones flecha, dado que la función `add` esencialmente se crea en el ámbito del `window` (global), asumirá que `this` es window.
+
+```js
+// ----------------------
+// Ejemplo de flecha
+// ----------------------
+
+// Un objeto simplista con su propio "this".
+var obj = {
+ num: 100
+}
+
+// Establecer "num" en window para mostrar cómo se recoge.
+window.num = 2020; // ¡Ay!
+
+// Función flecha
+var add = (a, b, c) => this.num + a + b + c;
+
+// call
+console.log(add.call(obj, 1, 2, 3)) // resultado 2026
+
+// apply
+const arr = [1, 2, 3]
+console.log(add.apply(obj, arr)) // resultado 2026
+
+// bind
+const bound = add.bind(obj)
+console.log(bound(1, 2, 3)) // resultado 2026
+```
+
+Quizás el mayor beneficio de usar las funciones flecha es con los métodos a nivel del DOM (`setTimeout`, `setInterval`, `addEventListener`) que generalmente requieren algún tipo de cierre, llamada, aplicación o vinculación para garantizar que la función se ejecute en el ámbito adecuado.
+
+**Ejemplo tradicional:**
+
+```js
+var obj = {
+ count : 10,
+ doSomethingLater : function (){
+ setTimeout(function(){ // la función se ejecuta en el ámbito de window
+ this.count++;
+ console.log(this.count);
+ }, 300);
+ }
+}
+
+obj.doSomethingLater(); // la consola imprime "NaN", porque la propiedad "count" no está en el ámbito de window.
+```
+
+**Ejemplo de flecha:**
+
+```js
+var obj = {
+ count : 10,
+ doSomethingLater : function(){ // por supuesto, las funciones flecha no son adecuadas para métodos
+ setTimeout( () => { // dado que la función flecha se creó dentro del "obj", asume el "this" del objeto
+ this.count++;
+ console.log(this.count);
+ }, 300);
+ }
+}
+
+obj.doSomethingLater();
+```
+
+### Sin enlace de `arguments`
+
+Las funciones flecha no tienen su propio objeto {{JSxRef("Funciones/arguments", "arguments")}}. Por tanto, en este ejemplo, `arguments` simplemente es una referencia a los argumentos del ámbito adjunto:
+
+```js
+var arguments = [1, 2, 3];
+var arr = () => arguments[0];
+
+arr(); // 1
+
+function foo(n) {
+ var f = () => arguments[0] + n; // Los argumentos implícitos de foo son vinculantes. arguments[0] es n
+ return f();
+}
+
+foo(3); // 6
+```
+
+En la mayoría de los casos, usar {{JSxRef("Funciones/parametros_rest", "parámetros rest")}} es una buena alternativa a usar un objeto `arguments`.
+
+```js
+function foo(n) {
+ var f = (...args) => args[0] + n;
+ return f(10);
+}
+
+foo(1); // 11
+```
+
+### Uso del operador `new`
+
+Las funciones flecha no se pueden usar como constructores y arrojarán un error cuando se usen con `new`.
+
+```js
+var Foo = () => {};
+var foo = new Foo(); // TypeError: Foo no es un constructor
+```
+
+### Uso de la propiedad `prototype`
+
+Las funciones flecha no tienen una propiedad `prototype`.
+
+```js
+var Foo = () => {};
+console.log(Foo.prototype); // undefined
+```
+
+### Uso de la palabra clave `yield`
+
+La palabra clave {{JSxRef("Operadores/yield", "yield")}} no se puede utilizar en el cuerpo de una función flecha (excepto cuando está permitido dentro de las funciones anidadas dentro de ella). Como consecuencia, las funciones flecha no se pueden utilizar como generadores.
+
+### Cuerpo de función
+
+Las funciones flecha pueden tener un "cuerpo conciso" o el "cuerpo de bloque" habitual.
+
+En un cuerpo conciso, solo se especifica una expresión, que se convierte en el valor de retorno implícito. En el cuerpo de un bloque, debes utilizar una instrucción `return` explícita.
+
+```js
+var func = x => x * x;
+// sintaxis de cuerpo conciso, "return" implícito
+
+var func = (x, y) => { return x + y; };
+// con cuerpo de bloque, se necesita un "return" explícito
+```
+
+### Devolver objetos literales
+
+Ten en cuenta que devolver objetos literales utilizando la sintaxis de cuerpo conciso `params => {object: literal}` no funcionará como se esperaba.
+
+```js
+var func = () => { foo: 1 };
+// ¡Llamar a func() devuelve undefined!
+
+var func = () => { foo: function() {} };
+// SyntaxError: la declaración function requiere un nombre
+```
+
+Esto se debe a que el código entre llaves ({}) se procesa como una secuencia de declaraciones (es decir, `foo` se trata como una etiqueta, no como una clave en un objeto literal).
+
+Debes envolver el objeto literal entre paréntesis:
+
+```js
+var func = () => ({ foo: 1 });
+```
+
+### Saltos de línea
+
+Una función flecha no puede contener un salto de línea entre sus parámetros y su flecha.
+
+```js
+var func = (a, b, c)
+ => 1;
+// SyntaxError: expresión esperada, obtuve '=>'
+```
+
+Sin embargo, esto se puede modificar colocando el salto de línea después de la flecha o usando paréntesis/llaves como se ve a continuación para garantizar que el código se mantenga bonito y esponjoso. También puedes poner saltos de línea entre argumentos.
+
+```js
+var func = (a, b, c) =>
+ 1;
+
+var func = (a, b, c) => (
+ 1
+);
+
+var func = (a, b, c) => {
+ return 1
+};
+
+var func = (
+ a,
+ b,
+ c
+) => 1;
+
+// no se lanza SyntaxError
+```
+
+### Orden de procesamiento
+
+Aunque la flecha en una función flecha no es un operador, las funciones flecha tienen reglas de procesamiento especiales que interactúan de manera diferente con {{JSxRef("Operadores/Operator_Precedence", "prioridad de operadores")}} en comparación con las funciones regulares.
+
+```js
+let callback;
+
+callback = callback || function() {}; // ok
+
+callback = callback || () => {};
+// SyntaxError: argumentos de función flecha no válidos
+
+callback = callback || (() => {}); // bien
+```
+
+## Ejemplos
+
+### Uso básico
+
+```js
+// Una función flecha vacía devuelve undefinided
+let empty = () => {};
+
+(() => 'foobar')();
+// Devuelve "foobar"
+// (esta es una expresión de función invocada inmediatamente)
+
+var simple = a => a > 15 ? 15 : a;
+simple(16); // 15
+simple(10); // 10
+
+let max = (a, b) => a > b ? a : b;
+
+// Fácil filtrado de arreglos, mapeo, ...
+
+var arr = [5, 6, 13, 0, 1, 18, 23];
+
+var sum = arr.reduce((a, b) => a + b);
+// 66
+
+var even = arr.filter(v => v % 2 == 0);
+// [6, 0, 18]
+
+var double = arr.map(v => v * 2);
+// [10, 12, 26, 0, 2, 36, 46]
+
+// Cadenas de promesas más concisas
+promise.then(a => {
+ // ...
+}).then(b => {
+ // ...
+});
+
+// Funciones flecha sin parámetros que son visualmente más fáciles de procesar
+setTimeout( () => {
+ console.log('sucederá antes');
+ setTimeout( () => {
+ // código más profundo
+ console.log ('Sucederá más tarde');
+ }, 1);
+}, 1);
+```
+
+## Especificaciones
+
+| Especificación |
+| ---------------------------------------------------------------------------------------------------------------------------- |
+| {{SpecName('ESDraft', '#sec-arrow-function-definitions', 'Definición de función flecha')}} |
+
+## Compatibilidad del navegador
+
+{{Compat("javascript.functions.arrow_functions")}}
+
+## Ve también
+
+- ["ES6 en profundidad: funciones flecha" en hacks.mozilla.org](https://hacks.mozilla.org/2015/06/es6-in-depth-arrow-functions/)
diff --git a/files/es/web/javascript/reference/functions/default_parameters/index.html b/files/es/web/javascript/reference/functions/default_parameters/index.html
deleted file mode 100644
index 271c4934b0d2dd..00000000000000
--- a/files/es/web/javascript/reference/functions/default_parameters/index.html
+++ /dev/null
@@ -1,235 +0,0 @@
----
-title: Parámetros predeterminados
-slug: Web/JavaScript/Reference/Functions/Default_parameters
-tags:
- - Característica del lenguaje
- - ECMAScript 2015
- - Funciones
- - JavaScript
-translation_of: Web/JavaScript/Reference/Functions/Default_parameters
-original_slug: Web/JavaScript/Referencia/Funciones/Parametros_por_defecto
----
-{{jsSidebar("Functions", "Funciones")}}
-
-Parámetros predeterminados de función permiten que los parámetros con nombre se inicien con valores predeterminados si no se pasa ningún valor o undefined
.
-
-{{EmbedInteractiveExample("pages/js/functions-default.html")}}
-
-La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si deseas contribuir al proyecto de ejemplos interactivos, clona https://github.com/mdn/interactive-examples y envíanos una solicitud de extracción.
-
-Sintaxis
-
-function [name ]([param1 [ = defaultValue1 ][, ..., paramN [ = defaultValueN ]]]) {
- statements
-}
-
-
-Descripción
-
-En JavaScript, los parámetros de función están predeterminados en {{jsxref("undefined")}}. Sin embargo, a menudo es útil establecer un valor predeterminado diferente. Aquí es donde los parámetros predeterminados pueden ayudar.
-
-En el pasado, la estrategia general para establecer valores predeterminados era probar los valores de los parámetros en el cuerpo de la función y asignar un valor si eran undefined
.
-
-En el siguiente ejemplo, si no se proporciona ningún valor para b
cuando se llama a multiply
, el valor de b
sería undefined
al evaluar a * b
y multiply
devolvería NaN
.
-
-function multiply(a, b) {
- return a * b
-}
-
-multiply(5, 2) // 10
-multiply(5) // NaN !
-
-
-Para protegerte contra esto, usarías algo como la segunda línea, donde b
se establece en 1
si llamas a multiply
con un solo argumento:
-
-function multiply(a, b) {
- b = (typeof b !== 'undefined') ? b : 1
- return a * b
-}
-
-multiply(5, 2) // 10
-multiply(5) // 5
-
-
-Con los parámetros predeterminados en ES2015, las comprobaciones en el cuerpo de la función ya no son necesarias. Ahora, puedes asignar 1
como valor predeterminado para b
en el encabezado de la función:
-
-function multiply(a, b = 1) {
- return a * b
-}
-
-multiply(5, 2) // 10
-multiply(5) // 5
-multiply(5, undefined) // 5
-
-
-Ejemplos
-
-Pasar undefined
vs. otros valores falsos
-
-En la segunda llamada de este ejemplo, incluso si el primer argumento se establece explícitamente en undefined
(aunque no null
u otros valores {{Glossary("falsy", "falsos", "", 1)}} , el valor del argumento num
sigue siendo el predeterminado.
-
-function test(num = 1) {
- console.log(typeof num)
-}
-
-test() // 'number' (num se establece en 1)
-test(undefined) // 'number' (num se establece en 1 también)
-
-// prueba con otros valores falsos:
-test('') // 'string' (num se establece en '')
-test(null) // 'object' (num se establece en null)
-
-
-Evaluado en el momento de la llamada
-
-El argumento predeterminado se evalúa en el momento de la llamada . Entonces, a diferencia de (por ejemplo) Python, se crea un nuevo objeto cada vez que se llama a la función.
-
-function append(value, array = []) {
- array.push(value)
- return array
-}
-
-append(1) // [1]
-append(2) // [2], no [1, 2]
-
-
-Esto incluso se aplica a funciones y variables:
-
-function callSomething(thing = something()) {
- return thing
-}
-
-let numberOfTimesCalled = 0
-function something() {
- numberOfTimesCalled += 1
- return numberOfTimesCalled
-}
-
-callSomething() // 1
-callSomething() // 2
-
-
-Los parámetros anteriores están disponibles para los parámetros predeterminados posteriores
-
-Los parámetros definidos anteriormente (a la izquierda) están disponibles para los parámetros predeterminados posteriores:
-
-function greet(name, greeting, message = greeting + ' ' + name) {
- return [name, greeting, message]
-}
-
-greet('David', 'Hi') // ["David", "Hi", "Hi David"]
-greet('David', 'Hi', 'Happy Birthday!') // ["David", "Hi", "Happy Birthday!"]
-
-
-Esta funcionalidad se puede aproximar de esta manera, lo que demuestra cuántos casos extremos se manejan:
-
-function go() {
- return ':P'
-}
-
-function withDefaults(a, b = 5, c = b, d = go(), e = this,
- f = arguments, g = this.value) {
- return [a, b, c, d, e, f, g]
-}
-
-function withoutDefaults(a, b, c, d, e, f, g) {
- switch (arguments.length) {
- case 0:
- a;
- case 1:
- b = 5;
- case 2:
- c = b;
- case 3:
- d = go();
- case 4:
- e = this;
- case 5:
- f = arguments;
- case 6:
- g = this.value;
- default:
- }
- return [a, b, c, d, e, f, g];
-}
-
-withDefaults.call({value: '=^_^='});
-// [undefined, 5, 5, ":P", {value:"=^_^="}, arguments, "=^_^="]
-
-withoutDefaults.call({value: '=^_^='});
-// [undefined, 5, 5, ":P", {value:"=^_^="}, arguments, "=^_^="]
-
-
-Efectos de el ámbito
-
-Si se definen parámetros predeterminados para uno o más parámetros, se crea un segundo ámbito (registro de entorno), específicamente para los identificadores dentro de la lista de parámetros. Este ámbito es padre del ámbito creado para el cuerpo de la función.
-
-Esto significa que no se puede hacer referencia a las funciones y variables declaradas en el cuerpo de la función desde los iniciadores de parámetros de valor predeterminado; intentar hacerlo arroja un {{jsxref("ReferenceError")}} en tiempo de ejecución.
-
-También significa que las variables declaradas dentro del cuerpo de la función usando var
enmascararán los parámetros del mismo nombre, en lugar de que el comportamiento habitual de las declaraciones var
duplicadas no tenga ningún efecto.
-
-La siguiente función arrojará un ReferenceError
cuando se invoca, porque el valor del parámetro predeterminado no tiene acceso al ámbito secundario del cuerpo de la función:
-
-function f(a = go()) { // Lanza un `ReferenceError` cuando se invoca a `f`.
- function go() { return ':P' }
-}
-
-
-...y esta función imprimirá undefined
porque la variable var a
se eleva solo a la parte superior del ámbito creado para el cuerpo de la función (y no hasta el ámbito principal creado para la lista de parámetros):
-
-function f(a, b = () => console.log(a)) {
- var a = 1
- b() // Imprime `undefined`, porque los valores de los parámetros predeterminados existen en su propio ámbito
-}
-
-
-Parámetros sin valores predeterminados después de los parámetros predeterminados
-
-Los parámetros aún se establecen de izquierda a derecha, sobrescribiendo los parámetros predeterminados incluso si hay parámetros posteriores sin valores predeterminados.
-
-function f(x = 1, y) {
- return [x, y]
-}
-
-f() // [1, undefined]
-f(2) // [2, undefined]
-
-
-Parámetro desestructurado con asignación de valor predeterminado
-
-Puedes usar la asignación de valor predeterminado con la notación {{jsxref("Operators/Destructuring_assignment", "la desestructuración", "", 1)}}:
-
-function f([x, y] = [1, 2], {z: z} = {z: 3}) {
- return x + y + z
-}
-
-f() // 6
-
-Especificaciones
-
-
-
-
- Especificación
-
-
-
-
- {{SpecName('ESDraft', '#sec-function-definitions', 'Definición de Funciones')}}
-
-
-
-
-Compatibilidad del navegador
-
-
-
-
-
{{Compat("javascript.functions.default_parameters")}}
-
-
-Ve también
-
-
diff --git a/files/es/web/javascript/reference/functions/default_parameters/index.md b/files/es/web/javascript/reference/functions/default_parameters/index.md
new file mode 100644
index 00000000000000..5420f28fddabf5
--- /dev/null
+++ b/files/es/web/javascript/reference/functions/default_parameters/index.md
@@ -0,0 +1,234 @@
+---
+title: Parámetros predeterminados
+slug: Web/JavaScript/Reference/Functions/Default_parameters
+tags:
+ - Característica del lenguaje
+ - ECMAScript 2015
+ - Funciones
+ - JavaScript
+translation_of: Web/JavaScript/Reference/Functions/Default_parameters
+original_slug: Web/JavaScript/Referencia/Funciones/Parametros_por_defecto
+---
+{{jsSidebar("Functions", "Funciones")}}
+
+**Parámetros predeterminados de función** permiten que los parámetros con nombre se inicien con valores predeterminados si no se pasa ningún valor o `undefined`.
+
+{{EmbedInteractiveExample("pages/js/functions-default.html")}}
+
+La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si deseas contribuir al proyecto de ejemplos interactivos, clona y envíanos una solicitud de extracción.
+
+## Sintaxis
+
+```
+function [name]([param1[ = defaultValue1 ][, ..., paramN[ = defaultValueN ]]]) {
+ statements
+}
+```
+
+## Descripción
+
+En JavaScript, los parámetros de función están predeterminados en {{jsxref("undefined")}}. Sin embargo, a menudo es útil establecer un valor predeterminado diferente. Aquí es donde los parámetros predeterminados pueden ayudar.
+
+En el pasado, la estrategia general para establecer valores predeterminados era probar los valores de los parámetros en el cuerpo de la función y asignar un valor si eran `undefined`.
+
+En el siguiente ejemplo, si no se proporciona ningún valor para `b` cuando se llama a `multiply`, el valor de `b` sería `undefined` al evaluar `a * b` y `multiply` devolvería `NaN`.
+
+```js
+function multiply(a, b) {
+ return a * b
+}
+
+multiply(5, 2) // 10
+multiply(5) // NaN !
+```
+
+Para protegerte contra esto, usarías algo como la segunda línea, donde `b` se establece en `1` si llamas a `multiply` con un solo argumento:
+
+```js
+function multiply(a, b) {
+ b = (typeof b !== 'undefined') ? b : 1
+ return a * b
+}
+
+multiply(5, 2) // 10
+multiply(5) // 5
+```
+
+Con los parámetros predeterminados en ES2015, las comprobaciones en el cuerpo de la función ya no son necesarias. Ahora, puedes asignar `1` como valor predeterminado para `b` en el encabezado de la función:
+
+```js
+function multiply(a, b = 1) {
+ return a * b
+}
+
+multiply(5, 2) // 10
+multiply(5) // 5
+multiply(5, undefined) // 5
+```
+
+## Ejemplos
+
+### Pasar `undefined` vs. otros valores falsos
+
+En la segunda llamada de este ejemplo, incluso si el primer argumento se establece explícitamente en `undefined` (aunque no `null` u otros valores {{Glossary("falsy", "falsos", "", 1)}} , el valor del argumento `num` sigue siendo el predeterminado.
+
+```js
+function test(num = 1) {
+ console.log(typeof num)
+}
+
+test() // 'number' (num se establece en 1)
+test(undefined) // 'number' (num se establece en 1 también)
+
+// prueba con otros valores falsos:
+test('') // 'string' (num se establece en '')
+test(null) // 'object' (num se establece en null)
+```
+
+### Evaluado en el momento de la llamada
+
+El argumento predeterminado se evalúa en el _momento de la llamada_. Entonces, a diferencia de (por ejemplo) Python, se crea un nuevo objeto cada vez que se llama a la función.
+
+```js
+function append(value, array = []) {
+ array.push(value)
+ return array
+}
+
+append(1) // [1]
+append(2) // [2], no [1, 2]
+```
+
+Esto incluso se aplica a funciones y variables:
+
+```js
+function callSomething(thing = something()) {
+ return thing
+}
+
+let numberOfTimesCalled = 0
+function something() {
+ numberOfTimesCalled += 1
+ return numberOfTimesCalled
+}
+
+callSomething() // 1
+callSomething() // 2
+```
+
+### Los parámetros anteriores están disponibles para los parámetros predeterminados posteriores
+
+Los parámetros definidos anteriormente (a la izquierda) están disponibles para los parámetros predeterminados posteriores:
+
+```js
+function greet(name, greeting, message = greeting + ' ' + name) {
+ return [name, greeting, message]
+}
+
+greet('David', 'Hi') // ["David", "Hi", "Hi David"]
+greet('David', 'Hi', 'Happy Birthday!') // ["David", "Hi", "Happy Birthday!"]
+```
+
+Esta funcionalidad se puede aproximar de esta manera, lo que demuestra cuántos casos extremos se manejan:
+
+```js
+function go() {
+ return ':P'
+}
+
+function withDefaults(a, b = 5, c = b, d = go(), e = this,
+ f = arguments, g = this.value) {
+ return [a, b, c, d, e, f, g]
+}
+
+function withoutDefaults(a, b, c, d, e, f, g) {
+ switch (arguments.length) {
+ case 0:
+ a;
+ case 1:
+ b = 5;
+ case 2:
+ c = b;
+ case 3:
+ d = go();
+ case 4:
+ e = this;
+ case 5:
+ f = arguments;
+ case 6:
+ g = this.value;
+ default:
+ }
+ return [a, b, c, d, e, f, g];
+}
+
+withDefaults.call({value: '=^_^='});
+// [undefined, 5, 5, ":P", {value:"=^_^="}, arguments, "=^_^="]
+
+withoutDefaults.call({value: '=^_^='});
+// [undefined, 5, 5, ":P", {value:"=^_^="}, arguments, "=^_^="]
+```
+
+### Efectos de el ámbito
+
+Si se definen parámetros predeterminados para uno o más parámetros, se crea un [segundo ámbito](https://tc39.es/ecma262/#sec-functiondeclarationinstantiation) (registro de entorno), específicamente para los identificadores dentro de la lista de parámetros. Este ámbito es padre del ámbito creado para el cuerpo de la función.
+
+Esto significa que no se puede hacer referencia a las funciones y variables declaradas en el cuerpo de la función desde los iniciadores de parámetros de valor predeterminado; intentar hacerlo arroja un {{jsxref("ReferenceError")}} en tiempo de ejecución.
+
+También significa que las variables declaradas dentro del cuerpo de la función usando `var` enmascararán los parámetros del mismo nombre, en lugar de que el comportamiento habitual de las declaraciones `var` duplicadas no tenga ningún efecto.
+
+La siguiente función arrojará un `ReferenceError` cuando se invoca, porque el valor del parámetro predeterminado no tiene acceso al ámbito secundario del cuerpo de la función:
+
+```js example-bad
+function f(a = go()) { // Lanza un `ReferenceError` cuando se invoca a `f`.
+ function go() { return ':P' }
+}
+```
+
+...y esta función imprimirá `undefined` porque la variable `var a` se eleva solo a la parte superior del ámbito creado para el cuerpo de la función (y no hasta el ámbito principal creado para la lista de parámetros):
+
+```js example-bad
+function f(a, b = () => console.log(a)) {
+ var a = 1
+ b() // Imprime `undefined`, porque los valores de los parámetros predeterminados existen en su propio ámbito
+}
+```
+
+### Parámetros sin valores predeterminados después de los parámetros predeterminados
+
+Los parámetros aún se establecen de izquierda a derecha, sobrescribiendo los parámetros predeterminados incluso si hay parámetros posteriores sin valores predeterminados.
+
+```js
+function f(x = 1, y) {
+ return [x, y]
+}
+
+f() // [1, undefined]
+f(2) // [2, undefined]
+```
+
+### Parámetro desestructurado con asignación de valor predeterminado
+
+Puedes usar la asignación de valor predeterminado con la notación {{jsxref("Operators/Destructuring_assignment", "la desestructuración", "", 1)}}:
+
+```js
+function f([x, y] = [1, 2], {z: z} = {z: 3}) {
+ return x + y + z
+}
+
+f() // 6
+```
+
+## Especificaciones
+
+| Especificación |
+| ------------------------------------------------------------------------------------------------------------ |
+| {{SpecName('ESDraft', '#sec-function-definitions', 'Definición de Funciones')}} |
+
+## Compatibilidad del navegador
+
+{{Compat("javascript.functions.default_parameters")}}
+
+## Ve también
+
+- [Propuesta original en ecmascript.org](http://wiki.ecmascript.org/doku.php?id=harmony:parameter_default_values)
diff --git a/files/es/web/javascript/reference/functions/index.html b/files/es/web/javascript/reference/functions/index.html
deleted file mode 100644
index 794caabebbf041..00000000000000
--- a/files/es/web/javascript/reference/functions/index.html
+++ /dev/null
@@ -1,662 +0,0 @@
----
-title: Funciones
-slug: Web/JavaScript/Reference/Functions
-tags:
- - Funciones
- - Guia(2)
- - JavaScript
- - función
-translation_of: Web/JavaScript/Reference/Functions
-original_slug: Web/JavaScript/Referencia/Funciones
----
-{{jsSidebar("Functions")}}
-
-En términos generales, una función es un "subprograma" que puede ser llamado por código externo (o interno en caso de recursión) a la función. Al igual que el programa en sí mismo, una función se compone de una secuencia de declaraciones, que conforman el llamado cuerpo de la función . Se pueden pasar valores a una función, y la función puede devolver un valor.
-
-En JavaScript, las funciones son objetos de primera clase, es decir, son objetos y se pueden manipular y transmitir al igual que cualquier otro objeto. Concretamente son objetos {{jsxref("Function")}}.
-
-General
-
-Toda función en JavaScript es un objeto Function. Ver {{jsxref("Function")}} para obtener información sobre las propiedades y métodos de los objetos Function
.
-
-Las funciones no son lo mismo que los procedimientos. Una función siempre devuelve un valor, pero un procedimiento, puede o no puede devolver un valor.
-
-Para devolver un valor especifico distinto del predeterminado, una función debe tener una sentencia {{jsxref("Sentencias/return", "return")}}, que especifique el valor a devolver. Una función sin una instrucción return devolverá el valor predeterminado. En el caso de un {{jsxref("Object.prototype.constructor", "constructor")}} llamado con la palabra clave {{jsxref("new")}}, el valor predeterminado es el valor de su parametro. Para el resto de funciones, el valor predeterminado es undefined.
-
-Los parámetros en la llamada a una función son los argumentos de la función. Los argumentos se pasan a las funciones por valor . Si la función cambia el valor de un argumento, este cambio no se refleja globalmente ni en la llamada de la función. Sin embargo, las referencias a objetos también son valores, y son especiales: si la función cambia las propiedades del objeto referenciado, ese cambio es visible fuera de la función, tal y como se muestra en el siguiente ejemplo:
-
-
- function myFunc(elobjeto )
- {
- elobjeto.marca = "Toyota" ;
- }
-
-
- var mycar = {
- marca: "Honda" ,
- modelo: "Accord" ,
- año: 1998
- } ;
-
-
- window. alert( mycar.marca ) ;
-
-
- myFunc( mycar) ;
-
-
- window. alert( mycar.marca ) ;
-
-La palabra clave this
no hace referencia a la función que está ejecutandose actualmente, por lo que debes referirte a los objetos Function por nombre, incluso dentro del cuerpo de la función. Como alternativa, puedes utilizar la propiedad arguments.callee (que no se recomienda).
-
-Definiendo funciones
-
-Hay varias formas de definir funciones:
-
-Declaración de una función (La instrucción function
)
-
-Hay una sintaxis especial para declarar funciones (ver la instrucción {{jsxref("Sentencias/function","function")}} para más detalles):
-
-function nombre([param [,param [, ...param ]]]) {
- instrucciones
-}
-
-
-
- nombre
- El nombre de la función.
-
-
-
- param
- El nombre de un argumento que se pasará a la función. Una función puede tener hasta 255 argumentos.
-
-
-
- instrucciones
- Las instruciones que forman el cuerpo de la función.
-
-
-Expresión de una función (El operador function
)
-
-Una expresión function es similar y tiene la misma sintaxis que una declaración de función (ver operador {{jsxref("Operadores/function", "function")}} para más detalles):
-
-function [nombre]([param [, param [, ...param ]]]) {
- instrucciones
-}
-
-
-
- nombre
- El nombre de la función, se puede omitir, en ese caso la función se conoce como función anónima.
-
-
-
- param
- El nombre de los argumentos que se pasarán a la función. Una función puede tener hasta 255 argumentos.
-
-
-
- instrucciones
- Las instrucciones que forman el cuerpo de la función.
-
-
-La expresión de función flecha (=>)
-
-
-
Nota: Las expresiones de función Flecha son una tecnología experimental, parte de la proposición Harmony (EcmaScript 6) y no son ampliamente implementadas por los navegadores.
-
-
-Una expresión de función flecha tiene una sintaxis más corta y su léxico se une a este valor (ver {{jsxref("Funciones/Arrow_functions", "arrow functions", "", 1)}} para más detalles):
-
-([param] [, param]) => { instrucciones }
-
-param => expresión
-
-
-
- param
- El nombre de un argumento. Si no hay argumentos se tiene que indicar con ()
. Para un único argumento no son necesarios los parentesis. (como foo => 1
)
- instrucciones o expresión
- Multiples instrucciones deben ser encerradas entre llaves. Una única expresión no necesita llaves. La expresión es, así mismo, el valor de retorno implícito de esa función.
-
-
-El constructor Function
-
-Como todos los demás objetos, los objetos {{jsxref("Function")}} se pueden crear mediante el operador new:
-
-new Function (arg1 , arg2 , ... argN , functionBody )
-
-
-
- arg1, arg2, ... argN
- Ningún o varios argumentos son pasados para ser utilizados por la función como nombres de argumentos formales. Cada uno debe ser una cadena que se ajuste a las reglas de identificadores válidos en JavaScript, o a una lista de este tipo de cadenas separadas por comas; por ejemplo "x", "theValue", o "a,b".
-
-
-
- Cuerpo de la función
- Una cadena conteniendo las instrucciones JavaScript que comprenden la definición de la función.
-
-
-Llamar al contructor Function como una función, sin el operador new, tiene el mismo efecto que llamarlo como un constructor.
-
-Nota: Utilizar el constructor Function no se recomienda, ya que necesita el cuerpo de la función como una cadena, lo cual puede ocasionar que no se optimize correctamente por el motor JS, y puede también causar otros problemas.
-
-El objeto arguments
-
-Puedes referirte a los argumentos de una función dentro de la misma, utilizando el objeto arguments. Ver {{jsxref("Functiones/argument", "Function")}}.
-
-Ámbito de ejecución y pila de funciones
-
-
-
-Repaso
-
-Una función puede referirse y llamarse a sí misma. Hay tres maneras en la que una función puede referirse a sí misma.
-
-
- El nombre de la función
- {{jsxref("arguments.callee")}}
- una función dentro del ambito de ejecución que refiere a la función
-
-
-Por ejemplo, considere la siguiente definición de función:
-
-var foo = function bar() {
- // el cuerpo va aqui
-};
-
-
-Dentro del cuerpo de la función, todo lo siguientes son lo mismo:
-
-
- bar()
- arguments.callee()
- foo()
-
-
-Una función que se llama a sí misma es llamada una función recursiva. En algunas ocaciones, la recursión es análoga a un bucle. Ambos ejecutan el mismo código múltiples veces, y ambas requieren una condición (para evitar un bucle infinito, o en su lugar, recursión infinita en este caso). Por ejemplo, el siguiente bucle:
-
-var x = 0;
-while (x < 10) { // "x < 10" es la condición
- // haz algo
- x++;
-}
-
-
-puede ser convertida en una función recursiva y una llamada a esa función:
-
-function loop(x) {
- if (x >= 10) // "x >= 10" es la condición de salida (equivalente a "!(x < 10)")
- return;
- // haz algo
- loop(x + 1); // la llamada recursiva
-}
-loop(0);
-
-
-Sin embargo, algunos algoritmos no pueden ser bucles iterativos simples. Por ejemplo, obtener todos los nodos de una estructura de arbol (e.g. el DOM ) es realizado de manera más fácil usando recursión:
-
-function recorrerArbol ( nodo) {
- if ( nodo == null ) return ;
- for ( var i = 0 ; i < nodo. nodosHijos. length; i++ ) {
- recorrerArbol( nodo.nodosHijos [ i] ) ;
- }
-}
-
-
-En comparación con el bucle de la función loop
, cada llamada recursiva hace muchas llamadas recursivas aquí.
-
-Es posible convertir cualquier algoritmo recursivo en uno no recursivo, pero a menudo la lógica es mucho más compleja y hacerlo requiere el uso de una pila. De hecho, la recursión utiliza una pila: la pila de funciones.
-
-El comportamiento similar a la pila se puede ver en el ejemplo siguiente:
-
-function foo( i) {
- if ( i < 0 )
- return ;
- document. writeln( 'inicio:' + i) ;
- foo( i - 1 ) ;
- document. writeln( 'fin:' + i) ;
-}
-foo( 3 ) ;
-
-que produce:
-
-inicio:3
-inicio:2
-inicio:1
-inicio:0
-fin:0
-fin:1
-fin:2
-fin:3
-
-
-Funciones anidadas y cierres
-
-Puede anidar una función dentro de una función. La función anidada (inner) es privada a la función que la contiene (outer). También con la forma: aclosure.
-
-
- Un cierre es una expresión (normalmente una función) que puede tener variables libres junto con un entorno que enlaza esas variables (que "cierra" la expresión).
- Dado que una función anidada es un cierre, esto significa que una función anidada puede "heredar" los argumentos y las variables de su función contenedora. En otras palabras, la función interna contiene el ámbito de la función externa.
-
-
-Desde que la función anidada es un cierre (closure), esto significa que una función anidada puede "heredar" los argumentos y variables de su función contenedora. En otras palabras, la función interna contiene un scope (alcance) de la función externa.
-
-Para resumir:
-
-
- La función interna se puede acceder sólo a partir de sentencias en la función externa.
-
-
-
- La función interna forma un cierre: la función interna puede utilizar los argumentos y las variables de la función externa, mientras que la función externa no puede utilizar los argumentos y las variables de la función interna.
-
-
-El ejemplo siguiente muestra funciones anidadas:
-
-function addCuadrado(a,b) {
- function cuadrado(x) {
- return x * x;
- }
- return cuadrado(a) + cuadrado(b);
-}
-a = addCuadrado(2,3); // retorna 13
-b = addCuadrado(3,4); // retorna 25
-c = addCuadrado(4,5); // retorna 41
-
-
-Dado que la función interna forma un cierre, puede llamar a la función externa y especificar argumentos para la función externa e interna
-
-function fuerade(x) {
- function dentro(y) {
- return x + y;
- }
- return dentro;
-}
-resultado = fuerade(3)(5); // retorna 8
-
-
-Consideraciones sobre la eficiencia
-
-Observe cómo se conserva x
cuando se devuelve dentro . Un cierre conserva los argumentos y las variables en todos los ámbitos que contiene. Puesto que cada llamada proporciona argumentos potencialmente diferentes, debe crearse un cierre para cada llamada a la función externa. En otras palabras, cada llamada a fuerade
crea un cierre. Por esta razón, los cierres pueden usar una gran cantidad de memoria. La memoria se puede liberar sólo cuando el dentro
devuelto ya no es accesible. En este caso, el cierre del dentro
se almacena en resultado
. Como el resultado
está en el ámbito global, el cierre permanecerá hasta que se descargue el script (en un navegador, esto sucedería cuando la página que contiene el script esté cerrada).
-
-Debido a esta ineficiencia, evite cierres siempre que sea posible, es decir, evite las funciones de anidamiento siempre que sea posible. Por ejemplo, considere el siguiente ejemplo:
-
-function assignOnclick(elemento) {
- element.onclick = function() {
- this.style.backgroundColor = 'blue';
- };
-}
-
-
-Esto se puede volver a escribir para evitar el cierre. Sin embargo, la función interna anónima necesitaría ser nombrada y ya no sería privada para assignOnclick
:
-
-function assignOnclick(elemento) {
- elemento.onclick = elemento_onclick;
-}
-
-function elemento_onclick() {
- this.style.backgroundColor = 'blue';
-}
-
-
-Multiples funciones anidadas
-
-Las funciones pueden ser anidadas contigua de la otra, es decir, una función (A) que contiene una función (B) que contiene una función (C), etc. Ambas funciones B y C forman cierres aquí, por lo que B puede acceder a A y C pueden acceder a B. Además, como C puede acceder a B, que puede acceder a A, C también puede acceder a A. Por lo tanto, los cierres pueden contener múltiples ámbitos; contienen recursivamente el alcance de las funciones que lo contienen. Esto es llamado encadenamiento de objetos(scope chaining ). (Por qué se llama "chaining "("encadenamiento") se explicará más adelante.)
-
-Considere el siguiente ejemplo:
-
-function A(x) {
- function B(y) {
- function C(z) {
- alert(x + y + z);
- }
- C(3);
- }
- B(2);
-}
-A(1); // alerts 6 (1 + 2 + 3)
-
-
-En este ejemplo, C
accede a las B
que hayan en y
y A
en x
. Esto se puede hacer porque:
-
-
- B
forma un cierre que incluye a A
, es decir, B
puede acceder a los argumentos y variables de A
.
- C
forma un cierre que incluye a B
.
- Como el cierre de B
incluye a A
, el cierre de C
incluye a A
, C
puede acceder a los argumentos y variables de la Banda A
. En otras palabras, codifica los ámbitos de B
y A en ese orden.
-
-
-Lo contrario, sin embargo, no es cierto. A
no puede acceder a C
, porque A
no puede acceder a ningún argumento o variable de B
, que C
es una variable de. Así, C
permanece privado de sólo B
.
-
-Conflictos de nombre
-
-Cuando dos argumentos o variables en los ámbitos de un cierre tienen el mismo nombre, existe un conflicto de nombres("name conflict "). Más alcances internos tienen prioridad, por lo que el alcance más interno tiene la más alta precedencia, mientras que el alcance más externo toma el más bajo. Esta es la cadena de alcance. El primero en la cadena es el alcance más interno, y el último es el alcance más exterior. Considera lo siguiente:
-
-function fuerade() {
- var x = 10;
- function dentro(x) {
- return x;
- }
- return dentro;
-}
-resultado = fuerade()(20); // retorna 20 en lugar de 10
-
-
-El conflicto de nombres ocurre en la sentencia return x
y está entre el parámetro x
del dentro
y la variable x
del fuerade
. La cadena de alcance aquí es {dentro
, fuerade
, global object}. Por lo tanto, la x
de inside
tiene precedentes sobre la x
de fuerade
, y 20 (dentro
de x
) se devuelve en lugar de 10 (fuerade
de x
).
-
-Constructor vs declaración vs expresión
-
-Las diferencias entre la Function
constructora, la de declaración y la de expresión.
-
-Compare lo siguiente:
-
-
- Una función definida con el constructor Function
asignado a la variable multiply
-
- var multiply = new Function("x", "y", "return x * y;");
-
-
- Una declaración de una función denominada multiply
- function multiply(x, y) {
- return x * y;
-}
-
-
- Una expresión de función anónima asignada a la variable multiply
- var multiply = function(x, y) {
- return x * y;
-}
-
-
- Una declaración de una función denominada func_name
asignada a la variable multiply
- var multiply = function func_name(x, y) {
- return x * y;
-}
-
-
-
-
-Todos hacen aproximadamente la misma cosa, con algunas diferencias sutiles:
-
-
- Existe una distinción entre el nombre de la función y la variable a la que se asigna la función:
-
-
- El nombre de la función no se puede cambiar, mientras que la variable a la que se asigna la función puede ser reasignada.
- El nombre de la función sólo se puede utilizar en el cuerpo de la función. Intentar utilizarlo fuera del cuerpo de la función da como resultado un error (o undefined
si el nombre de la función se declaró previamente mediante una instrucción var
). Por ejemplo:
- var y = function x() {};
-alert(x); // arroja un error
-
-
- El nombre de la función también aparece cuando la función se serializa vía el método de la Function
'toString'.
-
- Por otro lado, la variable a la que se asigna la función está limitada sólo por su ámbito, que está garantizado para incluir el ámbito en el que se declara la función.
-
- Como muestra el ejemplo 4, el nombre de la función puede ser diferente de la variable a la que se asigna la función. No tienen relación entre sí.
-
-
- Una declaración de función también crea una variable con el mismo nombre que el nombre de la función. Por lo tanto, a diferencia de las definidas por las expresiones de función, las funciones definidas por las declaraciones de función se puede acceder por su nombre en el ámbito que se definieron en:
- function x() {}
-alert(x); // salida x serializado en un string
-
-
- El siguiente ejemplo muestra cómo los nombres de las funciones no están relacionados con las variables a las que están asignadas las funciones. Si una "variable de función" se asigna a otro valor, seguirá teniendo el mismo nombre de función:
-
- function foo() {}
-alert(foo); // el string alterado contiene el nombre
- // de la función "foo"
-var bar = foo;
-alert(bar); // el string todavía contiene el nombre
- // de la función "foo"
-
-
- Una función definida por unFunction
no tiene un nombre de función. Sin embargo, en el SpiderMonkey en el motor de JavaScript, la forma serializada de la función muestra como si tuviera el nombre "anónimo"("anonymous"). Por ejemplo, alert(new Function())
salida:
- function anonymous() {
-}
-
-
- Dado que la función en realidad no tiene un nombre, anonymous
no es una variable que se puede acceder dentro de la función. Por ejemplo, lo siguiente resultaría en un error:
-
- var foo = new Function("alert(anonymous);");
-foo();
-
-
- A diferencia de las funciones definidas por expresiones de función o constructores Function
se puede utilizar una función definida por una declaración de función antes de la propia declaración de la función. Por ejemplo:
- foo(); // alerts FOO!
-function foo() {
- alert('FOO!');
-}
-
-
- Una función definida por una expresión de función hereda el ámbito actual. Es decir, la función forma un cierre. Por otro lado, una función definida por un constructor de Function
no hereda ningún ámbito que no sea el ámbito global (que todas las funciones heredan).
- Las funciones definidas por expresiones de función y declaraciones de función son analizadas una sola vez, mientras que las definidas por el constructor de Function
no lo son. Es decir, la cadena de cuerpo de función pasada al constructor de Function
debe ser analizada cada vez que se evalúa. Aunque una expresión de función crea un cierre cada vez, el cuerpo de la función no es reparsed, por lo que las expresiones de función son aún más rápido que "new Function(...)
". Por lo tanto, el constructor de la Function
debe evitarse siempre que sea posible.
-
-
-Una declaración de función es muy fácilmente (ya menudo involuntariamente) convertida en una expresión de función. Una declaración de función deja de ser una cuando:
-
-
-
-Ejemplos:
-
-
-
- // function declaración
-function foo() {}
-
-// expresión de una función
-(function bar() {})
-
-// expresión de una función
-x = function hello() {}
-
-
-
- if (x) {
- // expresión de la función
- function world() {}
-}
-
-
-
- // instrucción de la función
-function a() {
- // instrucción de la función
- function b() {}
- if (0) {
- // expresión de la función
- function c() {}
- }
-}
-
-
-
-
-Definición condicional de una función
-
-Las funciones se pueden definir de forma condicional utilizando expresiones de función o el constructor Function
.
-
-En la siguiente secuencia de comandos, la función zero
nunca se define y no se puede invocar, porque 'if (0)
' se evalúa como false:
-
-if (0)
- function zero() {
- document.writeln("Esto es zero.");
- }
-
-
-Si se cambia el script para que la condición se convierta en 'if (1)
', se define la función zero
.
-
-
-
-
-
Nota: Algunos motores JavaScript, sin incluir SpiderMonkey , tratan incorrectamente cualquier expresión de función con un nombre como una declaración de función. Esto llevaría a que se definiera zero
incluso con el siempre-falso("always-false ") condicional. Una manera más segura de definir funciones condicionalmente es definir la función anónimamente y asignarla a una variable:
-
-
-if (0)
- var zero = function() {
- document.writeln("Esto es zero.");
- }
-
-
-Funciones como manejadores de eventos
-
-En JavaScript, los controladores de eventos DOM son funciones (en oposición a los objetos que contienen un método handleEvent
en otros enlaces de idioma DOM). Las funciones se pasan un objeto de evento como el primer y único parámetro. Como cualquier otro parámetro, si el objeto de evento no necesita ser utilizado, puede omitirse en la lista de parámetros formales.
-
-Los posibles objetivos de eventos en un documento HTML incluyen: window
(Window
objects("objeto de ventana"), including frames("marcos")), document
(HTMLDocument
objects("objetos HTMLDocument")), y elementos (Element
objects("objetos Elemento")). En el HTML DOM , los destinos de evento tienen propiedades de controlador de eventos. Estas propiedades son nombres de eventos en minúsculas con prefijo "on", e.g. onfocus
. Los eventos DOM Level 2 Events proporcionan una forma alternativa y más sólida de agregar oyentes de eventos.
-
-
-
Nota: Los eventos son parte del DOM, no de JavaScript. (JavaScript simplemente proporciona un enlace al DOM.)
-
-
-El ejemplo siguiente asigna una función a un manejador de eventos de "foco"("focus") de ventana.
-
-window.onfocus = function() {
- document.body.style.backgroundColor = 'white';
-}
-
-
-Si se asigna una función a una variable, puede asignar la variable a un controlador de eventos. El siguiente código asigna una función a la variable setBGColor
.
-
-var setBGColor = new Function("document.body.style.backgroundColor = 'white';");
-
-
-Puede utilizar esta variable para asignar una función a un controlador de eventos de varias maneras. Aquí hay dos formas:
-
-
- Escritura con propiedades de evento DOM HTML
-
- document.form1.colorButton.onclick = setBGColor;
-
-
- Atributo de evento HTML
-
- <input name="colorBoton" type="button"
- value="Cambia color de fondo"
- onclick="setBGColor();"/>
-
-
- Un manejador de eventos establecido de esta manera es en realidad una función, denominada después del atributo, envuelta alrededor del código especificado. Esta es la razón por la que los paréntesis en "setBGColor()
" son necesarios aquí (en lugar de sólo "setBGColor
").
-
-
-
-Es equivalente a:
-
-document.form1.colorButton.onclick = function onclick(event) {
- setBGColor();
-}
-
-
-Observe cómo se pasa el objeto de evento a esta función anónima como event
de parámetro. Esto permite que el código especificado utilice el objeto Evento("Event object)":
-
-<input ...
- onclick="alert(event.target.tagName);"/>
-
-
-Al igual que cualquier otra propiedad que se refiere a una función, el controlador de eventos puede actuar como un método, y this
se refiere al elemento que contiene el controlador de eventos. En el ejemplo siguiente, se llama a la función referida por onfocus
con this
igual a window
.
-
-window.onfocus();
-
-
-Un error común de principiante de JavaScript es el añadir paréntesis y / o parámetros al final de la variable, es decir, llamar al manejador de eventos cuando lo asigna. La adición de estos paréntesis asignará el valor devuelto al llamar al manejador de eventos , que a menudo es undefined
(si la función no devuelve nada), en lugar del controlador de eventos en sí:
-
-document.form1.button1.onclick = setBGColor();
-
-
-Para pasar parámetros a un manejador de eventos, el manejador debe ser envuelto en otra función de la siguiente manera:
-
-document.form1.button1.onclick = function() {
- setBGColor('Algun valor');
-};
-
-
-Compatibilidad con versiones anteriores
-
-JavaScript 1.1 y anteriores
-
-No puede anidar una sentencia de función en otra instrucción o en sí misma.
-
-Variables locales dentro de las funciones
-
-arguments : Objeto similar a una matriz que contiene los argumentos pasados a la función en ejecución.
-
-arguments.callee : Especifica la función en ejecución.
-
-arguments.caller : Especifica la función que invocó la función en ejecución.
-
-arguments.length : Especifica el número de argumentos pasados a la función.
-
-Ejemplos
-
-
-
-La siguiente función devuelve una cadena que contiene la representación formateada de un número rellenado con ceros a la izquierda.
-
-// Esta función devuelve una cadena rellenada con ceros a la izquierda
-
-function padZeros(num, totalLen) {
- var numStr = num.toString(); // Inicializa un valor de retorno como cadena
- var numZeros = totalLen - numStr.length; // Calcula el no. de ceros
- for (var i = 1; i <= numZeros; i++) {
- numStr = "0" + numStr;
- }
- return numStr;
-}
-
-
-Las siguientes sentencias llaman a la función padZeros.
-
-var resultado;
-resultado = padZeros(42,4); // retorna "0042"
-resultado = padZeros(42,2); // retorna "42"
-resultado = padZeros(5,4); // retorna "0005"
-
-
-2) Determinar si existe una función
-
-Puede determinar si existe una función utilizando el operador typeof
. En el ejemplo siguiente, se realiza una prueba para determinar si el objeto window
tiene una propiedad llamada noFunc
que es una función. Si es así, se utiliza; de lo contrario, se tomarán otras medidas.
-
- if ('function' == typeof window.noFunc) {
- // utiliza noFunc()
- } else {
- // hacer algo mas
- }
-
-
-
-
Nota: Tenga en cuenta que en la prueba if
, e utiliza una referencia a noFunc
aquí no hay paréntesis "()" después del nombre de la función para que la función real no se llame.
-
-
-Ver también
-
-Function , sentencia function , operador function
-
-{{ languages( { "en": "en/Core_JavaScript_1.5_Reference/Functions", "ru": "ru/\u042f\u0434\u0440\u043e_JavaScript_1.5_\u0421\u043f\u0440\u043e\u0432\u0447\u043d\u0438\u043a/Functions", "fr": "fr/R\u00e9f\u00e9rence_de_JavaScript_1.5_Core/Fonctions", "ja": "ja/Core_JavaScript_1.5_Reference/Functions" } ) }}
diff --git a/files/es/web/javascript/reference/functions/index.md b/files/es/web/javascript/reference/functions/index.md
new file mode 100644
index 00000000000000..4b1a08643213f6
--- /dev/null
+++ b/files/es/web/javascript/reference/functions/index.md
@@ -0,0 +1,667 @@
+---
+title: Funciones
+slug: Web/JavaScript/Reference/Functions
+tags:
+ - Funciones
+ - Guia(2)
+ - JavaScript
+ - función
+translation_of: Web/JavaScript/Reference/Functions
+original_slug: Web/JavaScript/Referencia/Funciones
+---
+{{jsSidebar("Functions")}}
+
+En términos generales, una función es un "subprograma" que puede ser _llamado_ por código externo (o interno en caso de recursión) a la función. Al igual que el programa en sí mismo, una función se compone de una secuencia de declaraciones, que conforman el llamado _cuerpo de la función_. Se pueden pasar valores a una función, y la función puede _devolver_ un valor.
+
+En JavaScript, las funciones son objetos de primera clase, es decir, son objetos y se pueden manipular y transmitir al igual que cualquier otro objeto. Concretamente son objetos {{jsxref("Function")}}.
+
+## General
+
+Toda función en JavaScript es un objeto Function. Ver {{jsxref("Function")}} para obtener información sobre las propiedades y métodos de los objetos `Function`.
+
+Las funciones no son lo mismo que los procedimientos. Una función siempre devuelve un valor, pero un procedimiento, puede o no puede devolver un valor.
+
+Para devolver un valor especifico distinto del predeterminado, una función debe tener una sentencia {{jsxref("Sentencias/return", "return")}}, que especifique el valor a devolver. Una función sin una instrucción return devolverá el valor predeterminado. En el caso de un {{jsxref("Object.prototype.constructor", "constructor")}} llamado con la palabra clave {{jsxref("new")}}, el valor predeterminado es el valor de su parametro. Para el resto de funciones, el valor predeterminado es undefined.
+
+Los parámetros en la llamada a una función son los argumentos de la función. Los argumentos se pasan a las funciones _por valor_. Si la función cambia el valor de un argumento, este cambio no se refleja globalmente ni en la llamada de la función. Sin embargo, las referencias a objetos también son valores, y son especiales: si la función cambia las propiedades del objeto referenciado, ese cambio es visible fuera de la función, tal y como se muestra en el siguiente ejemplo:
+
+```js
+/* Declarando la función 'myFunc' */
+ function myFunc(elobjeto)
+ {
+ elobjeto.marca= "Toyota";
+ }
+
+ /*
+ * Declarando la variable 'mycar';
+ * Se crea e inicializa el nuevo objeto;
+ * para hacer referencia a él mediante 'mycar'
+ */
+ var mycar = {
+ marca: "Honda",
+ modelo: "Accord",
+ año: 1998
+ };
+
+ /* Mostrando 'Honda' */
+ window.alert(mycar.marca);
+
+ /* Paso por referencia del objeto 'mycar' a la función 'myFunc'*/
+ myFunc(mycar);
+
+ /*
+ * Muestra 'Toyota' como valor de la propiedad 'marca'
+ * del objeto, que ha sido cambiado por la función.
+ */
+ window.alert(mycar.marca);
+```
+
+La palabra clave [`this`](/es/docs/Web/JavaScript/Referencia/Operadores/this) no hace referencia a la función que está ejecutandose actualmente, por lo que debes referirte a los objetos Function por nombre, incluso dentro del cuerpo de la función. Como alternativa, puedes utilizar la propiedad [arguments.callee](es/Referencia_de_JavaScript_1.5/Funciones/arguments/callee) (que no se recomienda).
+
+## Definiendo funciones
+
+Hay varias formas de definir funciones:
+
+### Declaración de una función (La instrucción `function`)
+
+Hay una sintaxis especial para declarar funciones (ver la instrucción {{jsxref("Sentencias/function","function")}} para más detalles):
+
+```
+function nombre([param[,param[, ...param]]]) {
+ instrucciones
+}
+```
+
+- `nombre`
+ - : El nombre de la función.
+
+
+
+- `param`
+ - : El nombre de un argumento que se pasará a la función. Una función puede tener hasta 255 argumentos.
+
+
+
+- `instrucciones`
+ - : Las instruciones que forman el cuerpo de la función.
+
+### Expresión de una función (El operador `function`)
+
+Una expresión function es similar y tiene la misma sintaxis que una declaración de función (ver operador {{jsxref("Operadores/function", "function")}} para más detalles):
+
+```
+function [nombre]([param[, param[, ...param]]]) {
+ instrucciones
+}
+```
+
+- `nombre`
+ - : El nombre de la función, se puede omitir, en ese caso la función se conoce como función anónima.
+
+
+
+- `param`
+ - : El nombre de los argumentos que se pasarán a la función. Una función puede tener hasta 255 argumentos.
+
+
+
+- `instrucciones`
+ - : Las instrucciones que forman el cuerpo de la función.
+
+### La expresión de función flecha (=>)
+
+> **Nota:** Las expresiones de función Flecha son una tecnología experimental, parte de la proposición Harmony (EcmaScript 6) y no son ampliamente implementadas por los navegadores.
+
+Una expresión de función flecha tiene una sintaxis más corta y su léxico se une a este valor (ver {{jsxref("Funciones/Arrow_functions", "arrow functions", "", 1)}} para más detalles):
+
+```html
+([param] [, param]) => { instrucciones }
+
+param => expresión
+```
+
+- `param`
+ - : El nombre de un argumento. Si no hay argumentos se tiene que indicar con `()`. Para un único argumento no son necesarios los parentesis. (como `foo => 1`)
+- `instrucciones o expresión`
+ - : Multiples instrucciones deben ser encerradas entre llaves. Una única expresión no necesita llaves. La expresión es, así mismo, el valor de retorno implícito de esa función.
+
+### El constructor `Function`
+
+Como todos los demás objetos, los objetos {{jsxref("Function")}} se pueden crear mediante el operador new:
+
+```html
+new Function (arg1, arg2, ... argN, functionBody)
+```
+
+- `arg1, arg2, ... argN`
+ - : Ningún o varios argumentos son pasados para ser utilizados por la función como nombres de argumentos formales. Cada uno debe ser una cadena que se ajuste a las reglas de identificadores válidos en JavaScript, o a una lista de este tipo de cadenas separadas por comas; por ejemplo "x", "theValue", o "a,b".
+
+
+
+- `Cuerpo de la función`
+ - : Una cadena conteniendo las instrucciones JavaScript que comprenden la definición de la función.
+
+Llamar al contructor Function como una función, sin el operador new, tiene el mismo efecto que llamarlo como un constructor.
+
+> **Nota:** Utilizar el constructor Function no se recomienda, ya que necesita el cuerpo de la función como una cadena, lo cual puede ocasionar que no se optimize correctamente por el motor JS, y puede también causar otros problemas.
+
+## El objeto `arguments`
+
+Puedes referirte a los argumentos de una función dentro de la misma, utilizando el objeto arguments. Ver {{jsxref("Functiones/argument", "Function")}}.
+
+## Ámbito de ejecución y pila de funciones
+
+some section about scope and functions calling other functions
+
+### Repaso
+
+Una función puede referirse y llamarse a sí misma. Hay tres maneras en la que una función puede referirse a sí misma.
+
+1. El nombre de la función
+2. {{jsxref("arguments.callee")}}
+3. una función dentro del ambito de ejecución que refiere a la función
+
+Por ejemplo, considere la siguiente definición de función:
+
+```js
+var foo = function bar() {
+ // el cuerpo va aqui
+};
+```
+
+Dentro del cuerpo de la función, todo lo siguientes son lo mismo:
+
+1. `bar()`
+2. `arguments.callee()`
+3. `foo()`
+
+Una función que se llama a sí misma es llamada una _función recursiva._ En algunas ocaciones, la recursión es análoga a un bucle. Ambos ejecutan el mismo código múltiples veces, y ambas requieren una condición (para evitar un bucle infinito, o en su lugar, recursión infinita en este caso). Por ejemplo, el siguiente bucle:
+
+```js
+var x = 0;
+while (x < 10) { // "x < 10" es la condición
+ // haz algo
+ x++;
+}
+```
+
+puede ser convertida en una función recursiva y una llamada a esa función:
+
+```js
+function loop(x) {
+ if (x >= 10) // "x >= 10" es la condición de salida (equivalente a "!(x < 10)")
+ return;
+ // haz algo
+ loop(x + 1); // la llamada recursiva
+}
+loop(0);
+```
+
+Sin embargo, algunos algoritmos no pueden ser bucles iterativos simples. Por ejemplo, obtener todos los nodos de una estructura de arbol (e.g. el [DOM](/es/docs/DOM)) es realizado de manera más fácil usando recursión:
+
+```js
+function recorrerArbol (nodo) {
+ if (nodo == null) //
+ return;
+ // haz algo con el nodo
+ for (var i = 0; i < nodo.nodosHijos.length; i++) {
+ recorrerArbol(nodo.nodosHijos[i]);
+ }
+}
+```
+
+En comparación con el bucle de la función `loop`, cada llamada recursiva hace muchas llamadas recursivas aquí.
+
+Es posible convertir cualquier algoritmo recursivo en uno no recursivo, pero a menudo la lógica es mucho más compleja y hacerlo requiere el uso de una pila. De hecho, la recursión utiliza una pila: la pila de funciones.
+
+El comportamiento similar a la pila se puede ver en el ejemplo siguiente:
+
+```js
+function foo(i) {
+ if (i < 0)
+ return;
+ document.writeln('inicio:' + i);
+ foo(i - 1);
+ document.writeln('fin:' + i);
+}
+foo(3);
+```
+
+que produce:
+
+```html
+inicio:3
+inicio:2
+inicio:1
+inicio:0
+fin:0
+fin:1
+fin:2
+fin:3
+```
+
+## Funciones anidadas y cierres
+
+- Puede anidar una función dentro de una función. La función anidada (inner) es privada a la función que la contiene (outer). También con la forma: aclosure.
+ - : Un cierre es una expresión (normalmente una función) que puede tener variables libres junto con un entorno que enlaza esas variables (que "cierra" la expresión).
+ Dado que una función anidada es un cierre, esto significa que una función anidada puede "heredar" los argumentos y las variables de su función contenedora. En otras palabras, la función interna contiene el ámbito de la función externa.[](http://jibbering.com/faq/faq_notes/closures.html)
+
+Desde que la función anidada es un cierre (closure), esto significa que una función anidada puede "heredar" los argumentos y variables de su función contenedora. En otras palabras, la función interna contiene un scope (alcance) de la función externa.
+
+Para resumir:
+
+- La función interna se puede acceder sólo a partir de sentencias en la función externa.
+
+
+
+- La función interna forma un cierre: la función interna puede utilizar los argumentos y las variables de la función externa, mientras que la función externa no puede utilizar los argumentos y las variables de la función interna.
+
+El ejemplo siguiente muestra funciones anidadas:
+
+```
+function addCuadrado(a,b) {
+ function cuadrado(x) {
+ return x * x;
+ }
+ return cuadrado(a) + cuadrado(b);
+}
+a = addCuadrado(2,3); // retorna 13
+b = addCuadrado(3,4); // retorna 25
+c = addCuadrado(4,5); // retorna 41
+```
+
+Dado que la función interna forma un cierre, puede llamar a la función externa y especificar argumentos para la función externa e interna
+
+```
+function fuerade(x) {
+ function dentro(y) {
+ return x + y;
+ }
+ return dentro;
+}
+resultado = fuerade(3)(5); // retorna 8
+```
+
+### Consideraciones sobre la eficiencia
+
+Observe cómo se conserva `x` cuando se devuelve dentro. Un cierre conserva los argumentos y las variables en todos los ámbitos que contiene. Puesto que cada llamada proporciona argumentos potencialmente diferentes, debe crearse un cierre para cada llamada a la función externa. En otras palabras, cada llamada a `fuerade` crea un cierre. Por esta razón, los cierres pueden usar una gran cantidad de memoria. La memoria se puede liberar sólo cuando el `dentro` devuelto ya no es accesible. En este caso, el cierre del `dentro` se almacena en `resultado`. Como el `resultado` está en el ámbito global, el cierre permanecerá hasta que se descargue el script (en un navegador, esto sucedería cuando la página que contiene el script esté cerrada).
+
+Debido a esta ineficiencia, evite cierres siempre que sea posible, es decir, evite las funciones de anidamiento siempre que sea posible. Por ejemplo, considere el siguiente ejemplo:
+
+```
+function assignOnclick(elemento) {
+ element.onclick = function() {
+ this.style.backgroundColor = 'blue';
+ };
+}
+```
+
+Esto se puede volver a escribir para evitar el cierre. Sin embargo, la función interna anónima necesitaría ser nombrada y ya no sería privada para `assignOnclick`:
+
+```
+function assignOnclick(elemento) {
+ elemento.onclick = elemento_onclick;
+}
+
+function elemento_onclick() {
+ this.style.backgroundColor = 'blue';
+}
+```
+
+#### Multiples funciones anidadas
+
+Las funciones pueden ser anidadas contigua de la otra, es decir, una función (A) que contiene una función (B) que contiene una función (C), etc. Ambas funciones B y C forman cierres aquí, por lo que B puede acceder a A y C pueden acceder a B. Además, como C puede acceder a B, que puede acceder a A, C también puede acceder a A. Por lo tanto, los cierres pueden contener múltiples ámbitos; contienen recursivamente el alcance de las funciones que lo contienen. Esto es llamado encadenamiento de objetos(_scope chaining_). (Por qué se llama "_chaining_"("encadenamiento") se explicará más adelante.)
+
+Considere el siguiente ejemplo:
+
+```
+function A(x) {
+ function B(y) {
+ function C(z) {
+ alert(x + y + z);
+ }
+ C(3);
+ }
+ B(2);
+}
+A(1); // alerts 6 (1 + 2 + 3)
+```
+
+En este ejemplo, `C` accede a las `B` que hayan en `y` y `A` en `x`. Esto se puede hacer porque:
+
+1. `B` forma un cierre que incluye a `A`, es decir, `B` puede acceder a los argumentos y variables de `A`.
+2. `C` forma un cierre que incluye a `B`.
+3. Como el cierre de `B` incluye a `A`, el cierre de `C` incluye a `A`, `C` puede acceder a los argumentos y variables de la Banda `A`. En otras palabras, codifica los ámbitos de `B` y A en ese orden.
+
+Lo contrario, sin embargo, no es cierto. `A` no puede acceder a `C`, porque `A` no puede acceder a ningún argumento o variable de `B`, que `C` es una variable de. Así, `C` permanece privado de sólo `B`.
+
+### Conflictos de nombre
+
+Cuando dos argumentos o variables en los ámbitos de un cierre tienen el mismo nombre, existe un conflicto de nombres("_name conflict_"). Más alcances internos tienen prioridad, por lo que el alcance más interno tiene la más alta precedencia, mientras que el alcance más externo toma el más bajo. Esta es la cadena de alcance. El primero en la cadena es el alcance más interno, y el último es el alcance más exterior. Considera lo siguiente:
+
+```
+function fuerade() {
+ var x = 10;
+ function dentro(x) {
+ return x;
+ }
+ return dentro;
+}
+resultado = fuerade()(20); // retorna 20 en lugar de 10
+```
+
+El conflicto de nombres ocurre en la sentencia `return x` y está entre el parámetro `x` del `dentro`y la variable `x` del `fuerade`. La cadena de alcance aquí es {`dentro`, `fuerade`, global object}. Por lo tanto, la `x` de `inside`tiene precedentes sobre la `x` de `fuerade`, y 20 (`dentro`de `x`) se devuelve en lugar de 10 (`fuerade` de `x`).
+
+## Constructor vs declaración vs expresión
+
+Las diferencias entre la `Function` constructora, la de declaración y la de expresión.
+
+Compare lo siguiente:
+
+1. Una función definida con el constructor `Function` asignado a la variable `multiply`
+
+ ```
+ var multiply = new Function("x", "y", "return x * y;");
+ ```
+
+2. Una declaración de una función denominada `multiply`
+
+ ```
+ function multiply(x, y) {
+ return x * y;
+ }
+ ```
+
+3. Una expresión de función anónima asignada a la variable `multiply`
+
+ ```
+ var multiply = function(x, y) {
+ return x * y;
+ }
+ ```
+
+4. Una declaración de una función denominada `func_name` asignada a la variable `multiply`
+
+ ```
+ var multiply = function func_name(x, y) {
+ return x * y;
+ }
+ ```
+
+Todos hacen aproximadamente la misma cosa, con algunas diferencias sutiles:
+
+- Existe una distinción entre el nombre de la función y la variable a la que se asigna la función:
+
+ - El nombre de la función no se puede cambiar, mientras que la variable a la que se asigna la función puede ser reasignada.
+ - El nombre de la función sólo se puede utilizar en el cuerpo de la función. Intentar utilizarlo fuera del cuerpo de la función da como resultado un error (o `undefined` si el nombre de la función se declaró previamente mediante una instrucción `var`). Por ejemplo:
+
+ ```
+ var y = function x() {};
+ alert(x); // arroja un error
+ ```
+
+ El nombre de la función también aparece cuando la función se serializa vía el método de la `Function` 'toString'.
+
+ Por otro lado, la variable a la que se asigna la función está limitada sólo por su ámbito, que está garantizado para incluir el ámbito en el que se declara la función.
+
+ - Como muestra el ejemplo 4, el nombre de la función puede ser diferente de la variable a la que se asigna la función. No tienen relación entre sí.
+
+- Una declaración de función también crea una variable con el mismo nombre que el nombre de la función. Por lo tanto, a diferencia de las definidas por las expresiones de función, las funciones definidas por las declaraciones de función se puede acceder por su nombre en el ámbito que se definieron en:
+
+ ```js
+ function x() {}
+ alert(x); // salida x serializado en un string
+ ```
+
+ El siguiente ejemplo muestra cómo los nombres de las funciones no están relacionados con las variables a las que están asignadas las funciones. Si una "variable de función" se asigna a otro valor, seguirá teniendo el mismo nombre de función:
+
+ ```js
+ function foo() {}
+ alert(foo); // el string alterado contiene el nombre
+ // de la función "foo"
+ var bar = foo;
+ alert(bar); // el string todavía contiene el nombre
+ // de la función "foo"
+ ```
+
+- Una función definida por un`Function` no tiene un nombre de función. Sin embargo, en el [SpiderMonkey](/es/docs/Mozilla/Projetos/SpiderMonkey) en el motor de JavaScript, la forma serializada de la función muestra como si tuviera el nombre "anónimo"("anonymous"). Por ejemplo, `alert(new Function())` salida:
+
+ ```js
+ function anonymous() {
+ }
+ ```
+
+ Dado que la función en realidad no tiene un nombre, `anonymous` no es una variable que se puede acceder dentro de la función. Por ejemplo, lo siguiente resultaría en un error:
+
+ ```js
+ var foo = new Function("alert(anonymous);");
+ foo();
+ ```
+
+- A diferencia de las funciones definidas por expresiones de función o constructores `Function` se puede utilizar una función definida por una declaración de función antes de la propia declaración de la función. Por ejemplo:
+
+ ```js
+ foo(); // alerts FOO!
+ function foo() {
+ alert('FOO!');
+ }
+ ```
+
+- Una función definida por una expresión de función hereda el ámbito actual. Es decir, la función forma un cierre. Por otro lado, una función definida por un constructor de `Function` no hereda ningún ámbito que no sea el ámbito global (que todas las funciones heredan).
+- Las funciones definidas por expresiones de función y declaraciones de función son analizadas una sola vez, mientras que las definidas por el constructor de `Function` no lo son. Es decir, la cadena de cuerpo de función pasada al constructor de `Function` debe ser analizada cada vez que se evalúa. Aunque una expresión de función crea un cierre cada vez, el cuerpo de la función no es reparsed, por lo que las expresiones de función son aún más rápido que "`new Function(...)`". Por lo tanto, el constructor de la `Function` debe evitarse siempre que sea posible.
+
+Una declaración de función es muy fácilmente (ya menudo involuntariamente) convertida en una expresión de función. Una declaración de función deja de ser una cuando:
+
+- Se convierte en parte de una expresión
+- Ya no es un "elemento fuente" de una función o el propio script. Un "elemento de origen" es una sentencia no anidada en el script o un cuerpo de función:
+
+ ```js
+ var x = 0; // elemento fuente
+ if (x == 0) { // elemento fuente
+ x = 10; // no es un elemento fuente
+ function boo() {} // no es un elemento fuente
+ }
+ function foo() { // elemento fuente
+ var y = 20; // elemento fuente
+ function bar() {} // elemento fuente
+ while (y == 10) { // elemento fuente
+ function blah() {} // no es un elemento fuente
+ y++; // no es un elemento fuente
+ }
+ }
+ ```
+
+Ejemplos:
+
+- ```js
+ // function declaración
+ function foo() {}
+
+ // expresión de una función
+ (function bar() {})
+
+ // expresión de una función
+ x = function hello() {}
+ ```
+
+- ```js
+ if (x) {
+ // expresión de la función
+ function world() {}
+ }
+ ```
+
+- ```js
+ // instrucción de la función
+ function a() {
+ // instrucción de la función
+ function b() {}
+ if (0) {
+ // expresión de la función
+ function c() {}
+ }
+ }
+ ```
+
+### Definición condicional de una función
+
+Las funciones se pueden definir de forma condicional utilizando expresiones de función o el constructor `Function`.
+
+En la siguiente secuencia de comandos, la función `zero` nunca se define y no se puede invocar, porque '`if (0)`' se evalúa como false:
+
+```js
+if (0)
+ function zero() {
+ document.writeln("Esto es zero.");
+ }
+```
+
+Si se cambia el script para que la condición se convierta en '`if (1)`', se define la función `zero`.
+
+> **Nota:** Aunque esto parece una declaración de función, ésta es en realidad una expresión de función ya que está anidada dentro de otra instrucción. Ver [las diferencias entre las funciones de declaración y de expresión](#constructor_versus_declaration_versus_expression).
+
+> **Nota:** Algunos motores JavaScript, sin incluir [SpiderMonkey](/es/docs/Mozilla/Projetos/SpiderMonkey), tratan incorrectamente cualquier expresión de función con un nombre como una declaración de función. Esto llevaría a que se definiera `zero` incluso con el siempre-falso("_always-false_") condicional. Una manera más segura de definir funciones condicionalmente es definir la función anónimamente y asignarla a una variable:
+
+```js
+if (0)
+ var zero = function() {
+ document.writeln("Esto es zero.");
+ }
+```
+
+## Funciones como manejadores de eventos
+
+En JavaScript, los controladores de eventos [DOM](es/DOM) son funciones (en oposición a los objetos que contienen un método `handleEvent` en otros enlaces de idioma DOM). Las funciones se pasan un objeto de [evento](es/DOM/event) como el primer y único parámetro. Como cualquier otro parámetro, si el objeto de evento no necesita ser utilizado, puede omitirse en la lista de parámetros formales.
+
+Los posibles objetivos de eventos en un documento [HTML](es/HTML) incluyen: `window` (`Window` objects("objeto de ventana"), including frames("marcos")), `document` (`HTMLDocument` objects("objetos HTMLDocument")), y elementos (`Element` objects("objetos Elemento")). En el [HTML DOM](http://www.w3.org/TR/DOM-Level-2-HTML/), los destinos de evento tienen propiedades de controlador de eventos. Estas propiedades son nombres de eventos en minúsculas con prefijo "on", e.g. `onfocus`. Los eventos [DOM Level 2 Events](http://www.w3.org/TR/DOM-Level-2-Events/) proporcionan una forma alternativa y más sólida de agregar oyentes de eventos.
+
+> **Nota:** Los eventos son parte del DOM, no de JavaScript. (JavaScript simplemente proporciona un enlace al DOM.)
+
+El ejemplo siguiente asigna una función a un manejador de eventos de "foco"("focus") de ventana.
+
+```
+window.onfocus = function() {
+ document.body.style.backgroundColor = 'white';
+}
+```
+
+Si se asigna una función a una variable, puede asignar la variable a un controlador de eventos. El siguiente código asigna una función a la variable `setBGColor`.
+
+```
+var setBGColor = new Function("document.body.style.backgroundColor = 'white';");
+```
+
+Puede utilizar esta variable para asignar una función a un controlador de eventos de varias maneras. Aquí hay dos formas:
+
+1. Escritura con propiedades de evento DOM HTML
+
+ ```
+ document.form1.colorButton.onclick = setBGColor;
+ ```
+
+2. Atributo de evento HTML
+
+ ```
+
+ ```
+
+ Un manejador de eventos establecido de esta manera es en realidad una función, denominada después del atributo, envuelta alrededor del código especificado. Esta es la razón por la que los paréntesis en "`setBGColor()`" son necesarios aquí (en lugar de sólo "`setBGColor`").
+
+Es equivalente a:
+
+```
+document.form1.colorButton.onclick = function onclick(event) {
+ setBGColor();
+}
+```
+
+Observe cómo se pasa el objeto de evento a esta función anónima como `event` de parámetro. Esto permite que el código especificado utilice el objeto Evento("Event object)":
+
+```
+
+```
+
+Al igual que cualquier otra propiedad que se refiere a una función, el controlador de eventos puede actuar como un método, y `this` se refiere al elemento que contiene el controlador de eventos. En el ejemplo siguiente, se llama a la función referida por `onfocus` con `this` igual a `window`.
+
+```
+window.onfocus();
+```
+
+Un error común de principiante de JavaScript es el añadir paréntesis y / o parámetros al final de la variable, es decir, llamar al manejador de eventos cuando lo asigna. La adición de estos paréntesis asignará el _valor devuelto al llamar al manejador de eventos_, que a menudo es `undefined` (si la función no devuelve nada), en lugar del controlador de eventos en sí:
+
+```
+document.form1.button1.onclick = setBGColor();
+```
+
+Para pasar parámetros a un manejador de eventos, el manejador debe ser envuelto en otra función de la siguiente manera:
+
+```
+document.form1.button1.onclick = function() {
+ setBGColor('Algun valor');
+};
+```
+
+### Compatibilidad con versiones anteriores
+
+#### JavaScript 1.1 y anteriores
+
+No puede anidar una sentencia de función en otra instrucción o en sí misma.
+
+### Variables locales dentro de las funciones
+
+[arguments](es/Referencia_de_JavaScript_1.5/Funciones/arguments): Objeto similar a una matriz que contiene los argumentos pasados a la función en ejecución.
+
+[arguments.callee](es/Referencia_de_JavaScript_1.5/Funciones/arguments/callee): Especifica la función en ejecución.
+
+[arguments.caller](es/Referencia_de_JavaScript_1.5/Funciones/arguments/caller): Especifica la función que invocó la función en ejecución.
+
+[arguments.length](es/Referencia_de_JavaScript_1.5/Funciones/arguments/length): Especifica el número de argumentos pasados a la función.
+
+### Ejemplos
+
+#### 1) Devolver un número con formato
+
+La siguiente función devuelve una cadena que contiene la representación formateada de un número rellenado con ceros a la izquierda.
+
+```
+// Esta función devuelve una cadena rellenada con ceros a la izquierda
+
+function padZeros(num, totalLen) {
+ var numStr = num.toString(); // Inicializa un valor de retorno como cadena
+ var numZeros = totalLen - numStr.length; // Calcula el no. de ceros
+ for (var i = 1; i <= numZeros; i++) {
+ numStr = "0" + numStr;
+ }
+ return numStr;
+}
+```
+
+Las siguientes sentencias llaman a la función padZeros.
+
+```
+var resultado;
+resultado = padZeros(42,4); // retorna "0042"
+resultado = padZeros(42,2); // retorna "42"
+resultado = padZeros(5,4); // retorna "0005"
+```
+
+#### 2) Determinar si existe una función
+
+Puede determinar si existe una función utilizando el operador `typeof`. En el ejemplo siguiente, se realiza una prueba para determinar si el objeto `window` tiene una propiedad llamada `noFunc` que es una función. Si es así, se utiliza; de lo contrario, se tomarán otras medidas.
+
+```
+ if ('function' == typeof window.noFunc) {
+ // utiliza noFunc()
+ } else {
+ // hacer algo mas
+ }
+```
+
+> **Nota:** Tenga en cuenta que en la prueba `if`, e utiliza una referencia a `noFunc` aquí no hay paréntesis "()" después del nombre de la función para que la función real no se llame.
+
+### Ver también
+
+[Function](es/Referencia_de_JavaScript_1.5/Objetos_globales/Function), [sentencia function](es/Referencia_de_JavaScript_1.5/Sentencias/function), [operador function](es/Referencia_de_JavaScript_1.5/Operadores/Operadores_globales/function)
diff --git a/files/es/web/javascript/reference/functions/method_definitions/index.html b/files/es/web/javascript/reference/functions/method_definitions/index.html
deleted file mode 100644
index c041a46f10f32f..00000000000000
--- a/files/es/web/javascript/reference/functions/method_definitions/index.html
+++ /dev/null
@@ -1,162 +0,0 @@
----
-title: Method definitions
-slug: Web/JavaScript/Reference/Functions/Method_definitions
-translation_of: Web/JavaScript/Reference/Functions/Method_definitions
-original_slug: Web/JavaScript/Referencia/Funciones/Method_definitions
----
-{{JsSidebar("Functions")}}
-
-A partir de ECMAScript 2015 (ES6), se introdujo una sintaxis abreviada para la definición de métodos en inicializadores de objetos. Es una forma abreviada para la asignación de una función al nombre del método.
-
-
-
-Sintaxis
-
-var obj = {
- property ( parameters… ) {},
- *generator ( parameters… ) {},
-// also with computed keys:
- [property]( parameters… ) {},
- *[generator]( parameters… ) {},
-// compare ES5 getter/setter syntax:
- get property () {},
- set property (value ) {}
-};
-
-
-Descripción
-
-La sintaxis abreviada es similar a la introducida en ECMAScript 5 con getter y setter .
-
-Dado el siguiente código:
-
-var obj = {
- foo: function() {},
- bar: function() {}
-};
-
-Ahora se puede abreviar esto mismo como:
-
-var obj = {
- foo() {},
- bar() {}
-};
-
-
-
Nota : La sintaxis abreviada usa funciones con nombre en lugar de funciones anónimas (como en …foo: function() {}
…). Las funciones con nombre pueden ser llamadas desde el cuerpo de la función (esto es imposible con funciones anónimas, ya que no existe un identificador al que referirse). Para más detalles, ver {{jsxref("Operators/function","function","#Examples")}}.
-
-
-Abreviatura de métodos generadores
-
-Los métodos generadores también pueden definirse usando la sintaxis abreviada. Note que el asterisco (*) en la sintaxis abreviada debe estar antes del nombre de propiedad del generador. Esto es, * g(){}
funcionará, pero g *(){}
no.
-
-// Usando una propiedad con nombre (pre-ES6)
-var obj2 = {
- g: function*() {
- var index = 0;
- while(true)
- yield index++;
- }
-};
-
-// El mismo objeto, usando la sintaxis abreviada
-var obj2 = {
- * g() {
- var index = 0;
- while(true)
- yield index++;
- }
-};
-
-var it = obj2.g();
-console.log(it.next().value); // 0
-console.log(it.next().value); // 1
-
-Las definiciones de métodos no son constructores (instanciables con new)
-
-Las las definiciones de métodos no son constructores y generarán un {{jsxref("TypeError")}} si intenta instanciarlos.
-
-var obj = {
- method() {},
-};
-new obj.method; // TypeError: obj.method no es un constructor
-
-var obj = {
- * g() {}
-};
-new obj.g; // TypeError: obj.g no es un constructor (cambiado en ES2016)
-
-
-Ejemplos
-
-Caso de prueba simple
-
-var obj = {
- a : "foo",
- b(){ return this.a; }
-};
-console.log(obj.b()); // "foo"
-
-
-Nombres de propiedad computados
-
-La sintaxis abreviada también soporta nombres de propiedades computados.
-
-var bar = {
- foo0 : function (){return 0;},
- foo1(){return 1;},
- ["foo" + 2](){return 2;},
-};
-
-console.log(bar.foo0()); // 0
-console.log(bar.foo1()); // 1
-console.log(bar.foo2()); // 2
-
-Especificaciónes
-
-
-
-
- Especificación
- Estado
- Observaciones
-
-
- {{SpecName('ES6', '#sec-method-definitions', 'Method definitions')}}
- {{Spec2('ES6')}}
- Definición inicial.
-
-
- {{SpecName('ES7', '#sec-method-definitions', 'Method definitions')}}
- {{Spec2('ES7')}}
- Cambiado el que los métodos generadores no deban tener una trampa [[Construct]] y deban fallar cuando se usen con new
.
-
-
- {{SpecName('ESDraft', '#sec-method-definitions', 'Method definitions')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad con navegadores
-
-{{Compat("javascript.functions.method_definitions")}}
-
-Notas específicas para SpiderMonkey
-
-
-
-Ver también
-
-
diff --git a/files/es/web/javascript/reference/functions/method_definitions/index.md b/files/es/web/javascript/reference/functions/method_definitions/index.md
new file mode 100644
index 00000000000000..2f70588db92fa1
--- /dev/null
+++ b/files/es/web/javascript/reference/functions/method_definitions/index.md
@@ -0,0 +1,147 @@
+---
+title: Method definitions
+slug: Web/JavaScript/Reference/Functions/Method_definitions
+translation_of: Web/JavaScript/Reference/Functions/Method_definitions
+original_slug: Web/JavaScript/Referencia/Funciones/Method_definitions
+---
+{{JsSidebar("Functions")}}A partir de ECMAScript 2015 (ES6), se introdujo una sintaxis abreviada para la definición de métodos en inicializadores de objetos. Es una forma abreviada para la asignación de una función al nombre del método.
+
+## Sintaxis
+
+```
+var obj = {
+ property( parameters… ) {},
+ *generator( parameters… ) {},
+// also with computed keys:
+ [property]( parameters… ) {},
+ *[generator]( parameters… ) {},
+// compare ES5 getter/setter syntax:
+ get property() {},
+ set property(value) {}
+};
+```
+
+## Descripción
+
+La sintaxis abreviada es similar a la introducida en ECMAScript 5 con [getter](/es/docs/Web/JavaScript/Reference/Functions/get) y [setter](/es/docs/Web/JavaScript/Reference/Functions/set).
+
+Dado el siguiente código:
+
+```js
+var obj = {
+ foo: function() {},
+ bar: function() {}
+};
+```
+
+Ahora se puede abreviar esto mismo como:
+
+```js
+var obj = {
+ foo() {},
+ bar() {}
+};
+```
+
+> **Nota:** La sintaxis abreviada usa funciones con nombre en lugar de funciones anónimas (como en …`foo: function() {}`…). Las funciones con nombre pueden ser llamadas desde el cuerpo de la función (esto es imposible con funciones anónimas, ya que no existe un identificador al que referirse). Para más detalles, ver {{jsxref("Operators/function","function","#Examples")}}.
+
+### Abreviatura de métodos generadores
+
+Los [métodos generadores](/es/docs/Web/JavaScript/Reference/Statements/function*) también pueden definirse usando la sintaxis abreviada. Note que el asterisco (\*) en la sintaxis abreviada debe estar antes del nombre de propiedad del generador. Esto es, `* g(){}` funcionará, pero `g *(){}` no.
+
+```
+// Usando una propiedad con nombre (pre-ES6)
+var obj2 = {
+ g: function*() {
+ var index = 0;
+ while(true)
+ yield index++;
+ }
+};
+
+// El mismo objeto, usando la sintaxis abreviada
+var obj2 = {
+ * g() {
+ var index = 0;
+ while(true)
+ yield index++;
+ }
+};
+
+var it = obj2.g();
+console.log(it.next().value); // 0
+console.log(it.next().value); // 1
+```
+
+### Las definiciones de métodos no son constructores (instanciables con new)
+
+Las las definiciones de métodos no son constructores y generarán un {{jsxref("TypeError")}} si intenta instanciarlos.
+
+```js example-bad
+var obj = {
+ method() {},
+};
+new obj.method; // TypeError: obj.method no es un constructor
+
+var obj = {
+ * g() {}
+};
+new obj.g; // TypeError: obj.g no es un constructor (cambiado en ES2016)
+```
+
+## Ejemplos
+
+### Caso de prueba simple
+
+```
+var obj = {
+ a : "foo",
+ b(){ return this.a; }
+};
+console.log(obj.b()); // "foo"
+```
+
+### Nombres de propiedad computados
+
+La sintaxis abreviada también soporta nombres de propiedades computados.
+
+```
+var bar = {
+ foo0 : function (){return 0;},
+ foo1(){return 1;},
+ ["foo" + 2](){return 2;},
+};
+
+console.log(bar.foo0()); // 0
+console.log(bar.foo1()); // 1
+console.log(bar.foo2()); // 2
+```
+
+## Especificaciónes
+
+| Especificación | Estado | Observaciones |
+| ------------------------------------------------------------------------------------------------ | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
+| {{SpecName('ES6', '#sec-method-definitions', 'Method definitions')}} | {{Spec2('ES6')}} | Definición inicial. |
+| {{SpecName('ES7', '#sec-method-definitions', 'Method definitions')}} | {{Spec2('ES7')}} | Cambiado el que los métodos generadores no deban tener una trampa \[\[Construct]] y deban fallar cuando se usen con `new`. |
+| {{SpecName('ESDraft', '#sec-method-definitions', 'Method definitions')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad con navegadores
+
+{{Compat("javascript.functions.method_definitions")}}
+
+## Notas específicas para SpiderMonkey
+
+- Anteriormente a SpiderMonkey 38 {{geckoRelease(38)}}, "`get`" y "`set`" eran nombres no válidos para métodos generadores. Esto ha sido corregido en {{bug(1073809)}}.
+- Anteriormente a SpiderMonkey 41 {{geckoRelease(41)}}, las llaves no eran requeridas en las definiciones de métodos. Estas son requeridas de ahora en adelante conforme a la especificación ES6 y su omisión arrojará un {{jsxref("SyntaxError")}} en esta versión y posteriores ({{bug(1150855)}}).
+
+ ```js example-bad
+ var o = {x() 12}; // SyntaxError
+ ```
+
+- La restricción de que sólo los métodos generadores sean constructores fue implementada en SpiderMonkey 41 {{geckoRelease(41)}}. Ver también {{bug(1059908)}} y {{bug(1166950)}}.
+
+## Ver también
+
+- [`get`](/en-US/docs/Web/JavaScript/Reference/Functions/get)
+- [`set`](/en-US/docs/Web/JavaScript/Reference/Functions/set)
+- [Lexica grammatical](/es/docs/Web/JavaScript/Reference/Lexical_grammar)
diff --git a/files/es/web/javascript/reference/global_objects/array/concat/index.html b/files/es/web/javascript/reference/global_objects/array/concat/index.html
deleted file mode 100644
index 6c75042b25ce73..00000000000000
--- a/files/es/web/javascript/reference/global_objects/array/concat/index.html
+++ /dev/null
@@ -1,141 +0,0 @@
----
-title: Array.prototype.concat()
-slug: Web/JavaScript/Reference/Global_Objects/Array/concat
-tags:
- - Array
- - JavaScript
- - Métodos
- - Prototipo
- - Referencia
- - array.concat
- - metodo
-translation_of: Web/JavaScript/Reference/Global_Objects/Array/concat
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/concat
----
-{{JSRef}}
-
-El método concat()
se usa para unir dos o más arrays. Este método no cambia los arrays existentes, sino que devuelve un nuevo array.
-
-{{EmbedInteractiveExample("pages/js/array-concat.html","shorter")}}
-
-Sintaxis
-
-var nuevo_array = viejo_array .concat(valor1 [, valor2 [, ...[, valorN ]]])
-
-Parámetros
-
-
- valorN
{{optional_inline}}
- Arrays y/o valores a concatenar en el nuevo array. Ver la descripción posterior para más detalles.
-
-
-Valor devuelto
-
-
- Una nueva instancia de {{jsxref("Array")}}.
-
-
-Descripción
-
-El método concat
crea un nuevo array que consta de los elementos del objeto que lo llama, seguido, en orden de ingreso, por los elementos de cada parámetro (en caso de que el parámetro sea un array), o el parámetro mismo (en caso de que no sea un array). No se aplica de forma recursiva a parámetros con arreglos anidados.
-
-El método concat
no altera this
el array original, ni ninguno de los que fueron ingresados como parámetros, sino que devuelve una copia superficial que contiene copias de los mismos elementos de los arrays originales combinados. Los elementos de los arrays originales son copiados en el nuevo array de la siguiente manera:
-
-
- Referencias a Objetos (no el objeto real): concat
copia las referencias de objetos en el nuevo array. Ambos, el array original y el nuevo refieren al mismo objeto. Es decir, si un objeto referenciado es modificado, los cambios serán visibles tanto en el array nuevo como en el antiguo.
- Tipo de de datos como cadenas, números y boleanos (no objetos {{jsxref("Global_Objects/String", "String")}}, {{jsxref("Global_Objects/Number", "Number")}} o {{jsxref("Global_Objects/Boolean", "Boolean")}} objects): concat
copia los valores de los strings y numeros en el nuevo array.
-
-
-
-
Nota: Al concatenar arrays o valores no se modificarán los originales. Además, las operaciones en el nuevo array (excepto las operaciones en elementos que son referencias a objetos) no tendrán efecto en el array original, y viceversa.
-
-
-Ejemplos
-
-Concatenando dos arrays
-
-En el siguiente código se concatenan dos arrays:
-
-const letters = ['a', 'b', 'c'];
-const numbers = [1, 2, 3];
-
-letters.concat(numbers);
-// result in ['a', 'b', 'c', 1, 2, 3]
-
-
-Concatenando tres arrays
-
-En el siguiente código se concatenan tres arrays:
-
-const num1 = [1, 2, 3];
-const num2 = [4, 5, 6];
-const num3 = [7, 8, 9];
-
-const numbers = num1.concat(num2, num3);
-
-console.log(numbers);
-// results in [1, 2, 3, 4, 5, 6, 7, 8, 9]
-
-
-Concatenando valores a un array
-
-En el siguiente código se concatenan tres valores a un array:
-
-var alpha = ['a', 'b', 'c'];
-
-var alphaNumeric = alpha.concat(1, [2, 3]);
-
-console.log(alphaNumeric);
-// Da como resultado: ['a', 'b', 'c', 1, 2, 3]
-
-
-Concatenando arrays anidados
-
-En el siguiente código concatena arrays anidados y demuestra retención de referencias:
-
-var num1 = [[1]];
-var num2 = [2, [3]];
-
-var nums = num1.concat(num2);
-
-console.log(nums);
-// Da como resultado: [[1], 2, [3]]
-
-// modifica el primer elemento de num1
-num1[0].push(4);
-
-console.log(nums);
-// Da como resultado: [[1, 4], 2, [3]]
-
-Especificaciones
-
-
-
-
- Especificación
-
-
-
-
- {{SpecName('ESDraft', '#sec-array.prototype.concat', 'Array.prototype.concat')}}
-
-
-
-
-Compatibilidad con navegadores
-
-
-
{{Compat("javascript.builtins.Array.concat")}}
-
-
-
-
-Ver también
-
-
- {{jsxref("Array.push", "push")}} / {{jsxref("Array.pop", "pop")}} — añadir/eliminar elementos desde el fin del array
- {{jsxref("Array.unshift", "unshift")}} / {{jsxref("Array.shift", "shift")}} — añadir/eliminar elementos desde el comienzo del array
- {{jsxref("Array.splice", "splice")}} — añadir/eliminar elementos desde una posición específica del array
- {{jsxref("String.prototype.concat()")}}
- {{jsxref("Symbol.isConcatSpreadable")}} – controla el flattening (aplanamiento).
-
diff --git a/files/es/web/javascript/reference/global_objects/array/concat/index.md b/files/es/web/javascript/reference/global_objects/array/concat/index.md
new file mode 100644
index 00000000000000..0e5be0afa16410
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/array/concat/index.md
@@ -0,0 +1,125 @@
+---
+title: Array.prototype.concat()
+slug: Web/JavaScript/Reference/Global_Objects/Array/concat
+tags:
+ - Array
+ - JavaScript
+ - Métodos
+ - Prototipo
+ - Referencia
+ - array.concat
+ - metodo
+translation_of: Web/JavaScript/Reference/Global_Objects/Array/concat
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/concat
+---
+{{JSRef}}
+
+El método **`concat()`** se usa para unir dos o más arrays. Este método no cambia los arrays existentes, sino que devuelve un nuevo array.
+
+{{EmbedInteractiveExample("pages/js/array-concat.html","shorter")}}
+
+## Sintaxis
+
+```
+var nuevo_array = viejo_array.concat(valor1[, valor2[, ...[, valorN]]])
+```
+
+### Parámetros
+
+- `valorN` {{optional_inline}}
+ - : Arrays y/o valores a concatenar en el nuevo array. Ver la descripción posterior para más detalles.
+
+### Valor devuelto
+
+Una nueva instancia de {{jsxref("Array")}}.
+
+## Descripción
+
+El método `concat` crea un nuevo array que consta de los elementos del objeto que lo llama, seguido, en orden de ingreso, por los elementos de cada parámetro (en caso de que el parámetro sea un array), o el parámetro mismo (en caso de que no sea un array). No se aplica de forma recursiva a parámetros con arreglos anidados.
+
+El método `concat` no altera `this` el array original, ni ninguno de los que fueron ingresados como parámetros, sino que devuelve una copia superficial que contiene copias de los mismos elementos de los arrays originales combinados. Los elementos de los arrays originales son copiados en el nuevo array de la siguiente manera:
+
+- Referencias a Objetos (no el objeto real): `concat` copia las referencias de objetos en el nuevo array. Ambos, el array original y el nuevo refieren al mismo objeto. Es decir, si un objeto referenciado es modificado, los cambios serán visibles tanto en el array nuevo como en el antiguo.
+- Tipo de de datos como cadenas, números y boleanos (no objetos {{jsxref("Global_Objects/String", "String")}}, {{jsxref("Global_Objects/Number", "Number")}} o {{jsxref("Global_Objects/Boolean", "Boolean")}} objects): `concat` copia los valores de los strings y numeros en el nuevo array.
+
+> **Nota:** Al concatenar arrays o valores no se modificarán los originales. Además, las operaciones en el nuevo array (excepto las operaciones en elementos que son referencias a objetos) no tendrán efecto en el array original, y viceversa.
+
+## Ejemplos
+
+### Concatenando dos arrays
+
+En el siguiente código se concatenan dos arrays:
+
+```js
+const letters = ['a', 'b', 'c'];
+const numbers = [1, 2, 3];
+
+letters.concat(numbers);
+// result in ['a', 'b', 'c', 1, 2, 3]
+```
+
+### Concatenando tres arrays
+
+En el siguiente código se concatenan tres arrays:
+
+```js
+const num1 = [1, 2, 3];
+const num2 = [4, 5, 6];
+const num3 = [7, 8, 9];
+
+const numbers = num1.concat(num2, num3);
+
+console.log(numbers);
+// results in [1, 2, 3, 4, 5, 6, 7, 8, 9]
+```
+
+### Concatenando valores a un array
+
+En el siguiente código se concatenan tres valores a un array:
+
+```js
+var alpha = ['a', 'b', 'c'];
+
+var alphaNumeric = alpha.concat(1, [2, 3]);
+
+console.log(alphaNumeric);
+// Da como resultado: ['a', 'b', 'c', 1, 2, 3]
+```
+
+### Concatenando arrays anidados
+
+En el siguiente código concatena arrays anidados y demuestra retención de referencias:
+
+```js
+var num1 = [[1]];
+var num2 = [2, [3]];
+
+var nums = num1.concat(num2);
+
+console.log(nums);
+// Da como resultado: [[1], 2, [3]]
+
+// modifica el primer elemento de num1
+num1[0].push(4);
+
+console.log(nums);
+// Da como resultado: [[1, 4], 2, [3]]
+```
+
+## Especificaciones
+
+| Especificación |
+| ------------------------------------------------------------------------------------------------------------ |
+| {{SpecName('ESDraft', '#sec-array.prototype.concat', 'Array.prototype.concat')}} |
+
+## Compatibilidad con navegadores
+
+{{Compat("javascript.builtins.Array.concat")}}
+
+## Ver también
+
+- {{jsxref("Array.push", "push")}} / {{jsxref("Array.pop", "pop")}} — añadir/eliminar elementos desde el fin del array
+- {{jsxref("Array.unshift", "unshift")}} / {{jsxref("Array.shift", "shift")}} — añadir/eliminar elementos desde el comienzo del array
+- {{jsxref("Array.splice", "splice")}} — añadir/eliminar elementos desde una posición específica del array
+- {{jsxref("String.prototype.concat()")}}
+- {{jsxref("Symbol.isConcatSpreadable")}} – controla el flattening (aplanamiento).
diff --git a/files/es/web/javascript/reference/global_objects/array/copywithin/index.html b/files/es/web/javascript/reference/global_objects/array/copywithin/index.html
deleted file mode 100644
index 509935babfeafa..00000000000000
--- a/files/es/web/javascript/reference/global_objects/array/copywithin/index.html
+++ /dev/null
@@ -1,166 +0,0 @@
----
-title: Array.prototype.copyWithin()
-slug: Web/JavaScript/Reference/Global_Objects/Array/copyWithin
-tags:
- - Array
- - ECMAScript 2015
- - JavaScript
- - Prototipo
- - Referencia
- - metodo
- - polyfill
-translation_of: Web/JavaScript/Reference/Global_Objects/Array/copyWithin
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/copyWithin
----
-{{JSRef}}
-
-El método copyWithin()
transfiere una copia plana de una sección a otra dentro del mismo array ( o contexto similar ), sin modificar su propiedad length y lo devuelve.
-
-{{EmbedInteractiveExample("pages/js/array-copywithin.html")}}
-
-Sintaxis
-
-arr.copyWithin(target)
-arr.copyWithin(target, start)
-arr.copyWithin(target, start, end)
-
-Parámetros
-
-
- target
- Índice basado en cero que establece en dónde dentro de la secuencia original se insertará la secuencia copiada. Si es negativo, target
se contará desde el final. -1 es el último elemento, -2 el penúltimo, etc.
- Si target
es igual o mayor que arr.length
, no se copiará nada. Si target
es posicionado después de start
, la secuencia copiada se recortará para que encaje con arr.length
.
- start
{{optional_inline}}
- Índice basado en cero a partir del cual comenzar la copia de elementos. Si es negativo, start comenzará a contarse desde el final.
- Si start
es omitido, copyWithin
copiará desde el principio (por defecto es 0).
- end
{{optional_inline}}
- Índice basado en cero hasta el cual se copiarán los elementos. copyWithin
copiará hasta pero sin incluir el end. Si es negativo, end
será contado desde el final.
- Si end
es omitido, copyWithin
copiará hasta el final ( por defecto es arr.length
).
-
-
-Valor de retorno
-
-El array modificado.
-
-Descripción
-
-copyWithin
es similar a la función memmove
de C y C++ , siendo altamente eficiente para desplazar los datos en un {{jsxref("Array")}} o {{jsxref("TypedArray")}}. La secuencia de datos es leída y escrita en una sola operación; la escritura será correcta incluso en el caso de que la zona de lectura y el destino de escritura se solapen.
-
-La función copyWithin
es intencionadamente genérica , permitiendo que se aplique en contextos en los cuales this
no sea necesariamente un objeto {{jsxref("Array")}}.
-
-El método copyWithin
es un método mutador. No altera la propiedad length
de this
, pero cambiará su contenido y creará nuevas propiedades si es necesario.
-
-Ejemplos
-
-En los siguientes ejemplos céntrate en los siguientes aspectos:
-
-
- El tamaño del contexto en el que se aplica no cambia. En los ejemplos el array parte con cinco elementos y siempre mantiene cinco elementos.
- start
y end
trabajan juntos para decidir qué se copiará. Siempre tienen valor por defecto aunque omitas end
, o start
y end
.
- target
trabaja solo y debe especificarse. Indica el lugar para en el que la copia comenzará a sobreescribir datos existentes. Debe estar dentro de los límites en el contexto que se aplique.
- escribir arr.copyWithin( n )
es lo mismo que arr.copyWithin( n, 0, arr.length)
-
-
-[1, 2, 3, 4, 5].copyWithin(-2);
-// [1, 2, 3, 1, 2]
-
-[1, 2, 3, 4, 5].copyWithin(0, 3);
-// [4, 5, 3, 4, 5]
-
-[1, 2, 3, 4, 5].copyWithin(0, 3, 4);
-// [4, 2, 3, 4, 5]
-
-[1, 2, 3, 4, 5].copyWithin(-2, -3, -1);
-// [1, 2, 3, 3, 4]
-
-
-A continuación se aplica en el contexto de un objeto array-like :
-
-
- El objeto contextual tiene alguna propiedad con clave numérica, y una propiedad length. Esto es suficiente para considerarse array-like.
- observa que no se modifica la propiedad length, a pesar de que se ha introducido una nueva propiedad con clave 0. A esto ser refiere cuando se dice que copyWithin
es un método mutador . ¿Por qué se creó esta nueva propiedad? porque mediante el argumento target se especificó que la copia debía comenzar a partir de un índice que ¡¡no existía!!
-
-
-[].copyWithin.call({length: 5, 3: 1}, 0, 3);
-// {0: 1, 3: 1, length: 5}
-
-
-
-Lo que sigue ahora son las subclases tipadas de Array en ES6:
-
-// Arrays tipados en ES6. Son subclases de Array
-var i32a = new Int32Array([1, 2, 3, 4, 5]);
-
-i32a.copyWithin(0, 2);
-// Int32Array [3, 4, 5, 4, 5]
-
-// En plataformas que todavía no siguen la norma ES6:
-[].copyWithin.call(new Int32Array([1, 2, 3, 4, 5]), 0, 3, 4);
-// Int32Array [4, 2, 3, 4, 5]
-
-Polyfill
-
-if (!Array.prototype.copyWithin) {
- Array.prototype.copyWithin =
- // Array: Number[, Number[, Number]]
- function copyWithin(target, start, stop) {
- var positiveT = target >= 0,
- positiveS = (start = start | 0) >= 0,
- length = this.length,
- zero = 0,
- r = function() {return ((+new Date) * Math.random()).toString(36)},
- delimiter = "\b" + r() + "-" + r() + "-" + r() + "\b",
- hold;
-
- stop = stop || this.length;
- hold = this.slice.apply(this,
- positiveT?
- [start, stop]:
- positiveS?
- [start, -target]:
- [start])
- .join(delimiter);
-
- return this.splice.apply(this,
- positiveT?
- [target, stop - start, hold]:
- positiveS?
- [target, stop, hold]:
- [target, start, hold]),
- this.join(delimiter).split(delimiter).slice(zero, length);
- }
-}
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES6', '#sec-array.prototype.copyWithin', 'Array.prototype.copyWithin')}}
- {{Spec2('ES6')}}
- Definición inicial.
-
-
- {{SpecName('ESDraft', '#sec-array.prototype.copyWithin', 'Array.prototype.copyWithin')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad con navegadores
-
-
-
{{Compat("javascript.builtins.Array.copyWithin")}}
-
-
-Ver también
-
-
diff --git a/files/es/web/javascript/reference/global_objects/array/copywithin/index.md b/files/es/web/javascript/reference/global_objects/array/copywithin/index.md
new file mode 100644
index 00000000000000..17e09c61985a93
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/array/copywithin/index.md
@@ -0,0 +1,156 @@
+---
+title: Array.prototype.copyWithin()
+slug: Web/JavaScript/Reference/Global_Objects/Array/copyWithin
+tags:
+ - Array
+ - ECMAScript 2015
+ - JavaScript
+ - Prototipo
+ - Referencia
+ - metodo
+ - polyfill
+translation_of: Web/JavaScript/Reference/Global_Objects/Array/copyWithin
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/copyWithin
+---
+{{JSRef}}
+
+El método **`copyWithin()`** transfiere una copia plana de una sección a otra dentro del mismo array ( o contexto similar ), sin modificar su propiedad length y lo devuelve.
+
+{{EmbedInteractiveExample("pages/js/array-copywithin.html")}}
+
+## Sintaxis
+
+```
+arr.copyWithin(target)
+arr.copyWithin(target, start)
+arr.copyWithin(target, start, end)
+```
+
+### Parámetros
+
+- `target`
+
+ - : Índice basado en cero que establece en dónde dentro de la secuencia original se insertará la secuencia copiada. Si es negativo, `target` se contará desde el final. -1 es el último elemento, -2 el penúltimo, etc.
+
+ Si `target` es igual o mayor que `arr.length`, no se copiará nada. Si `target` es posicionado después de `start`, la secuencia copiada se recortará para que encaje con `arr.length`.
+
+- `start` {{optional_inline}}
+
+ - : Índice basado en cero a partir del cual comenzar la copia de elementos. Si es negativo, start comenzará a contarse desde el final.
+
+ Si `start` es omitido, `copyWithin` copiará desde el principio (por defecto es 0).
+
+- `end` {{optional_inline}}
+
+ - : Índice basado en cero hasta el cual se copiarán los elementos. `copyWithin` copiará hasta pero sin incluir el end. Si es negativo, `end` será contado desde el final.
+
+ Si `end` es omitido, `copyWithin` copiará hasta el final ( por defecto es `arr.length`).
+
+### Valor de retorno
+
+El array modificado.
+
+## Descripción
+
+`copyWithin` es similar a la función `memmove` de C y C++ , siendo altamente eficiente para desplazar los datos en un {{jsxref("Array")}} o {{jsxref("TypedArray")}}. La secuencia de datos es leída y escrita en una sola operación; la escritura será correcta incluso en el caso de que la zona de lectura y el destino de escritura se solapen.
+
+La función `copyWithin` es intencionadamente _genérica_, permitiendo que se aplique en contextos en los cuales `this` no sea necesariamente un objeto {{jsxref("Array")}}.
+
+El método `copyWithin` es un método mutador. No altera la propiedad `length` de `this`, pero cambiará su contenido y creará nuevas propiedades si es necesario.
+
+## Ejemplos
+
+En los siguientes ejemplos céntrate en los siguientes aspectos:
+
+- El tamaño del contexto en el que se aplica no cambia. En los ejemplos el array parte con cinco elementos y siempre mantiene cinco elementos.
+- `start` y `end` trabajan juntos para decidir qué se copiará. Siempre tienen valor por defecto aunque omitas `end`, o `start` y `end`.
+- `target` trabaja solo y debe especificarse. Indica el lugar para en el que la copia comenzará a sobreescribir datos existentes. Debe estar dentro de los límites en el contexto que se aplique.
+- escribir `arr.copyWithin( n )`es lo mismo que `arr.copyWithin( n, 0, arr.length)`
+
+```js
+[1, 2, 3, 4, 5].copyWithin(-2);
+// [1, 2, 3, 1, 2]
+
+[1, 2, 3, 4, 5].copyWithin(0, 3);
+// [4, 5, 3, 4, 5]
+
+[1, 2, 3, 4, 5].copyWithin(0, 3, 4);
+// [4, 2, 3, 4, 5]
+
+[1, 2, 3, 4, 5].copyWithin(-2, -3, -1);
+// [1, 2, 3, 3, 4]
+```
+
+A continuación se aplica en el contexto de un objeto **array-like**:
+
+- El objeto contextual tiene alguna propiedad con clave numérica, y una propiedad length. Esto es suficiente para considerarse array-like.
+- observa que **no** se modifica la propiedad length, a pesar de que se ha introducido una nueva propiedad con clave 0. A esto ser refiere cuando se dice que `copyWithin` es un método **mutador**. ¿Por qué se creó esta nueva propiedad? porque mediante el argumento target se especificó que la copia debía comenzar a partir de un índice que ¡¡no existía!!
+
+```js
+[].copyWithin.call({length: 5, 3: 1}, 0, 3);
+// {0: 1, 3: 1, length: 5}
+```
+
+Lo que sigue ahora son las subclases tipadas de Array en ES6:
+
+```js
+// Arrays tipados en ES6. Son subclases de Array
+var i32a = new Int32Array([1, 2, 3, 4, 5]);
+
+i32a.copyWithin(0, 2);
+// Int32Array [3, 4, 5, 4, 5]
+
+// En plataformas que todavía no siguen la norma ES6:
+[].copyWithin.call(new Int32Array([1, 2, 3, 4, 5]), 0, 3, 4);
+// Int32Array [4, 2, 3, 4, 5]
+```
+
+## Polyfill
+
+```js
+if (!Array.prototype.copyWithin) {
+ Array.prototype.copyWithin =
+ // Array: Number[, Number[, Number]]
+ function copyWithin(target, start, stop) {
+ var positiveT = target >= 0,
+ positiveS = (start = start | 0) >= 0,
+ length = this.length,
+ zero = 0,
+ r = function() {return ((+new Date) * Math.random()).toString(36)},
+ delimiter = "\b" + r() + "-" + r() + "-" + r() + "\b",
+ hold;
+
+ stop = stop || this.length;
+ hold = this.slice.apply(this,
+ positiveT?
+ [start, stop]:
+ positiveS?
+ [start, -target]:
+ [start])
+ .join(delimiter);
+
+ return this.splice.apply(this,
+ positiveT?
+ [target, stop - start, hold]:
+ positiveS?
+ [target, stop, hold]:
+ [target, start, hold]),
+ this.join(delimiter).split(delimiter).slice(zero, length);
+ }
+}
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| -------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------- |
+| {{SpecName('ES6', '#sec-array.prototype.copyWithin', 'Array.prototype.copyWithin')}} | {{Spec2('ES6')}} | Definición inicial. |
+| {{SpecName('ESDraft', '#sec-array.prototype.copyWithin', 'Array.prototype.copyWithin')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad con navegadores
+
+{{Compat("javascript.builtins.Array.copyWithin")}}
+
+## Ver también
+
+- {{jsxref("Array")}}
diff --git a/files/es/web/javascript/reference/global_objects/array/every/index.html b/files/es/web/javascript/reference/global_objects/array/every/index.html
deleted file mode 100644
index 37666f589deb02..00000000000000
--- a/files/es/web/javascript/reference/global_objects/array/every/index.html
+++ /dev/null
@@ -1,196 +0,0 @@
----
-title: Array.prototype.every()
-slug: Web/JavaScript/Reference/Global_Objects/Array/every
-tags:
- - Arreglo
- - ECMAScript 5
- - JavaScript
- - Prototipo
- - metodo
- - polyfill
-translation_of: Web/JavaScript/Reference/Global_Objects/Array/every
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/every
----
-{{JSRef}}
-
-Determina si todos los elementos en el array satisfacen una condición.
-
-
-
Precaución : ¡Llamar este método en un array vacío devuelve true
para cualquier condición!
-
-
-{{EmbedInteractiveExample("pages/js/array-every.html")}}
-
-La fuente de este ejemplo interactivo se encuentra en GitHub. Si desea contribuir con el proyecto de ejemplos interactivos, clone https://github.com/mdn/interactive-examples y envíenos unpull request .
-
-Sintaxis
-
-arr .every(callback (element [, index [, array ]])[, thisArg ])
-
-Parámetros
-
-
- callback
- Una función para probar cada elemento; recibe tres argumentos:
-
- currentValue
(required)
- El elemento actual del arreglo que está siendo procesado.
- index
{{Optional_inline}}
- El índice del elemento actual del arreglo que está siendo procesado.
- array
{{Optional_inline}}
- El arreglo sobre el cual fue llamado every
.
-
-
- thisArg
{{Optional_inline}}
- Valor por usar como this
cuando se ejecute callback
.
-
-
-Valor de retorno
-
-true
si la función de devolución de llamada devuelve un valor de {{Glossary("truthy")}} para cada elemento de matriz; de lo contrario, false
.
-
-Descripción
-
-El método every
ejecuta la función callback
dada una vez por cada elemento presente en el arreglo hasta encontrar uno que haga retornar un valor falso a callback
(un valor que resulte falso cuando se convierta a booleano). Si no se encuentra tal elemento, el método every
de inmediato retorna false
. O si callback
retorna verdadero para todos los elementos, every
retornará true
. callback
es llamada sólo para índices del arreglo que tengan valores asignados; no se llama para índices que hayan sido eliminados o a los que no se les haya asignado un valor.
-
-callback
es llamada con tres argumetos: el valor del elemento, el índice del elemento y el objeto Array que está siendo recorrido.
-
-Si se proporciona un parámetro thisArg
a every
, será pasado a la función callback
cuando sea llamada, usándolo como valor this
. En otro caso, se pasará el valor undefined
para que sea usado como valor this
. El valor this
observable por parte de callback
se determina de acuerdo a las normas usuales para determinar el this
visto por una función .
-
-every
no modifica el arreglo sobre el cual es llamado.
-
-El intervalo de elementos procesados por every
se establece antes de la primera llamada a callback
. Los elementos que se agreguen al arreglo después de que la función every
comience no serán vistos por la función callback
. Si se modifican elementos existentes en el arreglo, su valor cuando sea pasado a callback
será el valor que tengan cuando sean visitados; los elementos que se eliminen no serán visitados.
-
-every
opera como el cuantificador "para todo" en matemáticas. En particular con el arreglo vacío retorna true. (es una verdad vacua que todos los elementos del conjunto vacío satisfacen una condición dada.)
-
-Ejemplos
-
-Probando el tamaño de todos los elementos de un arreglo
-
-El siguiente ejemplo prueba si todos los elementos de un arreglo son mayores que 10.
-
-function esSuficientementeGrande(elemento, indice, arrreglo) {
- return elemento >= 10;
-}
-[12, 5, 8, 130, 44].every(esSuficientementeGrande); // false
-[12, 54, 18, 130, 44].every(esSuficientementeGrande); // true
-
-
-Usar funciones flecha
-
-Las funciones flecha proveen una sintaxis más corta para la misma prueba.
-
-[12, 5, 8, 130, 44].every(elem => elem >= 10); // false
-[12, 54, 18, 130, 44].every(elem => elem >= 10); // true
-
-Polyfill
-
-every
fue añadida a la norma ECMA-262 en la 5ta edición; por lo que podría no estar presente en otras implementaciones de la norma. Puede sobrellevarlo insertando el siguiente código al comienzo de su programa, permitiendo el uso de every
en implementación que no lo soporten de manera nativa. Este algoritmo es exactamente el especificado en ECMA-262, 5ta edición, suponiendo que Object
y TypeError
tienen sus valores originales y que callbackfn.call
evalua al valor original de {{jsxref("Function.prototype.call")}}
-
-if (!Array.prototype.every) {
- Array.prototype.every = function(callbackfn, thisArg) {
- 'use strict';
- var T, k;
-
- if (this == null) {
- throw new TypeError('this is null or not defined');
- }
-
- // 1. Let O be the result of calling ToObject passing the this
- // value as the argument.
- var O = Object(this);
-
- // 2. Let lenValue be the result of calling the Get internal method
- // of O with the argument "length".
- // 3. Let len be ToUint32(lenValue).
- var len = O.length >>> 0;
-
- // 4. If IsCallable(callbackfn) is false, throw a TypeError exception.
- if (typeof callbackfn !== 'function') {
- throw new TypeError();
- }
-
- // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
- if (arguments.length > 1) {
- T = thisArg;
- }
-
- // 6. Let k be 0.
- k = 0;
-
- // 7. Repeat, while k < len
- while (k < len) {
-
- var kValue;
-
- // a. Let Pk be ToString(k).
- // This is implicit for LHS operands of the in operator
- // b. Let kPresent be the result of calling the HasProperty internal
- // method of O with argument Pk.
- // This step can be combined with c
- // c. If kPresent is true, then
- if (k in O) {
-
- // i. Let kValue be the result of calling the Get internal method
- // of O with argument Pk.
- kValue = O[k];
-
- // ii. Let testResult be the result of calling the Call internal method
- // of callbackfn with T as the this value and argument list
- // containing kValue, k, and O.
- var testResult = callbackfn.call(T, kValue, k, O);
-
- // iii. If ToBoolean(testResult) is false, return false.
- if (!testResult) {
- return false;
- }
- }
- k++;
- }
- return true;
- };
-}
-
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES5.1', '#sec-15.4.4.16', 'Array.prototype.every')}}
- {{Spec2('ES5.1')}}
- Initial definition. Implemented in JavaScript 1.6.
-
-
- {{SpecName('ES6', '#sec-array.prototype.every', 'Array.prototype.every')}}
- {{Spec2('ES6')}}
-
-
-
- {{SpecName('ESDraft', '#sec-array.prototype.every', 'Array.prototype.every')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad con navegadores
-
-
-
{{Compat("javascript.builtins.Array.every")}}
-
-
-
-
-Ver también
-
-
- {{jsxref("Array.prototype.forEach()")}}
- {{jsxref("Array.prototype.some()")}}
- {{jsxref("TypedArray.prototype.every()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/array/every/index.md b/files/es/web/javascript/reference/global_objects/array/every/index.md
new file mode 100644
index 00000000000000..16cbc85025fe72
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/array/every/index.md
@@ -0,0 +1,173 @@
+---
+title: Array.prototype.every()
+slug: Web/JavaScript/Reference/Global_Objects/Array/every
+tags:
+ - Arreglo
+ - ECMAScript 5
+ - JavaScript
+ - Prototipo
+ - metodo
+ - polyfill
+translation_of: Web/JavaScript/Reference/Global_Objects/Array/every
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/every
+---
+{{JSRef}}
+
+Determina si todos los elementos en el array satisfacen una condición.
+
+> **Nota:** **Precaución**: ¡Llamar este método en un array vacío devuelve `true` para cualquier condición!
+
+{{EmbedInteractiveExample("pages/js/array-every.html")}}
+
+La fuente de este ejemplo interactivo se encuentra en GitHub. Si desea contribuir con el proyecto de ejemplos interactivos, clone y envíenos un*pull* _request_.
+
+## Sintaxis
+
+```
+arr.every(callback(element[, index[, array]])[, thisArg])
+```
+
+### Parámetros
+
+- `callback`
+
+ - : Una función para probar cada elemento; recibe tres argumentos:
+
+ - `currentValue` (required)
+ - : El elemento actual del arreglo que está siendo procesado.
+ - `index` {{Optional_inline}}
+ - : El índice del elemento actual del arreglo que está siendo procesado.
+ - `array` {{Optional_inline}}
+ - : El arreglo sobre el cual fue llamado `every`.
+
+- `thisArg` {{Optional_inline}}
+ - : Valor por usar como `this` cuando se ejecute `callback`.
+
+### Valor de retorno
+
+`true` si la función de devolución de llamada devuelve un valor de {{Glossary("truthy")}} para cada elemento de matriz; de lo contrario, `false`.
+
+## Descripción
+
+El método `every` ejecuta la función `callback` dada una vez por cada elemento presente en el arreglo hasta encontrar uno que haga retornar un valor falso a `callback` (un valor que resulte falso cuando se convierta a booleano). Si no se encuentra tal elemento, el método `every` de inmediato retorna `false`. O si `callback` retorna verdadero para todos los elementos, `every` retornará `true`. `callback` es llamada sólo para índices del arreglo que tengan valores asignados; no se llama para índices que hayan sido eliminados o a los que no se les haya asignado un valor.
+
+`callback` es llamada con tres argumetos: el valor del elemento, el índice del elemento y el objeto Array que está siendo recorrido.
+
+Si se proporciona un parámetro `thisArg` a `every`, será pasado a la función `callback` cuando sea llamada, usándolo como valor `this`. En otro caso, se pasará el valor `undefined` para que sea usado como valor `this`. El valor `this` observable por parte de `callback` se determina de acuerdo a [las normas usuales para determinar el `this` visto por una función](/es/docs/Web/JavaScript/Reference/Operators/this).
+
+`every` no modifica el arreglo sobre el cual es llamado.
+
+El intervalo de elementos procesados por `every` se establece antes de la primera llamada a `callback`. Los elementos que se agreguen al arreglo después de que la función `every` comience no serán vistos por la función `callback`. Si se modifican elementos existentes en el arreglo, su valor cuando sea pasado a `callback` será el valor que tengan cuando sean visitados; los elementos que se eliminen no serán visitados.
+
+`every` opera como el cuantificador "para todo" en matemáticas. En particular con el arreglo vacío retorna true. (es una [verdad vacua](http://en.wikipedia.org/wiki/Vacuous_truth#Vacuous_truths_in_mathematics) que todos los elementos del [conjunto vacío](http://en.wikipedia.org/wiki/Empty_set#Common_problems) satisfacen una condición dada.)
+
+## Ejemplos
+
+### Probando el tamaño de todos los elementos de un arreglo
+
+El siguiente ejemplo prueba si todos los elementos de un arreglo son mayores que 10.
+
+```js
+function esSuficientementeGrande(elemento, indice, arrreglo) {
+ return elemento >= 10;
+}
+[12, 5, 8, 130, 44].every(esSuficientementeGrande); // false
+[12, 54, 18, 130, 44].every(esSuficientementeGrande); // true
+```
+
+### Usar funciones flecha
+
+Las [funciones flecha](/es/docs/Web/JavaScript/Reference/Functions/Arrow_functions) proveen una sintaxis más corta para la misma prueba.
+
+```js
+[12, 5, 8, 130, 44].every(elem => elem >= 10); // false
+[12, 54, 18, 130, 44].every(elem => elem >= 10); // true
+```
+
+## Polyfill
+
+`every` fue añadida a la norma ECMA-262 en la 5ta edición; por lo que podría no estar presente en otras implementaciones de la norma. Puede sobrellevarlo insertando el siguiente código al comienzo de su programa, permitiendo el uso de `every` en implementación que no lo soporten de manera nativa. Este algoritmo es exactamente el especificado en ECMA-262, 5ta edición, suponiendo que `Object` y `TypeError` tienen sus valores originales y que `callbackfn.call` evalua al valor original de {{jsxref("Function.prototype.call")}}
+
+```js
+if (!Array.prototype.every) {
+ Array.prototype.every = function(callbackfn, thisArg) {
+ 'use strict';
+ var T, k;
+
+ if (this == null) {
+ throw new TypeError('this is null or not defined');
+ }
+
+ // 1. Let O be the result of calling ToObject passing the this
+ // value as the argument.
+ var O = Object(this);
+
+ // 2. Let lenValue be the result of calling the Get internal method
+ // of O with the argument "length".
+ // 3. Let len be ToUint32(lenValue).
+ var len = O.length >>> 0;
+
+ // 4. If IsCallable(callbackfn) is false, throw a TypeError exception.
+ if (typeof callbackfn !== 'function') {
+ throw new TypeError();
+ }
+
+ // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
+ if (arguments.length > 1) {
+ T = thisArg;
+ }
+
+ // 6. Let k be 0.
+ k = 0;
+
+ // 7. Repeat, while k < len
+ while (k < len) {
+
+ var kValue;
+
+ // a. Let Pk be ToString(k).
+ // This is implicit for LHS operands of the in operator
+ // b. Let kPresent be the result of calling the HasProperty internal
+ // method of O with argument Pk.
+ // This step can be combined with c
+ // c. If kPresent is true, then
+ if (k in O) {
+
+ // i. Let kValue be the result of calling the Get internal method
+ // of O with argument Pk.
+ kValue = O[k];
+
+ // ii. Let testResult be the result of calling the Call internal method
+ // of callbackfn with T as the this value and argument list
+ // containing kValue, k, and O.
+ var testResult = callbackfn.call(T, kValue, k, O);
+
+ // iii. If ToBoolean(testResult) is false, return false.
+ if (!testResult) {
+ return false;
+ }
+ }
+ k++;
+ }
+ return true;
+ };
+}
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| -------------------------------------------------------------------------------------------------------- | ---------------------------- | -------------------------------------------------- |
+| {{SpecName('ES5.1', '#sec-15.4.4.16', 'Array.prototype.every')}} | {{Spec2('ES5.1')}} | Initial definition. Implemented in JavaScript 1.6. |
+| {{SpecName('ES6', '#sec-array.prototype.every', 'Array.prototype.every')}} | {{Spec2('ES6')}} | |
+| {{SpecName('ESDraft', '#sec-array.prototype.every', 'Array.prototype.every')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad con navegadores
+
+{{Compat("javascript.builtins.Array.every")}}
+
+## Ver también
+
+- {{jsxref("Array.prototype.forEach()")}}
+- {{jsxref("Array.prototype.some()")}}
+- {{jsxref("TypedArray.prototype.every()")}}
diff --git a/files/es/web/javascript/reference/global_objects/array/filter/index.html b/files/es/web/javascript/reference/global_objects/array/filter/index.html
deleted file mode 100644
index a14c99db69cfa9..00000000000000
--- a/files/es/web/javascript/reference/global_objects/array/filter/index.html
+++ /dev/null
@@ -1,232 +0,0 @@
----
-title: Array.prototype.filter()
-slug: Web/JavaScript/Reference/Global_Objects/Array/filter
-tags:
- - Array
- - ECMAScript 5
- - JavaScript
- - Prototipo
- - Referencia
- - metodo
- - polyfill
-translation_of: Web/JavaScript/Reference/Global_Objects/Array/filter
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/filter
----
-{{JSRef}}
-
-El método filter()
crea un nuevo array con todos los elementos que cumplan la condición implementada por la función dada.
-
-{{EmbedInteractiveExample("pages/js/array-filter.html")}}
-
-Sintaxis
-
-var newArray = arr .filter(callback(currentValue[, index[, array]]) [, thisArg ])
-
-Parámetros
-
-
- callback
- Función que comprueba cada elemento del array para ver si cumple la condición (también llamada predicado). Retorna true
si el elemento la cumple o en caso contrario retornará false
. Acepta tres parámetros:
-
-
- currentValue
- El elemento actual del array que está siendo procesado.
- index
{{optional_inline}}
- El índice del elemento actual del array que está siendo procesado.
- array
{{optional_inline}}
- El array sobre el que se ha llamado filter
.
-
-
- thisArg
{{optional_inline}}
- Opcional. Valor a utilizar como this
cuando se ejecuta callback
.
-
-
-Valor devuelto
-
-Un nuevo array con los elementos que cumplen la condición. Si ningún elemento cumple la condición, se devolverá un array vacío.
-
-Descripción
-
-filter()
llama a la función callback
sobre cada elemento del array, y construye un nuevo array con todos los valores para los cuales callback
devuelve un valor verdadero. callback
es invocada sólo para índices del array que tengan un valor asignado. No se invoca sobre índices que hayan sido borrados o a los que no se les haya asignado algún valor. Los elementos del array que no cumplan la condición callback
simplemente los salta, y no son incluidos en el nuevo array.
-
-callback
se invoca con tres argumentos:
-
-
- El valor de cada elemento
- El índice del elemento
- El objeto Array que se está recorriendo
-
-
-Si se proporciona un parámetro thisArg
a filter()
, este será pasado a callback
cuando sea invocado, para usarlo como valor this
. De lo contrario, se pasará el valor undefined
como valor this
. El valor this
dentro del callback
se determina conforme a las las normas habituales para determinar el this visto por una función.
-
-filter()
no hace mutar el array sobre el cual es llamado.
-
-El rango de elementos procesados por filter()
se establece antes de la primera invocación de callback
. Los elementos que se añadan al array después de que comience la llamada a filter()
no serán visitados por callback
. Si se modifica o elimina un elemento existente del array, cuando pase su valor a callback
será el que tenga cuando filter()
lo recorra; los elementos que son eliminados no son recorridos.
-
-Ejemplos
-
-Filtrando todos los valores pequeños
-
-El siguiente ejemplo usa filter()
para crear un array filtrado que excluye todos los elementos con valores inferiores a 10.
-
-function esSuficientementeGrande(elemento) {
- return elemento >= 10;
-}
-var filtrados = [12, 5, 8, 130, 44].filter(esSuficientementeGrande);
-// filtrados es [12, 130, 44]
-
-
-Filtrando entradas inválidas desde un JSON
-
-El siguiente ejemplo emplea filter()
para crear un json filtrado con todos lo elementos que tengan id numérico distinto de cero.
-
-var arr = [
- { id: 15 },
- { id: -1 },
- { id: 0 },
- { id: 3 },
- { id: 12.2 },
- { },
- { id: null },
- { id: NaN },
- { id: 'undefined' }
-];
-
-var entradasInvalidas = 0;
-// Si el elemento tiene un atributo id, y su valor correspondiente es un numero
-// Y no es el valor NaN, entonces es una entrada válida
-function filtrarPorID(obj) {
- if ('id' in obj && typeof(obj.id) === 'number' && !isNaN(obj.id)) {
- return true;
- } else {
- entradasInvalidas++;
- return false;
- }
-}
-
-var arrPorID = arr.filter(filtrarPorID);
-
-console.log('Array Filtrado\n', arrPorID);
-// [{ id: 15 }, { id: -1 }, { id: 0 }, { id: 3 }, { id: 12.2 }]
-
-console.log('Número de Entradas Invalidas = ', entradasInvalidas);
-// 4
-
-Búsqueda en el arreglo
-
-El siguiente ejemplo emplea filter() para filtrar el contendio de un arreglo en función de un criterio de búsqueda.
-
-var fruits = ['apple', 'banana', 'grapes', 'mango', 'orange'];
-
-/**
- * Filtra la matríz en función de un criterio de búsqueda (query)
- */
-function filterItems(query) {
- return fruits.filter(function(el) {
- return el.toLowerCase().indexOf(query.toLowerCase()) > -1;
- })
-}
-
-console.log(filterItems('ap')); // ['apple', 'grapes']
-console.log(filterItems('an')); // ['banana', 'mango', 'orange']
-
-Implementación en ES2015
-
-const fruits = ['apple', 'banana', 'grapes', 'mango', 'orange'];
-
-/**
- * Filtra la matríz en función de un criterio de búsqueda (query)
- */
-const filterItems = query => {
- return fruits.filter((el) =>
- el.toLowerCase().indexOf(query.toLowerCase()) > -1
- );
-}
-
-console.log(filterItems('ap')); // ['apple', 'grapes']
-console.log(filterItems('an')); // ['banana', 'mango', 'orange']
-
-Polyfill
-
-filter()
se añadió a la norma ECMA-262 en la 5ta edición; como tal puede no estar presente en todas las implementaciones de la norma. Puedes sobrellevarlo insertando el siguiente código al comienzo de su programa, para permitir el uso de filter()
en implementaciones de ECMA-262 que no lo soporten de forma nativa. Este algoritmo es exactamente el especificado en ECMA-262, 5ta edición, supone que fn.call
evalua al valor original de {{jsxref("Function.prototype.call")}}, y que {{jsxref("Array.prototype.push")}} tiene su valor original.
-
-if (!Array.prototype.filter){
- Array.prototype.filter = function(func, thisArg) {
- 'use strict';
- if ( ! ((typeof func === 'Function' || typeof func === 'function') && this) )
- throw new TypeError();
-
- var len = this.length >>> 0,
- res = new Array(len), // preallocate array
- t = this, c = 0, i = -1;
-
- var kValue;
- if (thisArg === undefined){
- while (++i !== len){
- // checks to see if the key was set
- if (i in this){
- kValue = t[i]; // in case t is changed in callback
- if (func(t[i], i, t)){
- res[c++] = kValue;
- }
- }
- }
- }
- else{
- while (++i !== len){
- // checks to see if the key was set
- if (i in this){
- kValue = t[i];
- if (func.call(thisArg, t[i], i, t)){
- res[c++] = kValue;
- }
- }
- }
- }
-
- res.length = c; // shrink down array to proper size
- return res;
- };
-}
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES5.1', '#sec-15.4.4.20', 'Array.prototype.filter')}}
- {{Spec2('ES5.1')}}
- Definición Inicial. Implementado en JavaScript 1.6.
-
-
- {{SpecName('ES6', '#sec-array.prototype.filter', 'Array.prototype.filter')}}
- {{Spec2('ES6')}}
-
-
-
- {{SpecName('ESDraft', '#sec-array.prototype.filter', 'Array.prototype.filter')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad con navegadores
-
-
-
{{Compat("javascript.builtins.Array.filter")}}
-
-
-Ver también
-
-
- {{jsxref("Array.prototype.forEach()")}}
- {{jsxref("Array.prototype.every()")}}
- {{jsxref("Array.prototype.some()")}}
- {{jsxref("Array.prototype.reduce()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/array/filter/index.md b/files/es/web/javascript/reference/global_objects/array/filter/index.md
new file mode 100644
index 00000000000000..54744271033c38
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/array/filter/index.md
@@ -0,0 +1,215 @@
+---
+title: Array.prototype.filter()
+slug: Web/JavaScript/Reference/Global_Objects/Array/filter
+tags:
+ - Array
+ - ECMAScript 5
+ - JavaScript
+ - Prototipo
+ - Referencia
+ - metodo
+ - polyfill
+translation_of: Web/JavaScript/Reference/Global_Objects/Array/filter
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/filter
+---
+{{JSRef}}
+
+El método **`filter()`** crea un nuevo array con todos los elementos que cumplan la condición implementada por la función dada.
+
+{{EmbedInteractiveExample("pages/js/array-filter.html")}}
+
+## Sintaxis
+
+```
+var newArray = arr.filter(callback(currentValue[, index[, array]])[, thisArg])
+```
+
+### Parámetros
+
+- `callback`
+
+ - : Función que **comprueba cada elemento** del array para ver si cumple la condición (también llamada predicado). Retorna `true` si el elemento la cumple o en caso contrario retornará `false`. Acepta tres parámetros:
+
+ - `currentValue`
+ - : El elemento actual del array que está siendo procesado.
+ - `index` {{optional_inline}}
+ - : El índice del elemento actual del array que está siendo procesado.
+ - `array` {{optional_inline}}
+ - : El array sobre el que se ha llamado `filter`.
+
+- `thisArg` {{optional_inline}}
+ - : Opcional. Valor a utilizar como `this` cuando se ejecuta `callback`.
+
+### Valor devuelto
+
+Un nuevo array con los elementos que cumplen la condición. Si ningún elemento cumple la condición, se devolverá un array vacío.
+
+## Descripción
+
+`filter()` llama a la función `callback` sobre cada elemento del array, y construye un nuevo array con todos los valores para los cuales `callback` devuelve un valor verdadero. `callback` es invocada sólo para índices del array que tengan un valor asignado. No se invoca sobre índices que hayan sido borrados o a los que no se les haya asignado algún valor. Los elementos del array que no cumplan la condición `callback` simplemente los salta, y no son incluidos en el nuevo array.
+
+`callback` se invoca con tres argumentos:
+
+1. El valor de cada elemento
+2. El índice del elemento
+3. El objeto Array que se está recorriendo
+
+Si se proporciona un parámetro `thisArg` a `filter()`, este será pasado a `callback` cuando sea invocado, para usarlo como valor `this`. De lo contrario, se pasará el valor `undefined` como valor `this`. El valor `this` dentro del `callback` se determina conforme a las [las normas habituales para determinar el _this_ visto por una función.](/es/docs/Web/JavaScript/Reference/Operators/this)
+
+`filter()` no hace mutar el array sobre el cual es llamado.
+
+El rango de elementos procesados por `filter()` se establece antes de la primera invocación de `callback`. Los elementos que se añadan al array después de que comience la llamada a `filter()` no serán visitados por `callback`. Si se modifica o elimina un elemento existente del array, cuando pase su valor a `callback` será el que tenga cuando `filter()` lo recorra; los elementos que son eliminados no son recorridos.
+
+## Ejemplos
+
+### Filtrando todos los valores pequeños
+
+El siguiente ejemplo usa `filter()` para crear un array filtrado que excluye todos los elementos con valores inferiores a 10.
+
+```js
+function esSuficientementeGrande(elemento) {
+ return elemento >= 10;
+}
+var filtrados = [12, 5, 8, 130, 44].filter(esSuficientementeGrande);
+// filtrados es [12, 130, 44]
+```
+
+### Filtrando entradas inválidas desde un JSON
+
+El siguiente ejemplo emplea `filter()` para crear un json filtrado con todos lo elementos que tengan id numérico distinto de cero.
+
+```js
+var arr = [
+ { id: 15 },
+ { id: -1 },
+ { id: 0 },
+ { id: 3 },
+ { id: 12.2 },
+ { },
+ { id: null },
+ { id: NaN },
+ { id: 'undefined' }
+];
+
+var entradasInvalidas = 0;
+// Si el elemento tiene un atributo id, y su valor correspondiente es un numero
+// Y no es el valor NaN, entonces es una entrada válida
+function filtrarPorID(obj) {
+ if ('id' in obj && typeof(obj.id) === 'number' && !isNaN(obj.id)) {
+ return true;
+ } else {
+ entradasInvalidas++;
+ return false;
+ }
+}
+
+var arrPorID = arr.filter(filtrarPorID);
+
+console.log('Array Filtrado\n', arrPorID);
+// [{ id: 15 }, { id: -1 }, { id: 0 }, { id: 3 }, { id: 12.2 }]
+
+console.log('Número de Entradas Invalidas = ', entradasInvalidas);
+// 4
+```
+
+### Búsqueda en el arreglo
+
+El siguiente ejemplo emplea filter() para filtrar el contendio de un arreglo en función de un criterio de búsqueda.
+
+```js
+var fruits = ['apple', 'banana', 'grapes', 'mango', 'orange'];
+
+/**
+ * Filtra la matríz en función de un criterio de búsqueda (query)
+ */
+function filterItems(query) {
+ return fruits.filter(function(el) {
+ return el.toLowerCase().indexOf(query.toLowerCase()) > -1;
+ })
+}
+
+console.log(filterItems('ap')); // ['apple', 'grapes']
+console.log(filterItems('an')); // ['banana', 'mango', 'orange']
+```
+
+### Implementación en ES2015
+
+```js
+const fruits = ['apple', 'banana', 'grapes', 'mango', 'orange'];
+
+/**
+ * Filtra la matríz en función de un criterio de búsqueda (query)
+ */
+const filterItems = query => {
+ return fruits.filter((el) =>
+ el.toLowerCase().indexOf(query.toLowerCase()) > -1
+ );
+}
+
+console.log(filterItems('ap')); // ['apple', 'grapes']
+console.log(filterItems('an')); // ['banana', 'mango', 'orange']
+```
+
+## Polyfill
+
+`filter()` se añadió a la norma ECMA-262 en la 5ta edición; como tal puede no estar presente en todas las implementaciones de la norma. Puedes sobrellevarlo insertando el siguiente código al comienzo de su programa, para permitir el uso de `filter()` en implementaciones de ECMA-262 que no lo soporten de forma nativa. Este algoritmo es exactamente el especificado en ECMA-262, 5ta edición, supone que `fn.call` evalua al valor original de {{jsxref("Function.prototype.call")}}, y que {{jsxref("Array.prototype.push")}} tiene su valor original.
+
+```
+if (!Array.prototype.filter){
+ Array.prototype.filter = function(func, thisArg) {
+ 'use strict';
+ if ( ! ((typeof func === 'Function' || typeof func === 'function') && this) )
+ throw new TypeError();
+
+ var len = this.length >>> 0,
+ res = new Array(len), // preallocate array
+ t = this, c = 0, i = -1;
+
+ var kValue;
+ if (thisArg === undefined){
+ while (++i !== len){
+ // checks to see if the key was set
+ if (i in this){
+ kValue = t[i]; // in case t is changed in callback
+ if (func(t[i], i, t)){
+ res[c++] = kValue;
+ }
+ }
+ }
+ }
+ else{
+ while (++i !== len){
+ // checks to see if the key was set
+ if (i in this){
+ kValue = t[i];
+ if (func.call(thisArg, t[i], i, t)){
+ res[c++] = kValue;
+ }
+ }
+ }
+ }
+
+ res.length = c; // shrink down array to proper size
+ return res;
+ };
+}
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| ------------------------------------------------------------------------------------------------------------ | ---------------------------- | --------------------------------------------------- |
+| {{SpecName('ES5.1', '#sec-15.4.4.20', 'Array.prototype.filter')}} | {{Spec2('ES5.1')}} | Definición Inicial. Implementado en JavaScript 1.6. |
+| {{SpecName('ES6', '#sec-array.prototype.filter', 'Array.prototype.filter')}} | {{Spec2('ES6')}} | |
+| {{SpecName('ESDraft', '#sec-array.prototype.filter', 'Array.prototype.filter')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad con navegadores
+
+{{Compat("javascript.builtins.Array.filter")}}
+
+## Ver también
+
+- {{jsxref("Array.prototype.forEach()")}}
+- {{jsxref("Array.prototype.every()")}}
+- {{jsxref("Array.prototype.some()")}}
+- {{jsxref("Array.prototype.reduce()")}}
diff --git a/files/es/web/javascript/reference/global_objects/array/flat/index.html b/files/es/web/javascript/reference/global_objects/array/flat/index.html
deleted file mode 100644
index d5a6c11f16ad2b..00000000000000
--- a/files/es/web/javascript/reference/global_objects/array/flat/index.html
+++ /dev/null
@@ -1,175 +0,0 @@
----
-title: Array.prototype.flat()
-slug: Web/JavaScript/Reference/Global_Objects/Array/flat
-tags:
- - Array
- - JavaScript
- - Prototipo
- - Referencia
- - metodo
-translation_of: Web/JavaScript/Reference/Global_Objects/Array/flat
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/flat
----
-{{JSRef}} {{SeeCompatTable}}
-
-El método flat()
crea una nueva matriz con todos los elementos de sub-array concatenados recursivamente hasta la profundidad especificada.
-
-\{{EmbedInteractiveExample("pages/js/array-flat.html")}}
-
-
-
-Sintaxis
-
-var newArray = arr .flat([depth] );
-
-Parámetros
-
-
- depth
{{optional_inline}}
- El nivel de profundidad que especifica qué tan profunda debe aplanarse una estructura de matriz anidada. El valor predeterminado es 1.
-
-
-Valor de retorno
-
-Una nueva matriz con los elementos de la sub-matriz concatenados en ella.
-
-Ejemplos
-
-Aplanar matrices anidadas
-
-var arr1 = [1, 2, [3, 4]];
-arr1.flat();
-// [1, 2, 3, 4]
-
-var arr2 = [1, 2, [3, 4, [5, 6]]];
-arr2.flat();
-// [1, 2, 3, 4, [5, 6]]
-
-var arr3 = [1, 2, [3, 4, [5, 6]]];
-arr3.flat(2);
-// [1, 2, 3, 4, 5, 6]
-
-
-Aplanamiento y huecos de matriz
-
-El método de aplanar elimina las ranuras vacías en las matrices:
-
-var arr4 = [1, 2, , 4, 5];
-arr4.flat();
-// [1, 2, 4, 5]
-
-
-Alternativa
-
-reduce
y concat
-
-var arr1 = [1, 2, [3, 4]];
-arr1.flat();
-
-//aplanar una matriz de nivel único
-arr1.reduce((acc, val) => acc.concat(val), []);// [1, 2, 3, 4]
-
-//o
-const flatSingle = arr => [].concat(...arr);
-
-
-
-
-//para permitir el aplanamiento a nivel profundo use recursión con reduce y concat
-var arr1 = [1,2,3,[1,2,3,4, [2,3,4]]];
-
-function flattenDeep(arr1) {
- return arr1.reduce((acc, val) => Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val), []);
-}
-flattenDeep(arr1); // [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
-
-
-
-
-//aplanamiento profundo no recursivo usando un stack
-var arr1 = [1,2,3,[1,2,3,4, [2,3,4]]];
-function flatten(input) {
- const stack = [...input];
- const res = [];
- while (stack.length) {
- // elimina ultimo valor del stack
- const next = stack.pop();
- if (Array.isArray(next)) {
- // agrega de nuevo los items al array, sin modificar la entrada original
- stack.push(...next);
- } else {
- res.push(next);
- }
- }
- //invierte para restaurar el orden de entrada
- return res.reverse();
-}
-flatten(arr1);// [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
-
-
-
-//Aplanamiento profundo recursivo
-function flatten(array) {
- var flattend = [];
- !(function flat(array) {
- array.forEach(function(el) {
- if (Array.isArray(el)) flat(el);
- else flattend.push(el);
- });
- })(array);
- return flattend;
-}
-
-
-
-Polyfill
-
-if (!Array.prototype.flat) {
- Array.prototype.flat = function(depth) {
- var flattend = [];
- (function flat(array, depth) {
- for (let el of array) {
- if (Array.isArray(el) && depth > 0) {
- flat(el, depth - 1);
- } else {
- flattend.push(el);
- }
- }
- })(this, Math.floor(depth) || 1);
- return flattend;
- };
-}
-
-Especificaciones
-
-
-
-Compatibilidad con navegadores
-
-
-
-
-
{{Compat("javascript.builtins.Array.flat")}}
-
-
-Ver también
-
-
- {{jsxref("Array.prototype.flatMap()")}}
- {{jsxref("Array.prototype.map()")}}
- {{jsxref("Array.prototype.reduce()")}}
- {{jsxref("Array.prototype.concat()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/array/flat/index.md b/files/es/web/javascript/reference/global_objects/array/flat/index.md
new file mode 100644
index 00000000000000..eb3699a56de589
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/array/flat/index.md
@@ -0,0 +1,158 @@
+---
+title: Array.prototype.flat()
+slug: Web/JavaScript/Reference/Global_Objects/Array/flat
+tags:
+ - Array
+ - JavaScript
+ - Prototipo
+ - Referencia
+ - metodo
+translation_of: Web/JavaScript/Reference/Global_Objects/Array/flat
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/flat
+---
+{{JSRef}} {{SeeCompatTable}}
+
+El método **`flat()`** crea una nueva matriz con todos los elementos de sub-array concatenados recursivamente hasta la profundidad especificada.
+
+\\{{EmbedInteractiveExample("pages/js/array-flat.html")}}
+
+## Sintaxis
+
+```
+var newArray = arr.flat([depth]);
+```
+
+### Parámetros
+
+- `depth` {{optional_inline}}
+ - : El nivel de profundidad que especifica qué tan profunda debe aplanarse una estructura de matriz anidada. El valor predeterminado es 1.
+
+### Valor de retorno
+
+Una nueva matriz con los elementos de la sub-matriz concatenados en ella.
+
+## Ejemplos
+
+### Aplanar matrices anidadas
+
+```js
+var arr1 = [1, 2, [3, 4]];
+arr1.flat();
+// [1, 2, 3, 4]
+
+var arr2 = [1, 2, [3, 4, [5, 6]]];
+arr2.flat();
+// [1, 2, 3, 4, [5, 6]]
+
+var arr3 = [1, 2, [3, 4, [5, 6]]];
+arr3.flat(2);
+// [1, 2, 3, 4, 5, 6]
+```
+
+### Aplanamiento y huecos de matriz
+
+El método de aplanar elimina las ranuras vacías en las matrices:
+
+```js
+var arr4 = [1, 2, , 4, 5];
+arr4.flat();
+// [1, 2, 4, 5]
+```
+
+## Alternativa
+
+### `reduce` y `concat`
+
+```js
+var arr1 = [1, 2, [3, 4]];
+arr1.flat();
+
+//aplanar una matriz de nivel único
+arr1.reduce((acc, val) => acc.concat(val), []);// [1, 2, 3, 4]
+
+//o
+const flatSingle = arr => [].concat(...arr);
+```
+
+```js
+//para permitir el aplanamiento a nivel profundo use recursión con reduce y concat
+var arr1 = [1,2,3,[1,2,3,4, [2,3,4]]];
+
+function flattenDeep(arr1) {
+ return arr1.reduce((acc, val) => Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val), []);
+}
+flattenDeep(arr1); // [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
+```
+
+```js
+//aplanamiento profundo no recursivo usando un stack
+var arr1 = [1,2,3,[1,2,3,4, [2,3,4]]];
+function flatten(input) {
+ const stack = [...input];
+ const res = [];
+ while (stack.length) {
+ // elimina ultimo valor del stack
+ const next = stack.pop();
+ if (Array.isArray(next)) {
+ // agrega de nuevo los items al array, sin modificar la entrada original
+ stack.push(...next);
+ } else {
+ res.push(next);
+ }
+ }
+ //invierte para restaurar el orden de entrada
+ return res.reverse();
+}
+flatten(arr1);// [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
+```
+
+```js
+//Aplanamiento profundo recursivo
+function flatten(array) {
+ var flattend = [];
+ !(function flat(array) {
+ array.forEach(function(el) {
+ if (Array.isArray(el)) flat(el);
+ else flattend.push(el);
+ });
+ })(array);
+ return flattend;
+}
+```
+
+## Polyfill
+
+```js
+if (!Array.prototype.flat) {
+ Array.prototype.flat = function(depth) {
+ var flattend = [];
+ (function flat(array, depth) {
+ for (let el of array) {
+ if (Array.isArray(el) && depth > 0) {
+ flat(el, depth - 1);
+ } else {
+ flattend.push(el);
+ }
+ }
+ })(this, Math.floor(depth) || 1);
+ return flattend;
+ };
+}
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| ---------------------------------------------------------------------------------------------------- | -------------- | ---------- |
+| [`Array.prototype.flat` proposal](https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flat) | Finalizado (4) | |
+
+## Compatibilidad con navegadores
+
+{{Compat("javascript.builtins.Array.flat")}}
+
+## Ver también
+
+- {{jsxref("Array.prototype.flatMap()")}}
+- {{jsxref("Array.prototype.map()")}}
+- {{jsxref("Array.prototype.reduce()")}}
+- {{jsxref("Array.prototype.concat()")}}
diff --git a/files/es/web/javascript/reference/global_objects/array/flatmap/index.html b/files/es/web/javascript/reference/global_objects/array/flatmap/index.html
deleted file mode 100644
index db07444a8200b5..00000000000000
--- a/files/es/web/javascript/reference/global_objects/array/flatmap/index.html
+++ /dev/null
@@ -1,129 +0,0 @@
----
-title: Array.prototype.flatMap()
-slug: Web/JavaScript/Reference/Global_Objects/Array/flatMap
-tags:
- - Array
- - JavaScript
- - Prototipo
- - Referencia
- - metodo
-translation_of: Web/JavaScript/Reference/Global_Objects/Array/flatMap
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/flatMap
----
-{{JSRef}} {{SeeCompatTable}}
-
-El método flatMap()
primero mapea cada elemento usando una función de mapeo, luego aplana el resultado en una nueva matriz. Es idéntico a un map seguido de un flatten de profundidad 1, pero flatMap
es a menudo útil y la fusión de ambos en un método es ligeramente más eficiente.
-
-\{{EmbedInteractiveExample("pages/js/array-flatmap.html")}}
-
-La fuente de este ejemplo interactivo, se almacena en un repositorio de GitHub. Si desea contribuir al proyecto de ejemplos interactivos, clone https://github.com/mdn/interactive-examples y envíenos una solicitud de extracción.
-
-Sintaxis
-
-var new_array = arr .flatMap(function callback(currentValue[, index[, array]]) {
- // return element for new_array
-} [, thisArg ])
-
-Parámetros
-
-
- callback
- Función que produce un elemento de la nueva matriz, tomando tres argumentos:
-
-
- currentValue
- El elemento actual que se procesa en la matriz.
- index
{{optional_inline}}
- El índice del elemento actual que se procesa en la matriz.
- array
{{optional_inline}}
- La matriz map
fue llamada.
-
-
- thisArg
{{optional_inline}}
- Valor para usar como this
al ejecutar callback
.
-
-
-Valor de retorno
-
-Una nueva matriz con cada elemento es el resultado de la función de devolución de llamada y se aplana a una profundidad de 1.
-
-Descripción
-
-Ver {{jsxref("Array.prototype.map()")}} para una descripción detallada de la función de devolución de llamada. El método flatMap
es idéntico a map
seguido de una llamada a flatten
de profundidad 1.
-
-Ejemplos
-
-map
y flatMap
-
-var arr1 = [ 1 , 2, 3, 4];
-
-arr1.map( x => [x * 2]);
-// [[2], [4], [6], [8]]
-
-arr1.flatMap(x => [x * 2]);
-// [2, 4, 6, 8]
-
-// solo un nivel es aplanado
-arr1.flatMap(x => [[x * 2]]);
-// [[2], [4], [6], [8]]
-
-
-
-
-Alternativa
-
-reduce
y concat
-
-var arr1 = [ 1 , 2, 3, 4];
-
-arr1.flatMap(x => [x * 2]);
-// es equivalente a
-arr1.reduce((acc, x) => acc.concat([x * 2]), []);
-// [2, 4, 6, 8]
-
-
-
-
-Polyfill
-
-Este polyfill necesita Array.prototype.flat polyfill
-
-if (!Array.prototype.flatMap) {
- Array.prototype.flatMap = function() {
- return Array.prototype.map.apply(this, arguments).flat(1);
- };
-}
-
-Especificaciones
-
-
-
-Compatibilidad con navegadores
-
-
-
-
-
{{Compat("javascript.builtins.Array.flatMap")}}
-
-
-Ver también
-
-
- {{jsxref("Array.prototype.flatten()")}}
- {{jsxref("Array.prototype.map()")}}
- {{jsxref("Array.prototype.reduce()")}}
- {{jsxref("Array.prototype.concat()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/array/flatmap/index.md b/files/es/web/javascript/reference/global_objects/array/flatmap/index.md
new file mode 100644
index 00000000000000..5ecb3b91b8ff21
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/array/flatmap/index.md
@@ -0,0 +1,117 @@
+---
+title: Array.prototype.flatMap()
+slug: Web/JavaScript/Reference/Global_Objects/Array/flatMap
+tags:
+ - Array
+ - JavaScript
+ - Prototipo
+ - Referencia
+ - metodo
+translation_of: Web/JavaScript/Reference/Global_Objects/Array/flatMap
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/flatMap
+---
+{{JSRef}} {{SeeCompatTable}}
+
+El método **`flatMap()`** primero mapea cada elemento usando una función de mapeo, luego aplana el resultado en una nueva matriz. Es idéntico a un [map](/es/docs/Web/JavaScript/Reference/Global_Objects/Array/map) seguido de un [flatten](/es/docs/Web/JavaScript/Reference/Global_Objects/Array/flatten)de profundidad 1, pero `flatMap` es a menudo útil y la fusión de ambos en un método es ligeramente más eficiente.
+
+{{EmbedInteractiveExample("pages/js/array-flatmap.html")}}
+
+La fuente de este ejemplo interactivo, se almacena en un repositorio de GitHub. Si desea contribuir al proyecto de ejemplos interactivos, clone y envíenos una solicitud de extracción.
+
+## Sintaxis
+
+```
+var new_array = arr.flatMap(function callback(currentValue[, index[, array]]) {
+ // return element for new_array
+}[, thisArg])
+```
+
+### Parámetros
+
+- `callback`
+
+ - : Función que produce un elemento de la nueva matriz, tomando tres argumentos:
+
+ - `currentValue`
+
+ - : El elemento actual que se procesa en la matriz.
+
+ - `index`{{optional_inline}}
+ - : El índice del elemento actual que se procesa en la matriz.
+ - `array`{{optional_inline}}
+ - : La matriz `map` fue llamada.
+
+- `thisArg`{{optional_inline}}
+ - : Valor para usar como `this` al ejecutar `callback`.
+
+### Valor de retorno
+
+Una nueva matriz con cada elemento es el resultado de la función de devolución de llamada y se aplana a una profundidad de 1.
+
+## Descripción
+
+Ver {{jsxref("Array.prototype.map()")}} para una descripción detallada de la función de devolución de llamada. El método `flatMap` es idéntico a [`map`](/es/docs/Web/JavaScript/Reference/Global_Objects/Array/map) seguido de una llamada a [`flatten`](/es/docs/Web/JavaScript/Reference/Global_Objects/Array/flatten) de profundidad 1.
+
+## Ejemplos
+
+### `map` y `flatMap`
+
+```js
+var arr1 = [1, 2, 3, 4];
+
+arr1.map(x => [x * 2]);
+// [[2], [4], [6], [8]]
+
+arr1.flatMap(x => [x * 2]);
+// [2, 4, 6, 8]
+
+// solo un nivel es aplanado
+arr1.flatMap(x => [[x * 2]]);
+// [[2], [4], [6], [8]]
+```
+
+//=> \[1, 2, 3, 4, 5, 6, 7, 8, 9]
+
+## Alternativa
+
+### `reduce` y `concat`
+
+```js
+var arr1 = [1, 2, 3, 4];
+
+arr1.flatMap(x => [x * 2]);
+// es equivalente a
+arr1.reduce((acc, x) => acc.concat([x * 2]), []);
+// [2, 4, 6, 8]
+```
+
+//=> \[1, 2, 3, 4, 5, 6, 7, 8, 9]
+
+## Polyfill
+
+Este polyfill necesita [Array.prototype.flat polyfill](/es/docs/Web/JavaScript/Reference/Global_Objects/Array/flat)
+
+```js
+if (!Array.prototype.flatMap) {
+ Array.prototype.flatMap = function() {
+ return Array.prototype.map.apply(this, arguments).flat(1);
+ };
+}
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| ------------------------------------------------------------------------------------------------- | -------------- | ---------- |
+| [`Array.prototype.flatMap`](https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatMap) | Finalizado (4) | |
+
+## Compatibilidad con navegadores
+
+{{Compat("javascript.builtins.Array.flatMap")}}
+
+## Ver también
+
+- {{jsxref("Array.prototype.flatten()")}}
+- {{jsxref("Array.prototype.map()")}}
+- {{jsxref("Array.prototype.reduce()")}}
+- {{jsxref("Array.prototype.concat()")}}
diff --git a/files/es/web/javascript/reference/global_objects/array/foreach/index.html b/files/es/web/javascript/reference/global_objects/array/foreach/index.html
deleted file mode 100644
index c351be7a194c89..00000000000000
--- a/files/es/web/javascript/reference/global_objects/array/foreach/index.html
+++ /dev/null
@@ -1,258 +0,0 @@
----
-title: Array.prototype.forEach()
-slug: Web/JavaScript/Reference/Global_Objects/Array/forEach
-tags:
- - Array
- - ECMAScript5
- - JavaScript
- - JavaScript 1.6
- - Method
- - Prototype
- - Referencia
- - polyfill
-translation_of: Web/JavaScript/Reference/Global_Objects/Array/forEach
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/forEach
----
-{{JSRef}}
-
-El método forEach()
ejecuta la función indicada una vez por cada elemento del array.
-
-{{EmbedInteractiveExample("pages/js/array-foreach.html")}}
-
-Sintaxis
-
-arr .forEach(function callback(currentValue, index, array) {
- // tu iterador
-} [, thisArg ]);
-
-Parámetros
-
-
- callback
- Función a ejecutar por cada elemento, que recibe tres argumentos:
-
-
- currentValue
- El elemento actual siendo procesado en el array.
- index
{{optional_inline}}
- El índice del elemento actual siendo procesado en el array.
- array
{{optional_inline}}
- El vector en el que forEach()
esta siendo aplicado.
-
-
- thisArg
{{optional_inline}}
- Valor que se usará como this
cuando se ejecute el callback
.
-
-
-Valor de retorno
-
-{{jsxref("undefined")}}.
-
-Descripción
-
-forEach()
ejecuta la función callback
una vez por cada elemento presente en el array en orden ascendente. No es invocada para índices que han sido eliminados o que no hayan sido inicializados (Ej. sobre arrays sparse
)
-
-callback
es invocada con tres argumentos:
-
-
- el valor del elemento
- el índice del elemento
- el array que está siendo recorrido
-
-
-Si un parámetro thisArg
es proporcionado a forEach
, será usado como el valor this
para cada invocación de callback
como si se llamara a callback.call(thisArg, element, index, array)
. Si thisArg
es undefined
o null
, el valor this
dentro de la función depende si la función está o no en modo estricto (valor pasado si está en modo estricto, objeto global si está en modo no-estricto).
-
-El rango de elementos procesados por forEach()
se establece antes de la primera invocación del callback
. Los elementos que sean añadidos al vector después de que inicie la llamada a forEach
no serán visitados por callback
. Si los valores de los elementos existentes en el vector son modificados, el valor pasado al callback
será el valor al momento de que forEach los visite; no se evaluarán los elementos borrados antes de ser visitados por forEach
.
-
-forEach()
ejecuta la función callback
una vez por cada elemento del array; a diferencia de {{jsxref("Array.prototype.map()", "map()")}} o {{jsxref("Array.prototype.reduce()", "reduce()")}} este siempre devuelve el valor {{jsxref("undefined")}} y no es encadenable. El típico uso es ejecutar los efectos secundarios al final de la cadena.
-
-foreach()
no muta/modifica el array desde el que es llamado (aunque callback
, si se invoca, podría hacerlo).
-
-Nota : No hay forma de detener o cortar un bucle forEach
que no sea lanzar una excepción. Si necesita dicho comportamiento, el método .forEach()
es la herramienta equivocada, use una simple iteración en su lugar. Si está probando los elementos del array para un predicado y necesita devolver un valor boleano, puede usar {{jsxref("Array.prototype.every()", "every()")}} o {{jsxref("Array.prototype.some()", "some()")}} en su lugar.
-
-Ejemplos
-
-Imprimiendo el contenido de un array
-
-El siguiente código imprime una línea por cada elemento en un array:
-
-function logArrayElements(element, index, array) {
- console.log("a[" + index + "] = " + element);
-}
-// Nótese que se evita el 2° índice ya que no hay ningún elemento en esa posición del array
-[2, 5, , 9].forEach(logArrayElements);
-// salida:
-// a[0] = 2
-// a[1] = 5
-// a[2] = 9
-
-
-Usando thisArg
-
-El siguiente ejemplo actualiza las propiedades del objeto por cada entrada en el array:
-
-function Counter() {
- this.sum = 0;
- this.count = 0;
-}
-Counter.prototype.add = function(array) {
- array.forEach(function(entry) {
- this.sum += entry;
- ++this.count;
- }, this);
- // ^---- Note
-};
-
-var obj = new Counter();
-obj.add([2, 5, 9]);
-obj.count
-// 3
-obj.sum
-// 16
-
-Nota: Dado que el parámetro thisArg
(this) se referencia en el forEach()
, será pasado al callback
cuando se invoque, para utilizarse como su valor this
.
-
-Ejemplo: Función que copia objetos
-
-El siguiente código crea una copia de un objeto dado. Hay diferentes formas de crear una copia de un objeto, ésta es sólo una de ellas y sirve para explicar cómo funciona Array.prototype.forEach
utilizando funciones Object.*
de ECMAScript 5.
-
-function copy(o){
- var copy = Object.create( Object.getPrototypeOf(o) );
- var propNames = Object.getOwnPropertyNames(o);
-
- propNames.forEach(function(name){
- var desc = Object.getOwnPropertyDescriptor(o, name);
- Object.defineProperty(copy, name, desc);
- });
-
- return copy;
-}
-
-var o1 = {a:1, b:2};
-var o2 = copy(o1); // o2 ahora se parece a o1
-
-
-Si el array se modifica durante la iteración, otros elementos pueden ser omitidos.
-
-El siguiente ejemplo muestra por consola "uno", "dos", "cuatro". Cuando se alcanza el registro que contiene el valor "dos", el primer registro del array se desplaza, lo que hace que los registros restantes se muevan una posición. Debido a que el elemento "cuatro" está ahora en una posición anterior en el array, "tres" se omitirá. forEach()
no hace una copia del array antes de iterar.
-
-var words = ['uno', 'dos', 'tres', 'cuatro'];
-words.forEach(function(word) {
- console.log(word);
- if (word === 'dos') {
- words.shift();
- }
-});
-// uno
-// dos
-// cuatro
-
-
-Polyfill
-
-forEach
se agregó de manera reciente al estándar ECMA-262; así que puede no estar presente en otras implementaciones del estándar. Se puede asegurar el uso del forEach con tan solo agregar el siguiente código al inicio de los scripts, permitiendo así el uso de forEach en implementaciones que no lo soportan de manera nativa. El algoritmo es el mismo que se especifica en la quinta versión de ECMA-262, asumiendo que {{jsxref("Object")}} y {{jsxref("TypeError")}} tienen sus valores originales y que callback.call evalúa el valor original de {{jsxref("Function.prototype.call()")}}.
-
-// Production steps of ECMA-262, Edition 5, 15.4.4.18
-// Reference: http://es5.github.com/#x15.4.4.18
-if (!Array.prototype.forEach) {
-
- Array.prototype.forEach = function forEach(callback, thisArg) {
- 'use strict';
- var T, k;
-
- if (this == null) {
- throw new TypeError("this is null or not defined");
- }
-
- var kValue,
- // 1. Let O be the result of calling ToObject passing the |this| value as the argument.
- O = Object(this),
-
- // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length".
- // 3. Let len be ToUint32(lenValue).
- len = O.length >>> 0; // Hack to convert O.length to a UInt32
-
- // 4. If IsCallable(callback) is false, throw a TypeError exception.
- // See: http://es5.github.com/#x9.11
- if ({}.toString.call(callback) !== "[object Function]") {
- throw new TypeError(callback + " is not a function");
- }
-
- // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
- if (arguments.length >= 2) {
- T = thisArg;
- }
-
- // 6. Let k be 0
- k = 0;
-
- // 7. Repeat, while k < len
- while (k < len) {
-
- // a. Let Pk be ToString(k).
- // This is implicit for LHS operands of the in operator
- // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.
- // This step can be combined with c
- // c. If kPresent is true, then
- if (k in O) {
-
- // i. Let kValue be the result of calling the Get internal method of O with argument Pk.
- kValue = O[k];
-
- // ii. Call the Call internal method of callback with T as the this value and
- // argument list containing kValue, k, and O.
- callback.call(T, kValue, k, O);
- }
- // d. Increase k by 1.
- k++;
- }
- // 8. return undefined
- };
-}
-
-
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES5.1', '#sec-15.4.4.18', 'Array.prototype.forEach')}}
- {{Spec2('ES5.1')}}
- Definición inicial. Implementada en JavaScript 1.6.
-
-
- {{SpecName('ES6', '#sec-array.prototype.foreach', 'Array.prototype.forEach')}}
- {{Spec2('ES6')}}
-
-
-
- {{SpecName('ESDraft', '#sec-array.prototype.foreach', 'Array.prototype.forEach')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad con navegadores
-
-{{Compat("javascript.builtins.Array.forEach")}}
-
-
-
-Vea también
-
-
- {{jsxref("Array.prototype.find()")}}
- {{jsxref("Array.prototype.findIndex()")}}
- {{jsxref("Array.prototype.map()")}}
- {{jsxref("Array.prototype.every()")}}
- {{jsxref("Array.prototype.some()")}}
- {{jsxref("Map.prototype.forEach()")}}
- {{jsxref("Set.prototype.forEach()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/array/foreach/index.md b/files/es/web/javascript/reference/global_objects/array/foreach/index.md
new file mode 100644
index 00000000000000..25cf19b6318c2c
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/array/foreach/index.md
@@ -0,0 +1,237 @@
+---
+title: Array.prototype.forEach()
+slug: Web/JavaScript/Reference/Global_Objects/Array/forEach
+tags:
+ - Array
+ - ECMAScript5
+ - JavaScript
+ - JavaScript 1.6
+ - Method
+ - Prototype
+ - Referencia
+ - polyfill
+translation_of: Web/JavaScript/Reference/Global_Objects/Array/forEach
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/forEach
+---
+{{JSRef}}
+
+El método **`forEach()`** ejecuta la función indicada una vez por cada elemento del array.
+
+{{EmbedInteractiveExample("pages/js/array-foreach.html")}}
+
+## Sintaxis
+
+```
+arr.forEach(function callback(currentValue, index, array) {
+ // tu iterador
+}[, thisArg]);
+```
+
+### Parámetros
+
+- `callback`
+
+ - : Función a ejecutar por cada elemento, que recibe tres argumentos:
+
+ - `currentValue`
+ - : El elemento actual siendo procesado en el array.
+ - `index` {{optional_inline}}
+ - : El índice del elemento actual siendo procesado en el array.
+ - `array` {{optional_inline}}
+ - : El vector en el que `forEach()` esta siendo aplicado.
+
+- `thisArg` {{optional_inline}}
+ - : Valor que se usará como `this` cuando se ejecute el `callback`.
+
+### Valor de retorno
+
+{{jsxref("undefined")}}.
+
+## Descripción
+
+`forEach()` ejecuta la función `callback` una vez por cada elemento presente en el array en orden ascendente. No es invocada para índices que han sido eliminados o que no hayan sido inicializados (Ej. sobre arrays `sparse`)
+
+`callback` es invocada con tres argumentos:
+
+1. el valor del elemento
+2. el índice del elemento
+3. el array que está siendo recorrido
+
+Si un parámetro `thisArg` es proporcionado a `forEach`, será usado como el valor `this` para cada invocación de `callback` como si se llamara a `callback.call(thisArg, element, index, array)`. Si `thisArg` es `undefined` o `null`, el valor `this` dentro de la función depende si la función está o no en [modo estricto](/es/docs/Web/JavaScript/Referencia/Modo_estricto) (valor pasado si está en modo estricto, objeto global si está en modo no-estricto).
+
+El rango de elementos procesados por `forEach()` se establece antes de la primera invocación del `callback`. Los elementos que sean añadidos al vector después de que inicie la llamada a `forEach` no serán visitados por `callback`. Si los valores de los elementos existentes en el vector son modificados, el valor pasado al `callback` será el valor al momento de que forEach los visite; no se evaluarán los elementos borrados antes de ser visitados por `forEach`.
+
+`forEach()` ejecuta la función `callback` una vez por cada elemento del array; a diferencia de {{jsxref("Array.prototype.map()", "map()")}} o {{jsxref("Array.prototype.reduce()", "reduce()")}} este siempre devuelve el valor {{jsxref("undefined")}} y no es encadenable. El típico uso es ejecutar los efectos secundarios al final de la cadena.
+
+`foreach()` no muta/modifica el array desde el que es llamado (aunque `callback`, si se invoca, podría hacerlo).
+
+> **Nota:** **Nota :** No hay forma de detener o cortar un bucle `forEach` que no sea lanzar una excepción. Si necesita dicho comportamiento, el método `.forEach()` es la herramienta equivocada, use una simple iteración en su lugar. Si está probando los elementos del array para un predicado y necesita devolver un valor boleano, puede usar {{jsxref("Array.prototype.every()", "every()")}} o {{jsxref("Array.prototype.some()", "some()")}} en su lugar.
+
+## Ejemplos
+
+### Imprimiendo el contenido de un `array`
+
+El siguiente código imprime una línea por cada elemento en un array:
+
+```js
+function logArrayElements(element, index, array) {
+ console.log("a[" + index + "] = " + element);
+}
+// Nótese que se evita el 2° índice ya que no hay ningún elemento en esa posición del array
+[2, 5, , 9].forEach(logArrayElements);
+// salida:
+// a[0] = 2
+// a[1] = 5
+// a[2] = 9
+```
+
+### Usando `thisArg`
+
+El siguiente ejemplo actualiza las propiedades del objeto por cada entrada en el array:
+
+```js
+function Counter() {
+ this.sum = 0;
+ this.count = 0;
+}
+Counter.prototype.add = function(array) {
+ array.forEach(function(entry) {
+ this.sum += entry;
+ ++this.count;
+ }, this);
+ // ^---- Note
+};
+
+var obj = new Counter();
+obj.add([2, 5, 9]);
+obj.count
+// 3
+obj.sum
+// 16
+```
+
+Nota: Dado que el parámetro `thisArg` (this) se referencia en el `forEach()`, será pasado al `callback` cuando se invoque, para utilizarse como su valor `this`.
+
+### Ejemplo: Función que copia objetos
+
+El siguiente código crea una copia de un objeto dado. Hay diferentes formas de crear una copia de un objeto, ésta es sólo una de ellas y sirve para explicar cómo funciona `Array.prototype.forEach`utilizando funciones `Object.*` de ECMAScript 5.
+
+```js
+function copy(o){
+ var copy = Object.create( Object.getPrototypeOf(o) );
+ var propNames = Object.getOwnPropertyNames(o);
+
+ propNames.forEach(function(name){
+ var desc = Object.getOwnPropertyDescriptor(o, name);
+ Object.defineProperty(copy, name, desc);
+ });
+
+ return copy;
+}
+
+var o1 = {a:1, b:2};
+var o2 = copy(o1); // o2 ahora se parece a o1
+```
+
+### Si el array se modifica durante la iteración, otros elementos pueden ser omitidos.
+
+El siguiente ejemplo muestra por consola "uno", "dos", "cuatro". Cuando se alcanza el registro que contiene el valor "dos", el primer registro del array se desplaza, lo que hace que los registros restantes se muevan una posición. Debido a que el elemento "cuatro" está ahora en una posición anterior en el array, "tres" se omitirá. `forEach()` no hace una copia del array antes de iterar.
+
+```js
+var words = ['uno', 'dos', 'tres', 'cuatro'];
+words.forEach(function(word) {
+ console.log(word);
+ if (word === 'dos') {
+ words.shift();
+ }
+});
+// uno
+// dos
+// cuatro
+```
+
+## Polyfill
+
+`forEach` se agregó de manera reciente al estándar ECMA-262; así que puede no estar presente en otras implementaciones del estándar. Se puede asegurar el uso del forEach con tan solo agregar el siguiente código al inicio de los scripts, permitiendo así el uso de forEach en implementaciones que no lo soportan de manera nativa. El algoritmo es el mismo que se especifica en la quinta versión de ECMA-262, asumiendo que {{jsxref("Object")}} y {{jsxref("TypeError")}} tienen sus valores originales y que callback.call evalúa el valor original de {{jsxref("Function.prototype.call()")}}.
+
+```js
+// Production steps of ECMA-262, Edition 5, 15.4.4.18
+// Reference: http://es5.github.com/#x15.4.4.18
+if (!Array.prototype.forEach) {
+
+ Array.prototype.forEach = function forEach(callback, thisArg) {
+ 'use strict';
+ var T, k;
+
+ if (this == null) {
+ throw new TypeError("this is null or not defined");
+ }
+
+ var kValue,
+ // 1. Let O be the result of calling ToObject passing the |this| value as the argument.
+ O = Object(this),
+
+ // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length".
+ // 3. Let len be ToUint32(lenValue).
+ len = O.length >>> 0; // Hack to convert O.length to a UInt32
+
+ // 4. If IsCallable(callback) is false, throw a TypeError exception.
+ // See: http://es5.github.com/#x9.11
+ if ({}.toString.call(callback) !== "[object Function]") {
+ throw new TypeError(callback + " is not a function");
+ }
+
+ // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
+ if (arguments.length >= 2) {
+ T = thisArg;
+ }
+
+ // 6. Let k be 0
+ k = 0;
+
+ // 7. Repeat, while k < len
+ while (k < len) {
+
+ // a. Let Pk be ToString(k).
+ // This is implicit for LHS operands of the in operator
+ // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.
+ // This step can be combined with c
+ // c. If kPresent is true, then
+ if (k in O) {
+
+ // i. Let kValue be the result of calling the Get internal method of O with argument Pk.
+ kValue = O[k];
+
+ // ii. Call the Call internal method of callback with T as the this value and
+ // argument list containing kValue, k, and O.
+ callback.call(T, kValue, k, O);
+ }
+ // d. Increase k by 1.
+ k++;
+ }
+ // 8. return undefined
+ };
+}
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| ------------------------------------------------------------------------------------------------------------ | ---------------------------- | --------------------------------------------------- |
+| {{SpecName('ES5.1', '#sec-15.4.4.18', 'Array.prototype.forEach')}} | {{Spec2('ES5.1')}} | Definición inicial. Implementada en JavaScript 1.6. |
+| {{SpecName('ES6', '#sec-array.prototype.foreach', 'Array.prototype.forEach')}} | {{Spec2('ES6')}} | |
+| {{SpecName('ESDraft', '#sec-array.prototype.foreach', 'Array.prototype.forEach')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad con navegadores
+
+{{Compat("javascript.builtins.Array.forEach")}}
+
+## Vea también
+
+- {{jsxref("Array.prototype.find()")}}
+- {{jsxref("Array.prototype.findIndex()")}}
+- {{jsxref("Array.prototype.map()")}}
+- {{jsxref("Array.prototype.every()")}}
+- {{jsxref("Array.prototype.some()")}}
+- {{jsxref("Map.prototype.forEach()")}}
+- {{jsxref("Set.prototype.forEach()")}}
diff --git a/files/es/web/javascript/reference/global_objects/array/map/index.html b/files/es/web/javascript/reference/global_objects/array/map/index.html
deleted file mode 100644
index a66e1cf4f81f9e..00000000000000
--- a/files/es/web/javascript/reference/global_objects/array/map/index.html
+++ /dev/null
@@ -1,309 +0,0 @@
----
-title: Array.prototype.map()
-slug: Web/JavaScript/Reference/Global_Objects/Array/map
-tags:
- - Array
- - Arreglo
- - Callback
- - ECMAScript5
- - Polifill
- - Prototype
- - metodo
-translation_of: Web/JavaScript/Reference/Global_Objects/Array/map
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/map
----
-{{JSRef}}
-
-El método map()
crea un nuevo array con los resultados de la llamada a la función indicada aplicados a cada uno de sus elementos.
-
-var numbers = [1, 5, 10, 15];
-var doubles = numbers.map(function(x) {
- return x * 2;
-});
-// doubles is now [2, 10, 20, 30]
-// numbers is still [1, 5, 10, 15]
-
-var numbers = [1, 4, 9];
-var roots = numbers.map(function(num) {
- return Math.sqrt(num);
-});
-// roots is now [1, 2, 3]
-// numbers is still [1, 4, 9]
-
-
-Sintaxis
-
-var nuevo_array = arr .map(function callback(currentValue, index, array) {
- // Elemento devuelto de nuevo_array
-} [, thisArg ])
-
-Parámetros
-
-
- callback
- Función que producirá un elemento del nuevo array, recibe tres argumentos:
-
-
- currentValue
- El elemento actual del array que se está procesando.
- index
- El índice del elemento actual dentro del array.
- array
- El array sobre el que se llama map.
-
-
- thisArg
- Opcional. Valor a usar como this
al ejecutar callback
.
-
-
-Descripción
-
-map
llama a la función callback
provista una vez por elemento de un array, en orden, y construye un nuevo array con los resultados. callback
se invoca sólo para los índices del array que tienen valores asignados; no se invoca en los índices que han sido borrados o a los que no se ha asignado valor.
-
-callback
es llamada con tres argumentos: el valor del elemento, el índice del elemento, y el objeto array que se está recorriendo.
-
-Si se indica un parámetro thisArg
a un map
, se usará como valor de this
en la función callback
. En otro caso, se pasará {{jsxref("Global_Objects/undefined", "undefined")}} como su valor this
. El valor de this
observable por el callback
se determina de acuerdo a las reglas habituales para determinar el valor this visto por una función.
-
-map
no modifica el array original en el que es llamado (aunque callback
, si es llamada, puede modificarlo).
-
-El rango de elementos procesado por map
es establecido antes de la primera invocación del callback
. Los elementos que sean agregados al array después de que la llamada a map
comience no serán visitados por el callback
. Si los elementos existentes del array son modificados o eliminados, su valor pasado al callback
será el valor en el momento que el map
lo visita; los elementos que son eliminados no son visitados.
-
-Ejemplos
-
-Procesar un array de números aplicándoles la raíz cuadrada
-
-El siguiente código itera sobre un array de números, aplicándoles la raíz cuadrada a cada uno de sus elementos, produciendo un nuevo array a partir del inicial.
-
-var numeros= [1, 4, 9];
-var raices = numeros.map(Math.sqrt);
-// raices tiene [1, 2, 3]
-// numeros aún mantiene [1, 4, 9]
-
-
-Usando map para dar un nuevo formato a los objetos de un array
-
-El siguiente código toma un array de objetos y crea un nuevo array que contiene los nuevos objetos formateados.
-
-var kvArray = [{clave:1, valor:10},
- {clave:2, valor:20},
- {clave:3, valor: 30}];
-
-var reformattedArray = kvArray.map(function(obj){
- var rObj = {};
- rObj[obj.clave] = obj.valor;
- return rObj;
-});
-
-// reformattedArray es ahora [{1:10}, {2:20}, {3:30}],
-
-// kvArray sigue siendo:
-// [{clave:1, valor:10},
-// {clave:2, valor:20},
-// {clave:3, valor: 30}]
-
-
-Mapear un array de números usando una función con un argumento
-
-El siguiente código muestra cómo trabaja map
cuando se utiliza una función que requiere de un argumento. El argumento será asignado automáticamente a cada elemento del arreglo conforme map
itera el arreglo original.
-
-var numeros = [1, 4, 9];
-var dobles = numeros.map(function(num) {
- return num * 2;
-});
-
-// dobles es ahora [2, 8, 18]
-// numeros sigue siendo [1, 4, 9]
-
-
-Usando map
de forma genérica
-
-Este ejemplo muestra como usar map
en {{jsxref("Global_Objects/String", "String")}} para obtener un arreglo de bytes en codifcación ASCII representando el valor de los caracteres:
-
-var map = Array.prototype.map;
-var valores = map.call('Hello World', function(char) { return char.charCodeAt(0); });
-// valores ahora tiene [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
-
-
-Usando map
genérico con querySelectorAll
-
-Este ejemplo muestra como iterar sobre una colección de objetos obtenidos por querySelectorAll
. En este caso obtenemos todas las opciones seleccionadas en pantalla y se imprimen en la consola:
-
-var elems = document.querySelectorAll('select option:checked');
-var values = [].map.call(elems, function(obj) {
- return obj.value;
-});
-
-
-Usando map
para invertir una cadena
-
-var str = '12345';
-[].map.call(str, function(x) {
- return x;
-}).reverse().join('');
-
-// Salida: '54321'
-// Bonus: usa'===' para probar si la cadena original era un palindromo
-
-
-Caso de uso engañoso
-
-(inspirado por este artículo)
-
-Es común utilizar el callback con un argumento (el elemento siendo pasado). Ciertas funciones son también usadas comunmente con un argumento, aún cuando toman argumentos adicionales opcionales. Estos hábitos pueden llevar a comportamientos confusos.
-
-// Considera:
-['1', '2', '3'].map(parseInt);
-// Mientras uno esperaría [1, 2, 3]
-// en realidad se obtiene [1, NaN, NaN]
-
-// parseInt se usa comúnmente con un argumento, pero toma dos.
-// El primero es una expresión y el segundo el radix.
-// a la función callback, Array.prototype.map pasa 3 argumentos:
-// el elemento, el índice y el array.
-// El tercer argumento es ignorado por parseInt, pero no el segundo,
-// de ahí la posible confusión. Véase el artículo del blog para más detalles
-
-function returnInt(element) {
- return parseInt(element, 10);
-}
-
-['1', '2', '3'].map(returnInt); // [1, 2, 3]
-// El resultado es un arreglo de números (como se esperaba)
-
-// Un modo más simple de lograr lo de arriba, mientras de evita el "gotcha":
-['1', '2', '3'].map(Number); // [1, 2, 3]
-
-
-Polyfill
-
-map
fue agregado al estandar ECMA-262 en la 5th edición; por lo tanto podría no estar presente en todas la implementaciones del estándar. Puedes sobrepasar esto insertando el siguiente código al comienzo de tus scripts, permitiendo el uso de map
en implementaciones que no lo soportan de forma nativa. Este algoritmo es exactamente el mismo especificado en ECMA-262, 5th edición, asumiendo {{jsxref("Global_Objects/Object", "Object")}}, {{jsxref("Global_Objects/TypeError", "TypeError")}}, y {{jsxref("Global_Objects/Array", "Array")}} tienen sus valores originales y que el callback.call
evalua el valor original de {{jsxref("Function.prototype.call")}}
.
-
-// Production steps of ECMA-262, Edition 5, 15.4.4.19
-// Reference: http://es5.github.io/#x15.4.4.19
-if (!Array.prototype.map) {
-
- Array.prototype.map = function(callback, thisArg) {
-
- var T, A, k;
-
- if (this == null) {
- throw new TypeError(' this is null or not defined');
- }
-
- // 1. Let O be the result of calling ToObject passing the |this|
- // value as the argument.
- var O = Object(this);
-
- // 2. Let lenValue be the result of calling the Get internal
- // method of O with the argument "length".
- // 3. Let len be ToUint32(lenValue).
- var len = O.length >>> 0;
-
- // 4. If IsCallable(callback) is false, throw a TypeError exception.
- // See: http://es5.github.com/#x9.11
- if (typeof callback !== 'function') {
- throw new TypeError(callback + ' is not a function');
- }
-
- // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
- if (arguments.length > 1) {
- T = thisArg;
- }
-
- // 6. Let A be a new array created as if by the expression new Array(len)
- // where Array is the standard built-in constructor with that name and
- // len is the value of len.
- A = new Array(len);
-
- // 7. Let k be 0
- k = 0;
-
- // 8. Repeat, while k < len
- while (k < len) {
-
- var kValue, mappedValue;
-
- // a. Let Pk be ToString(k).
- // This is implicit for LHS operands of the in operator
- // b. Let kPresent be the result of calling the HasProperty internal
- // method of O with argument Pk.
- // This step can be combined with c
- // c. If kPresent is true, then
- if (k in O) {
-
- // i. Let kValue be the result of calling the Get internal
- // method of O with argument Pk.
- kValue = O[k];
-
- // ii. Let mappedValue be the result of calling the Call internal
- // method of callback with T as the this value and argument
- // list containing kValue, k, and O.
- mappedValue = callback.call(T, kValue, k, O);
-
- // iii. Call the DefineOwnProperty internal method of A with arguments
- // Pk, Property Descriptor
- // { Value: mappedValue,
- // Writable: true,
- // Enumerable: true,
- // Configurable: true },
- // and false.
-
- // In browsers that support Object.defineProperty, use the following:
- // Object.defineProperty(A, k, {
- // value: mappedValue,
- // writable: true,
- // enumerable: true,
- // configurable: true
- // });
-
- // For best browser support, use the following:
- A[k] = mappedValue;
- }
- // d. Increase k by 1.
- k++;
- }
-
- // 9. return A
- return A;
- };
-}
-
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES5.1', '#sec-15.4.4.19', 'Array.prototype.map')}}
- {{Spec2('ES5.1')}}
- Definición inicial. Implementado en JavaScript 1.6.
-
-
- {{SpecName('ES6', '#sec-array.prototype.map', 'Array.prototype.map')}}
- {{Spec2('ES6')}}
-
-
-
- {{SpecName('ESDraft', '#sec-array.prototype.map', 'Array.prototype.map')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad con navegadores
-
-{{Compat("javascript.builtins.Array.map")}}
-
-Véase también
-
-
- {{jsxref("Array.prototype.forEach()")}}
- {{jsxref("Map")}} object
- {{jsxref("Array.from()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/array/map/index.md b/files/es/web/javascript/reference/global_objects/array/map/index.md
new file mode 100644
index 00000000000000..8ed50a7630c2dc
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/array/map/index.md
@@ -0,0 +1,296 @@
+---
+title: Array.prototype.map()
+slug: Web/JavaScript/Reference/Global_Objects/Array/map
+tags:
+ - Array
+ - Arreglo
+ - Callback
+ - ECMAScript5
+ - Polifill
+ - Prototype
+ - metodo
+translation_of: Web/JavaScript/Reference/Global_Objects/Array/map
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/map
+---
+{{JSRef}}
+
+El método **`map()`** crea un nuevo array con los resultados de la llamada a la función indicada aplicados a cada uno de sus elementos.
+
+```js
+var numbers = [1, 5, 10, 15];
+var doubles = numbers.map(function(x) {
+ return x * 2;
+});
+// doubles is now [2, 10, 20, 30]
+// numbers is still [1, 5, 10, 15]
+
+var numbers = [1, 4, 9];
+var roots = numbers.map(function(num) {
+ return Math.sqrt(num);
+});
+// roots is now [1, 2, 3]
+// numbers is still [1, 4, 9]
+```
+
+## Sintaxis
+
+```
+var nuevo_array = arr.map(function callback(currentValue, index, array) {
+ // Elemento devuelto de nuevo_array
+}[, thisArg])
+```
+
+### Parámetros
+
+- `callback`
+
+ - : Función que producirá un elemento del nuevo array, recibe tres argumentos:
+
+ - `currentValue`
+ - : El elemento actual del array que se está procesando.
+ - `index`
+ - : El índice del elemento actual dentro del array.
+ - `array`
+ - : El array sobre el que se llama `map.`
+
+- `thisArg`
+ - : Opcional. Valor a usar como `this`al ejecutar `callback`.
+
+## Descripción
+
+`map` llama a la función `callback` provista **una vez por elemento** de un array, en orden, y construye un nuevo array con los resultados. `callback` se invoca sólo para los índices del array que tienen valores asignados; no se invoca en los índices que han sido borrados o a los que no se ha asignado valor.
+
+`callback` es llamada con tres argumentos: el valor del elemento, el índice del elemento, y el objeto array que se está recorriendo.
+
+Si se indica un parámetro `thisArg` a un `map`, se usará como valor de `this` en la función `callback`. En otro caso, se pasará {{jsxref("Global_Objects/undefined", "undefined")}} como su valor `this`. El valor de `this` observable por el `callback` se determina de acuerdo a las [reglas habituales para determinar el valor this visto por una función.](/es/docs/Web/JavaScript/Reference/Operators/this)
+
+`map` no modifica el array original en el que es llamado (aunque `callback`, si es llamada, puede modificarlo).
+
+El rango de elementos procesado por `map` es establecido antes de la primera invocación del `callback`. Los elementos que sean agregados al array después de que la llamada a `map`comience no serán visitados por el `callback`. Si los elementos existentes del array son modificados o eliminados, su valor pasado al `callback` será el valor en el momento que el `map` lo visita; los elementos que son eliminados no son visitados.
+
+## Ejemplos
+
+### Procesar un array de números aplicándoles la raíz cuadrada
+
+El siguiente código itera sobre un array de números, aplicándoles la raíz cuadrada a cada uno de sus elementos, produciendo un nuevo array a partir del inicial.
+
+```js
+var numeros= [1, 4, 9];
+var raices = numeros.map(Math.sqrt);
+// raices tiene [1, 2, 3]
+// numeros aún mantiene [1, 4, 9]
+```
+
+### Usando map para dar un nuevo formato a los objetos de un array
+
+El siguiente código toma un array de objetos y crea un nuevo array que contiene los nuevos objetos formateados.
+
+```js
+var kvArray = [{clave:1, valor:10},
+ {clave:2, valor:20},
+ {clave:3, valor: 30}];
+
+var reformattedArray = kvArray.map(function(obj){
+ var rObj = {};
+ rObj[obj.clave] = obj.valor;
+ return rObj;
+});
+
+// reformattedArray es ahora [{1:10}, {2:20}, {3:30}],
+
+// kvArray sigue siendo:
+// [{clave:1, valor:10},
+// {clave:2, valor:20},
+// {clave:3, valor: 30}]
+```
+
+### Mapear un array de números usando una función con un argumento
+
+El siguiente código muestra cómo trabaja `map`cuando se utiliza una función que requiere de un argumento. El argumento será asignado automáticamente a cada elemento del arreglo conforme `map`itera el arreglo original.
+
+```js
+var numeros = [1, 4, 9];
+var dobles = numeros.map(function(num) {
+ return num * 2;
+});
+
+// dobles es ahora [2, 8, 18]
+// numeros sigue siendo [1, 4, 9]
+```
+
+### Usando `map` de forma genérica
+
+Este ejemplo muestra como usar `map`en {{jsxref("Global_Objects/String", "String")}} para obtener un arreglo de bytes en codifcación ASCII representando el valor de los caracteres:
+
+```js
+var map = Array.prototype.map;
+var valores = map.call('Hello World', function(char) { return char.charCodeAt(0); });
+// valores ahora tiene [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
+```
+
+### Usando `map` genérico con `querySelectorAll`
+
+Este ejemplo muestra como iterar sobre una colección de objetos obtenidos por `querySelectorAll`. En este caso obtenemos todas las opciones seleccionadas en pantalla y se imprimen en la consola:
+
+```js
+var elems = document.querySelectorAll('select option:checked');
+var values = [].map.call(elems, function(obj) {
+ return obj.value;
+});
+```
+
+### Usando `map` para invertir una cadena
+
+```js
+var str = '12345';
+[].map.call(str, function(x) {
+ return x;
+}).reverse().join('');
+
+// Salida: '54321'
+// Bonus: usa'===' para probar si la cadena original era un palindromo
+```
+
+### Caso de uso engañoso
+
+[(inspirado por este artículo)](http://www.wirfs-brock.com/allen/posts/166)
+
+Es común utilizar el callback con un argumento (el elemento siendo pasado). Ciertas funciones son también usadas comunmente con un argumento, aún cuando toman argumentos adicionales opcionales. Estos hábitos pueden llevar a comportamientos confusos.
+
+```js
+// Considera:
+['1', '2', '3'].map(parseInt);
+// Mientras uno esperaría [1, 2, 3]
+// en realidad se obtiene [1, NaN, NaN]
+
+// parseInt se usa comúnmente con un argumento, pero toma dos.
+// El primero es una expresión y el segundo el radix.
+// a la función callback, Array.prototype.map pasa 3 argumentos:
+// el elemento, el índice y el array.
+// El tercer argumento es ignorado por parseInt, pero no el segundo,
+// de ahí la posible confusión. Véase el artículo del blog para más detalles
+
+function returnInt(element) {
+ return parseInt(element, 10);
+}
+
+['1', '2', '3'].map(returnInt); // [1, 2, 3]
+// El resultado es un arreglo de números (como se esperaba)
+
+// Un modo más simple de lograr lo de arriba, mientras de evita el "gotcha":
+['1', '2', '3'].map(Number); // [1, 2, 3]
+```
+
+## Polyfill
+
+`map` fue agregado al estandar ECMA-262 en la 5th edición; por lo tanto podría no estar presente en todas la implementaciones del estándar. Puedes sobrepasar esto insertando el siguiente código al comienzo de tus scripts, permitiendo el uso de `map` en implementaciones que no lo soportan de forma nativa. Este algoritmo es exactamente el mismo especificado en ECMA-262, 5th edición, asumiendo {{jsxref("Global_Objects/Object", "Object")}}, {{jsxref("Global_Objects/TypeError", "TypeError")}}, y {{jsxref("Global_Objects/Array", "Array")}} tienen sus valores originales y que el `callback.call` evalua el valor original de `{{jsxref("Function.prototype.call")}}`.
+
+```js
+// Production steps of ECMA-262, Edition 5, 15.4.4.19
+// Reference: http://es5.github.io/#x15.4.4.19
+if (!Array.prototype.map) {
+
+ Array.prototype.map = function(callback, thisArg) {
+
+ var T, A, k;
+
+ if (this == null) {
+ throw new TypeError(' this is null or not defined');
+ }
+
+ // 1. Let O be the result of calling ToObject passing the |this|
+ // value as the argument.
+ var O = Object(this);
+
+ // 2. Let lenValue be the result of calling the Get internal
+ // method of O with the argument "length".
+ // 3. Let len be ToUint32(lenValue).
+ var len = O.length >>> 0;
+
+ // 4. If IsCallable(callback) is false, throw a TypeError exception.
+ // See: http://es5.github.com/#x9.11
+ if (typeof callback !== 'function') {
+ throw new TypeError(callback + ' is not a function');
+ }
+
+ // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
+ if (arguments.length > 1) {
+ T = thisArg;
+ }
+
+ // 6. Let A be a new array created as if by the expression new Array(len)
+ // where Array is the standard built-in constructor with that name and
+ // len is the value of len.
+ A = new Array(len);
+
+ // 7. Let k be 0
+ k = 0;
+
+ // 8. Repeat, while k < len
+ while (k < len) {
+
+ var kValue, mappedValue;
+
+ // a. Let Pk be ToString(k).
+ // This is implicit for LHS operands of the in operator
+ // b. Let kPresent be the result of calling the HasProperty internal
+ // method of O with argument Pk.
+ // This step can be combined with c
+ // c. If kPresent is true, then
+ if (k in O) {
+
+ // i. Let kValue be the result of calling the Get internal
+ // method of O with argument Pk.
+ kValue = O[k];
+
+ // ii. Let mappedValue be the result of calling the Call internal
+ // method of callback with T as the this value and argument
+ // list containing kValue, k, and O.
+ mappedValue = callback.call(T, kValue, k, O);
+
+ // iii. Call the DefineOwnProperty internal method of A with arguments
+ // Pk, Property Descriptor
+ // { Value: mappedValue,
+ // Writable: true,
+ // Enumerable: true,
+ // Configurable: true },
+ // and false.
+
+ // In browsers that support Object.defineProperty, use the following:
+ // Object.defineProperty(A, k, {
+ // value: mappedValue,
+ // writable: true,
+ // enumerable: true,
+ // configurable: true
+ // });
+
+ // For best browser support, use the following:
+ A[k] = mappedValue;
+ }
+ // d. Increase k by 1.
+ k++;
+ }
+
+ // 9. return A
+ return A;
+ };
+}
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| ---------------------------------------------------------------------------------------------------- | ---------------------------- | --------------------------------------------------- |
+| {{SpecName('ES5.1', '#sec-15.4.4.19', 'Array.prototype.map')}} | {{Spec2('ES5.1')}} | Definición inicial. Implementado en JavaScript 1.6. |
+| {{SpecName('ES6', '#sec-array.prototype.map', 'Array.prototype.map')}} | {{Spec2('ES6')}} | |
+| {{SpecName('ESDraft', '#sec-array.prototype.map', 'Array.prototype.map')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad con navegadores
+
+{{Compat("javascript.builtins.Array.map")}}
+
+## Véase también
+
+- {{jsxref("Array.prototype.forEach()")}}
+- {{jsxref("Map")}} object
+- {{jsxref("Array.from()")}}
diff --git a/files/es/web/javascript/reference/global_objects/array/slice/index.html b/files/es/web/javascript/reference/global_objects/array/slice/index.html
deleted file mode 100644
index eead914c30a760..00000000000000
--- a/files/es/web/javascript/reference/global_objects/array/slice/index.html
+++ /dev/null
@@ -1,240 +0,0 @@
----
-title: Array.prototype.slice()
-slug: Web/JavaScript/Reference/Global_Objects/Array/slice
-tags:
- - Arreglo
-translation_of: Web/JavaScript/Reference/Global_Objects/Array/slice
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/slice
----
-{{JSRef}}
-
-El método slice()
devuelve una copia de una parte del array dentro de un nuevo array empezando por inicio hasta fin (fin no incluido). El array original no se modificará.
-
-El código fuente de esta demostración interactiva está alojado en un repositorio Github. Si desea contribuir con ella, por favor clone https://github.com/mdn/interactive-examples y envíenos un "pull request" .
-
-Sintaxis
-
-arr .slice([inicio [, fin ]])
-
-Parámetros
-
-
- inicio
- Índice donde empieza la extracción. El primer elemento corresponde con el índice 0.
- Si el índice especificado es negativo, indica un desplazamiento desde el final del array. slice(-2)
extrae los dos últimos elementos del array
- Si inicio
es omitido el valor por defecto es 0
.
- Si inicio
es mayor a la longitud del array, se devuelve un array vacío.
- fin
- Índice que marca el final de la extracción. slice
extrae hasta, pero sin incluir el final.
- slice(1,4)
extrae desde el segundo elemento hasta el cuarto (los elementos con índices 1, 2, y 3).
- Con un índice negativo, fin
indica un desplazamiento desde el final de la secuencia. slice(2,-1)
extrae desde el tercer hasta el penúltimo elemento en la secuencia.
- Si fin
es omitido, slice extrae hasta el final de la secuencia (arr.length
).
- Si fin
es mayor a la longitud del array, slice
extrae hasta el final de la secuencia (arr.length
).
-
-
-Valor de retorno
-
-Un nuevo array con los valores extraídos.
-
-Descripción
-
-slice
no modifica el array original. Devuelve una copia plana (shallow copy ) de los elementos especificados del array original. Los elementos del array original son copiados en el array devuelto de la siguiente manera:
-
-
- Para referencias de objeto ( no el objeto en sí ), slice copia la referencia dentro del nuevo array
. Ambos, el array original y el nuevo, referencian al mismo objeto. Si un objeto referenciado cambia, los cambios son visibles para ambos arrays.
- Para strings, numbers y boolean (no objetos {{jsxref("Global_Objects/String", "String")}} y {{jsxref("Global_Objects/Number", "Number")}}), slice
copia los valores en el nuevo array. Los cambios a los string, numbers y boolean en un array no afectan a los del otro array.
-
-
-Si un nuevo elemento es agregado a cualquiera de los arrays, el otro array no es afectado.
-
-Ejemplos
-
-Ejemplo: Devolver una porción de un array existente
-
-var nombres = ['Rita', 'Pedro', 'Miguel', 'Ana', 'Vanesa'];
-var masculinos = nombres.slice(1, 3);
-
-// masculinos contiene ['Pedro','Miguel']
-
-
-Ejemplo: Utilizando slice
-
-Presta especial atención a:
-
-
- Valores de tipos básicos, como string o number, son copiados al nuevo array. Cambiar estos valores en la copia no afecta al array original.
- Las referencias también se copian. Mismas referencias acceden al mismo objeto destino. Cambios en el objeto destino son compartidos por todos sus accesos.
-
-
-En el siguiente ejemplo, slice
crea un nuevo array, nuevoCoche
, de myCoche
. Los dos incluyen una referncia al objecto miHonda
se cambia a púrpura, ambas matrices reflejan el cambio.
-
-var miHonda = { color: 'red', ruedas: 4, motor: { cilindros: 4, cantidad: 2.2 } };
-var miCoche = [miHonda, 2, 'Buen estado', 'comprado 1997'];
-var nuevoCoche = miCoche.slice(0, 2);
-
-// Muestra los valores de myCar, newCar y el color de myHonda.
-console.log('miCoche = ' + JSON.stringify(miCoche));
-console.log('nuevoCoche = ' + JSON.stringify(nuevoCoche));
-console.log('miCoche[0].color = ' + miCoche[0].color);
-console.log('nuevoCoche[0].color = ' + nuevoCoche[0].color);
-
-// Cambia el color de miHonda.
-miHonda.color = 'azul';
-console.log('El nuevo color de mi Honda es ' + miHonda.color);
-
-// Muestra el color de myHonda referenciado desde ambos arrays.
-console.log('miCoche[0].color = ' + miCoche[0].color);
-
-console.log('nuevoCoche[0].color = ' + nuevoCoche[0].color);
-
-Este script escribe:
-
-miCoche = [{color: 'rojo', ruedas: 4, motor: {cilindros: 4, cantidad: 2.2}}, 2,
- 'buen estado', 'comprado 1997']
-nuevoCoche = [{color: 'rojo', ruedas: 4, motor: {cilindros: 4, cantidad: 2.2}}, 2]
-miCoche[0].color = rojo
-nuevoCoche[0].color = rojo
-El nuevo color de miHonda es azul
-miCoche[0].color = azul
-nuevoCoche[0].color = azul
-
-Objetos array-like
-
-
-
Se dice que un objeto es array-like ( similar o que se asemeja a un array) cuando entre sus propiedades existen algunas cuyos nombres son números y en particular tiene una propiedad llamada length . Este hecho hace suponer que el objeto es algún tipo de colección de elementos indexados por números. Es conveniente, a veces, convertir estos objetos a arrays para otorgarles la funcionalidad que de serie se incorpora en todos los arrays a través de su prototipo.
-
-
-El método slice
puede ser usado para convertir objetos parecidos a arrays o colecciones a un nuevo Array. Simplemente debe enlazar el método al objeto. El {{jsxref("Functions_and_function_scope/arguments", "arguments")}} dentro de una función es un ejemplo de un objeto parecido a arrays.
-
-function list() {
- return Array.prototype.slice.call(arguments, 0);
-}
-
-var list1 = list(1, 2, 3); // [1, 2, 3]
-
-
-El enlazado puede realizarse con la función .call
de {{jsxref("Function.prototype")}} y puede ser abreviado también usando [].slice.call(arguments)
en lugar de Array.prototype.slice.call
. En cualquier caso, puede ser simplificado usando {{jsxref("Function.prototype.bind", "bind")}}.
-
-var unboundSlice = Array.prototype.slice;
-var slice = Function.prototype.call.bind(unboundSlice);
-
-function list() {
- return slice(arguments, 0);
-}
-
-var list1 = list(1, 2, 3); // [1, 2, 3]
-
-
-Coordinación del comportamiento entre navegadores
-
-
-
-La especificación permite a los objetos del host ( entre ellos los objetos del DOM ) ser dependientes de la implementación. Esta NO obligatoriedad, origina diferencias en el comportamiento entre aquellos comprometidos con los estándares, como Mozilla, y los que no. En lo que concierne a Array.prototype.slice
, por lo tanto, existen importantes incompatibilidades en IE < 9 . Versiones de IE a partir de la 9 permiten un comportamiento compatible más fiable. Se puede recurrir al “shimming ” para alcanzar la compatibilidad en otros casos. Mientras otros navegadores modernos continúan mejorando para soportar esta habilidad, en la forma en que actualmente lo hacen Mozilla, Chrome, Safari, Opera e IE, los desarrolladores de código preocupados por el soporte DOM que confíen en este shim no deben dejarse engañar por la semántica, deben confiar de forma segura en ella para proporcionar el comportamiento estándar que aparentemente ahora es la norma.
-
-El shim también soluciona que IE pueda tratar con el caso de que el segundo argumento de slice()
pueda ser un valor {{jsxref("Global_Objects/null", "null")}}/{{jsxref("Global_Objects/undefined", "undefined")}} explícito. Esto era un problema en versiones anteriores de IE, pero todos los navegadores modernos, incluído IE >= 9, lo hacen actualmente.
-
-/**
- * Shim para "solucionar" la falta de soporte de IE (IE < 9) para aplicar slice
- * sobre objetos del host, tal como NamedNodeMap, NodeList, y HTMLCollection
- * (técnicamente, al ser los objetos del host dependientes de la implementación,
- * al menos anteriormente a ES2015, IE no tenía la necesidad de trabajar de este modo).
- * También funciona sobre strings, solucionando que IE < 9 admita un undefined explícito
- * como segundo argumento (igual que en Firefox), y previniendo errores cuando se llama
- * sobre otros objetos del DOM.
- */
-(function () {
- 'use strict';
- var _slice = Array.prototype.slice;
-
- try {
- // Fallará al usarse con elementos DOM en IE < 9
- _slice.call(document.documentElement);
- } catch (e) { // Fails in IE < 9
- // Funcionará con arrays genuinos, objetos array-like,
- // NamedNodeMap (attributes, entities, notations),
- // NodeList (e.g., getElementsByTagName), HTMLCollection (e.g., childNodes),
- // and will not fail on other DOM objects (as do DOM elements in IE < 9)
- Array.prototype.slice = function(begin, end) {
- // A IE < 9 no le gustan los undefined como argumento end.
- end = (typeof end !== 'undefined') ? end : this.length;
-
- // Con objetos Array nativos, podemos usar la función slice
- if (Object.prototype.toString.call(this) === '[object Array]'){
- return _slice.call(this, begin, end);
- }
-
- // Con objetos array-like debemos manejarlo por nuestra cuenta.
- var i, cloned = [],
- size, len = this.length;
-
- // Maneja valores negativos para el argumento "inicio"
- var start = begin || 0;
- start = (start >= 0) ? start : Math.max(0, len + start);
-
- // Maneja valores negativos para el argumento "fin"
- var upTo = (typeof end == 'number') ? Math.min(end, len) : len;
- if (end < 0) {
- upTo = len + end;
- }
-
- // Tamaño esperado para el slice
- size = upTo - start;
-
- if (size > 0) {
- cloned = new Array(size);
- if (this.charAt) {
- for (i = 0; i < size; i++) {
- cloned[i] = this.charAt(start + i);
- }
- } else {
- for (i = 0; i < size; i++) {
- cloned[i] = this[start + i];
- }
- }
- }
-
- return cloned;
- };
- }
-}());
-
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Observaciones
-
-
- ECMAScript 3ª edición
- Estandar
- Definición inicial Implementado en JavaScript 1.2.
-
-
- {{SpecName('ES5.1', '#sec-15.4.4.10', 'Array.prototype.slice')}}
- {{Spec2('ES5.1')}}
-
-
-
- {{SpecName('ES2015', '#sec-array.prototype.slice', 'Array.prototype.slice')}}
- {{Spec2('ES2015')}}
-
-
-
-
-
-Compatibilidad con navegadores
-
-La tabla de compatibilidad en esta página esta generada desde datos estructurados. Si desea contribuir con los datos, por favor "checkout" https://github.com/mdn/browser-compat-data y envíenos un "pull request" .
-
-{{Compat("javascript.builtins.Array.slice")}}
-
-Ver también
-
-
- {{jsxref("Function.prototype.call()")}}
- {{jsxref("Function.prototype.bind()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/array/slice/index.md b/files/es/web/javascript/reference/global_objects/array/slice/index.md
new file mode 100644
index 00000000000000..fa6d82d928d718
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/array/slice/index.md
@@ -0,0 +1,227 @@
+---
+title: Array.prototype.slice()
+slug: Web/JavaScript/Reference/Global_Objects/Array/slice
+tags:
+ - Arreglo
+translation_of: Web/JavaScript/Reference/Global_Objects/Array/slice
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/slice
+---
+{{JSRef}}
+
+`El método slice()` devuelve una copia de una parte del array dentro de un nuevo array empezando por _inicio_ hasta _fin_ (_fin_ no incluido). El array original no se modificará.
+
+El código fuente de esta demostración interactiva está alojado en un repositorio Github. Si desea contribuir con ella, por favor clone y envíenos un _"pull request"_.
+
+## Sintaxis
+
+```
+arr.slice([inicio [, fin]])
+```
+
+## Parámetros
+
+- `inicio`
+ - : Índice donde empieza la extracción. El primer elemento corresponde con el índice 0.
+
+ Si el índice especificado es negativo, indica un desplazamiento desde el final del array.`slice(-2)`extrae los dos últimos elementos del array
+
+ Si `inicio` es omitido el valor por defecto es `0`.
+
+ Si `inicio` es mayor a la longitud del array, se devuelve un array vacío.
+
+- `fin`
+ - : Índice que marca el final de la extracción. `slice` extrae hasta, pero sin incluir el final.
+
+ `slice(1,4)` extrae desde el segundo elemento hasta el cuarto (los elementos con índices 1, 2, y 3).
+
+ Con un índice negativo, `fin` indica un desplazamiento desde el final de la secuencia. `slice(2,-1)` extrae desde el tercer hasta el penúltimo elemento en la secuencia.
+
+ Si `fin` es omitido, slice extrae hasta el final de la secuencia (`arr.length`)`.`
+
+ Si `fin` es mayor a la longitud del array, `slice` extrae hasta el final de la secuencia (`arr.length`)`.`
+
+### `Valor de retorno`
+
+Un nuevo array con los valores extraídos.
+
+## Descripción
+
+`slice` **no modifica** el array original. Devuelve una copia plana (_shallow copy_) de los elementos especificados del array original. Los elementos del array original son copiados en el array devuelto de la siguiente manera:
+
+- Para referencias de objeto ( **no** el objeto en sí ), `slice copia la referencia dentro del nuevo array`. Ambos, el array original y el nuevo, referencian al mismo objeto. Si un objeto referenciado cambia, los cambios son visibles para ambos arrays.
+- Para strings, numbers y boolean (**no** objetos {{jsxref("Global_Objects/String", "String")}} y {{jsxref("Global_Objects/Number", "Number")}}), `slice` copia los valores en el nuevo array. Los cambios a los string, numbers y boolean en un array no afectan a los del otro array.
+
+Si un nuevo elemento es agregado a cualquiera de los arrays, el otro array no es afectado.
+
+## Ejemplos
+
+### Ejemplo: Devolver una porción de un array existente
+
+```js
+var nombres = ['Rita', 'Pedro', 'Miguel', 'Ana', 'Vanesa'];
+var masculinos = nombres.slice(1, 3);
+
+// masculinos contiene ['Pedro','Miguel']
+```
+
+### Ejemplo: Utilizando slice
+
+Presta especial atención a:
+
+- Valores de tipos básicos, como string o number, son copiados al nuevo array. Cambiar estos valores en la copia no afecta al array original.
+- Las referencias también se copian. Mismas referencias acceden al mismo objeto destino. Cambios en el objeto destino son compartidos por todos sus accesos.
+
+En el siguiente ejemplo, `slice` crea un nuevo array, `nuevoCoche`, de `myCoche`. Los dos incluyen una referncia al objecto `miHonda` se cambia a púrpura, ambas matrices reflejan el cambio.
+
+```js
+var miHonda = { color: 'red', ruedas: 4, motor: { cilindros: 4, cantidad: 2.2 } };
+var miCoche = [miHonda, 2, 'Buen estado', 'comprado 1997'];
+var nuevoCoche = miCoche.slice(0, 2);
+
+// Muestra los valores de myCar, newCar y el color de myHonda.
+console.log('miCoche = ' + JSON.stringify(miCoche));
+console.log('nuevoCoche = ' + JSON.stringify(nuevoCoche));
+console.log('miCoche[0].color = ' + miCoche[0].color);
+console.log('nuevoCoche[0].color = ' + nuevoCoche[0].color);
+
+// Cambia el color de miHonda.
+miHonda.color = 'azul';
+console.log('El nuevo color de mi Honda es ' + miHonda.color);
+
+// Muestra el color de myHonda referenciado desde ambos arrays.
+console.log('miCoche[0].color = ' + miCoche[0].color);
+
+console.log('nuevoCoche[0].color = ' + nuevoCoche[0].color);
+```
+
+Este script escribe:
+
+```js
+miCoche = [{color: 'rojo', ruedas: 4, motor: {cilindros: 4, cantidad: 2.2}}, 2,
+ 'buen estado', 'comprado 1997']
+nuevoCoche = [{color: 'rojo', ruedas: 4, motor: {cilindros: 4, cantidad: 2.2}}, 2]
+miCoche[0].color = rojo
+nuevoCoche[0].color = rojo
+El nuevo color de miHonda es azul
+miCoche[0].color = azul
+nuevoCoche[0].color = azul
+```
+
+## Objetos array-like
+
+> **Nota:** Se dice que un objeto es **array-like** ( similar o que se asemeja a un array) cuando entre sus propiedades existen algunas cuyos nombres son **números** y en particular tiene una propiedad llamada **length**. Este hecho hace suponer que el objeto es algún tipo de colección de elementos indexados por números. Es conveniente, a veces, convertir estos objetos a arrays para otorgarles la funcionalidad que de serie se incorpora en todos los arrays a través de su prototipo.
+
+El método `slice` puede ser usado para convertir objetos parecidos a arrays o colecciones a un nuevo Array. Simplemente debe enlazar el método al objeto. El {{jsxref("Functions_and_function_scope/arguments", "arguments")}} dentro de una función es un ejemplo de un objeto parecido a arrays.
+
+```js
+function list() {
+ return Array.prototype.slice.call(arguments, 0);
+}
+
+var list1 = list(1, 2, 3); // [1, 2, 3]
+```
+
+El enlazado puede realizarse con la función `.call` de {{jsxref("Function.prototype")}} y puede ser abreviado también usando `[].slice.call(arguments)` en lugar de `Array.prototype.slice.call`. En cualquier caso, puede ser simplificado usando {{jsxref("Function.prototype.bind", "bind")}}.
+
+```js
+var unboundSlice = Array.prototype.slice;
+var slice = Function.prototype.call.bind(unboundSlice);
+
+function list() {
+ return slice(arguments, 0);
+}
+
+var list1 = list(1, 2, 3); // [1, 2, 3]
+```
+
+## Coordinación del comportamiento entre navegadores
+
+La especificación permite a los objetos del host ( entre ellos los objetos del DOM ) ser dependientes de la implementación. Esta **NO** obligatoriedad, origina diferencias en el comportamiento entre aquellos comprometidos con los estándares, como Mozilla, y los que no. En lo que concierne a `Array.prototype.slice` , por lo tanto, existen importantes incompatibilidades en IE < 9 . Versiones de IE a partir de la 9 permiten un comportamiento compatible más fiable. Se puede recurrir al “_shimming_” para alcanzar la compatibilidad en otros casos. Mientras otros navegadores modernos continúan mejorando para soportar esta habilidad, en la forma en que actualmente lo hacen Mozilla, Chrome, Safari, Opera e IE, los desarrolladores de código preocupados por el soporte DOM que confíen en este _shim_ no deben dejarse engañar por la semántica, deben confiar de forma segura en ella para proporcionar el comportamiento estándar que aparentemente ahora es la norma.
+
+El _shim_ también soluciona que IE pueda tratar con el caso de que el segundo argumento de `slice()` pueda ser un valor {{jsxref("Global_Objects/null", "null")}}/{{jsxref("Global_Objects/undefined", "undefined")}} explícito. Esto era un problema en versiones anteriores de IE, pero todos los navegadores modernos, incluído IE >= 9, lo hacen actualmente.
+
+```js
+/**
+ * Shim para "solucionar" la falta de soporte de IE (IE < 9) para aplicar slice
+ * sobre objetos del host, tal como NamedNodeMap, NodeList, y HTMLCollection
+ * (técnicamente, al ser los objetos del host dependientes de la implementación,
+ * al menos anteriormente a ES2015, IE no tenía la necesidad de trabajar de este modo).
+ * También funciona sobre strings, solucionando que IE < 9 admita un undefined explícito
+ * como segundo argumento (igual que en Firefox), y previniendo errores cuando se llama
+ * sobre otros objetos del DOM.
+ */
+(function () {
+ 'use strict';
+ var _slice = Array.prototype.slice;
+
+ try {
+ // Fallará al usarse con elementos DOM en IE < 9
+ _slice.call(document.documentElement);
+ } catch (e) { // Fails in IE < 9
+ // Funcionará con arrays genuinos, objetos array-like,
+ // NamedNodeMap (attributes, entities, notations),
+ // NodeList (e.g., getElementsByTagName), HTMLCollection (e.g., childNodes),
+ // and will not fail on other DOM objects (as do DOM elements in IE < 9)
+ Array.prototype.slice = function(begin, end) {
+ // A IE < 9 no le gustan los undefined como argumento end.
+ end = (typeof end !== 'undefined') ? end : this.length;
+
+ // Con objetos Array nativos, podemos usar la función slice
+ if (Object.prototype.toString.call(this) === '[object Array]'){
+ return _slice.call(this, begin, end);
+ }
+
+ // Con objetos array-like debemos manejarlo por nuestra cuenta.
+ var i, cloned = [],
+ size, len = this.length;
+
+ // Maneja valores negativos para el argumento "inicio"
+ var start = begin || 0;
+ start = (start >= 0) ? start : Math.max(0, len + start);
+
+ // Maneja valores negativos para el argumento "fin"
+ var upTo = (typeof end == 'number') ? Math.min(end, len) : len;
+ if (end < 0) {
+ upTo = len + end;
+ }
+
+ // Tamaño esperado para el slice
+ size = upTo - start;
+
+ if (size > 0) {
+ cloned = new Array(size);
+ if (this.charAt) {
+ for (i = 0; i < size; i++) {
+ cloned[i] = this.charAt(start + i);
+ }
+ } else {
+ for (i = 0; i < size; i++) {
+ cloned[i] = this[start + i];
+ }
+ }
+ }
+
+ return cloned;
+ };
+ }
+}());
+```
+
+## Especificaciones
+
+| Especificación | Estado | Observaciones |
+| -------------------------------------------------------------------------------------------------------- | ------------------------ | -------------------------------------------------- |
+| ECMAScript 3ª edición | Estandar | Definición inicial Implementado en JavaScript 1.2. |
+| {{SpecName('ES5.1', '#sec-15.4.4.10', 'Array.prototype.slice')}} | {{Spec2('ES5.1')}} | |
+| {{SpecName('ES2015', '#sec-array.prototype.slice', 'Array.prototype.slice')}} | {{Spec2('ES2015')}} | |
+
+## Compatibilidad con navegadores
+
+La tabla de compatibilidad en esta página esta generada desde datos estructurados. Si desea contribuir con los datos, por favor _"checkout"_ [https://github.com/mdn/browser-compat-data](https://github.com/mdn/browser-compat-data)y envíenos un _"pull request"_.
+
+{{Compat("javascript.builtins.Array.slice")}}
+
+## Ver también
+
+- {{jsxref("Function.prototype.call()")}}
+- {{jsxref("Function.prototype.bind()")}}
diff --git a/files/es/web/javascript/reference/global_objects/array/splice/index.html b/files/es/web/javascript/reference/global_objects/array/splice/index.html
deleted file mode 100644
index 2f097099afe94d..00000000000000
--- a/files/es/web/javascript/reference/global_objects/array/splice/index.html
+++ /dev/null
@@ -1,149 +0,0 @@
----
-title: Array.prototype.splice()
-slug: Web/JavaScript/Reference/Global_Objects/Array/splice
-tags:
- - Array
- - JavaScript
- - Prototipo
- - Referencia
- - metodo
-translation_of: Web/JavaScript/Reference/Global_Objects/Array/splice
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/splice
----
-{{JSRef}}
-
-El método splice()
cambia el contenido de un array eliminando elementos existentes y/o agregando nuevos elementos.
-
-{{EmbedInteractiveExample("pages/js/array-splice.html")}}
-
-Sintaxis
-
-array .splice(start[ , deleteCount[ , item1[ , item2[ , ...]]]] )
-
-
-Parámetros
-
-
- start
- Índice donde se comenzará a cambiar el array (con 0 como origen). Si es mayor que la longitud del array, el punto inicial será la longitud del array. Si es negativo, empezará esa cantidad de elementos contando desde el final.
- deleteCount
{{optional_inline}}
- Un entero indicando el número de elementos a eliminar del array antiguo.
- Si deleteCount
se omite, o si su valor es mayor que arr.length - start
(esto significa, si es mayor que el número de elementos restantes del array, comenzando desde start
), entonces todos los elementos desde start
hasta el final del array serán eliminados.
- Si deleteCount
es igual a 0 o negativo, no se eliminará ningún elemento. En este caso, se debe especificar al menos un nuevo elemento (ver más abajo).
- item1, item2, ...
{{optional_inline}}
- Los elementos que se agregarán al array, empezando en el índice start
. Si no se especifica ningún elemento, splice()
solamente eliminará elementos del array.
-
-
-Valor devuelto
-
-Un array que contiene los elementos eliminados. Si sólo se ha eliminado un elemento, devuelve un array con un solo elemento. Si no se ha eliminado ningún elemento, devuelve un array vacío.
-
-Descripción
-
-Si especifica un número diferente de elementos a agregar que los que se eliminarán, el array tendrá un tamaño diferente al original una vez finalizada la llamada.
-
-Ejemplos
-
-Eliminar 0 elementos desde el índice 2 e insertar "drum"
-
-var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];
-var removed = myFish.splice(2, 0, 'drum');
-
-// myFish is ["angel", "clown", "drum", "mandarin", "sturgeon"]
-// removed is [], no elements removed
-
-
-Eliminar 1 elemento desde el índice 3
-
-var myFish = ['angel', 'clown', 'drum', 'mandarin', 'sturgeon'];
-var removed = myFish.splice(3, 1);
-
-// removed is ["mandarin"]
-// myFish is ["angel", "clown", "drum", "sturgeon"]
-
-
-Eliminar 1 elemento desde el índice 2 e insertar "trumpet"
-
-var myFish = ['angel', 'clown', 'drum', 'sturgeon'];
-var removed = myFish.splice(2, 1, 'trumpet');
-
-// myFish is ["angel", "clown", "trumpet", "sturgeon"]
-// removed is ["drum"]
-
-Eliminar 2 elementos desde el índice 0 e insertar "parrot", "anemone" y "blue"
-
-var myFish = ['angel', 'clown', 'trumpet', 'sturgeon'];
-var removed = myFish.splice(0, 2, 'parrot', 'anemone', 'blue');
-
-// myFish is ["parrot", "anemone", "blue", "trumpet", "sturgeon"]
-// removed is ["angel", "clown"]
-
-Eliminar 2 elementos desde el índice 2
-
-var myFish = ['parrot', 'anemone', 'blue', 'trumpet', 'sturgeon'];
-var removed = myFish.splice(myFish.length - 3, 2);
-
-// myFish is ["parrot", "anemone", "sturgeon"]
-// removed is ["blue", "trumpet"]
-
-Eliminar 1 elemento desde el índice -2
-
-var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];
-var removed = myFish.splice(-2, 1);
-
-// myFish is ["angel", "clown", "sturgeon"]
-// removed is ["mandarin"]
-
-Eliminar todos los elementos tras el índice 2 (incl.)
-
-var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];
-var removed = myFish.splice(2);
-
-// myFish is ["angel", "clown"]
-// removed is ["mandarin", "sturgeon"]
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES3')}}
- {{Spec2('ES3')}}
- Initial definition. Implemented in JavaScript 1.2.
-
-
- {{SpecName('ES5.1', '#sec-15.4.4.12', 'Array.prototype.splice')}}
- {{Spec2('ES5.1')}}
-
-
-
- {{SpecName('ES6', '#sec-array.prototype.splice', 'Array.prototype.splice')}}
- {{Spec2('ES6')}}
-
-
-
- {{SpecName('ESDraft', '#sec-array.prototype.splice', 'Array.prototype.splice')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad con navegadores
-
-
-
{{Compat("javascript.builtins.Array.splice")}}
-
-
-Ver también
-
-
- {{jsxref("Array.prototype.push()", "push()")}} / {{jsxref("Array.prototype.pop()", "pop()")}} — añade/elimina elementos desde el final de un array
- {{jsxref("Array.prototype.unshift()", "unshift()")}} / {{jsxref("Array.prototype.shift()", "shift()")}} — añade/elimina elementos desde el principio de un array
- {{jsxref("Array.prototype.concat()", "concat()")}} — devuelve un nuevo array compuesto por este array unido a otro/s array/s y/o valor/es
-
diff --git a/files/es/web/javascript/reference/global_objects/array/splice/index.md b/files/es/web/javascript/reference/global_objects/array/splice/index.md
new file mode 100644
index 00000000000000..df715e89930331
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/array/splice/index.md
@@ -0,0 +1,135 @@
+---
+title: Array.prototype.splice()
+slug: Web/JavaScript/Reference/Global_Objects/Array/splice
+tags:
+ - Array
+ - JavaScript
+ - Prototipo
+ - Referencia
+ - metodo
+translation_of: Web/JavaScript/Reference/Global_Objects/Array/splice
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Array/splice
+---
+{{JSRef}}
+
+El método **`splice()`** cambia el contenido de un array eliminando elementos existentes y/o agregando nuevos elementos.
+
+{{EmbedInteractiveExample("pages/js/array-splice.html")}}
+
+## Sintaxis
+
+```
+array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
+```
+
+### Parámetros
+
+- `start`
+ - : Índice donde se comenzará a cambiar el array (con 0 como origen). Si es mayor que la longitud del array, el punto inicial será la longitud del array. Si es negativo, empezará esa cantidad de elementos contando desde el final.
+- `deleteCount` {{optional_inline}}
+ - : Un entero indicando el número de elementos a eliminar del array antiguo.
+
+ Si `deleteCount` se omite, o si su valor es mayor que `arr.length - start` (esto significa, si es mayor que el número de elementos restantes del array, comenzando desde `start`), entonces todos los elementos desde `start` hasta el final del array serán eliminados.
+
+ Si `deleteCount` es igual a 0 o negativo, no se eliminará ningún elemento. En este caso, se debe especificar al menos un nuevo elemento (ver más abajo).
+- `item1, item2, ...` {{optional_inline}}
+ - : Los elementos que se agregarán al array, empezando en el índice `start`. Si no se especifica ningún elemento, `splice()` solamente eliminará elementos del array.
+
+### Valor devuelto
+
+Un array que contiene los elementos eliminados. Si sólo se ha eliminado un elemento, devuelve un array con un solo elemento. Si no se ha eliminado ningún elemento, devuelve un array vacío.
+
+## Descripción
+
+Si especifica un número diferente de elementos a agregar que los que se eliminarán, el array tendrá un tamaño diferente al original una vez finalizada la llamada.
+
+## Ejemplos
+
+### Eliminar 0 elementos desde el índice 2 e insertar "drum"
+
+```js
+var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];
+var removed = myFish.splice(2, 0, 'drum');
+
+// myFish is ["angel", "clown", "drum", "mandarin", "sturgeon"]
+// removed is [], no elements removed
+```
+
+### Eliminar 1 elemento desde el índice 3
+
+```js
+var myFish = ['angel', 'clown', 'drum', 'mandarin', 'sturgeon'];
+var removed = myFish.splice(3, 1);
+
+// removed is ["mandarin"]
+// myFish is ["angel", "clown", "drum", "sturgeon"]
+```
+
+### Eliminar 1 elemento desde el índice 2 e insertar "trumpet"
+
+```js
+var myFish = ['angel', 'clown', 'drum', 'sturgeon'];
+var removed = myFish.splice(2, 1, 'trumpet');
+
+// myFish is ["angel", "clown", "trumpet", "sturgeon"]
+// removed is ["drum"]
+```
+
+### Eliminar 2 elementos desde el índice 0 e insertar "parrot", "anemone" y "blue"
+
+```js
+var myFish = ['angel', 'clown', 'trumpet', 'sturgeon'];
+var removed = myFish.splice(0, 2, 'parrot', 'anemone', 'blue');
+
+// myFish is ["parrot", "anemone", "blue", "trumpet", "sturgeon"]
+// removed is ["angel", "clown"]
+```
+
+### Eliminar 2 elementos desde el índice 2
+
+```js
+var myFish = ['parrot', 'anemone', 'blue', 'trumpet', 'sturgeon'];
+var removed = myFish.splice(myFish.length - 3, 2);
+
+// myFish is ["parrot", "anemone", "sturgeon"]
+// removed is ["blue", "trumpet"]
+```
+
+### Eliminar 1 elemento desde el índice -2
+
+```js
+var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];
+var removed = myFish.splice(-2, 1);
+
+// myFish is ["angel", "clown", "sturgeon"]
+// removed is ["mandarin"]
+```
+
+### Eliminar todos los elementos tras el índice 2 (incl.)
+
+```js
+var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];
+var removed = myFish.splice(2);
+
+// myFish is ["angel", "clown"]
+// removed is ["mandarin", "sturgeon"]
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| ------------------------------------------------------------------------------------------------------------ | ---------------------------- | -------------------------------------------------- |
+| {{SpecName('ES3')}} | {{Spec2('ES3')}} | Initial definition. Implemented in JavaScript 1.2. |
+| {{SpecName('ES5.1', '#sec-15.4.4.12', 'Array.prototype.splice')}} | {{Spec2('ES5.1')}} | |
+| {{SpecName('ES6', '#sec-array.prototype.splice', 'Array.prototype.splice')}} | {{Spec2('ES6')}} | |
+| {{SpecName('ESDraft', '#sec-array.prototype.splice', 'Array.prototype.splice')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad con navegadores
+
+{{Compat("javascript.builtins.Array.splice")}}
+
+## Ver también
+
+- {{jsxref("Array.prototype.push()", "push()")}} / {{jsxref("Array.prototype.pop()", "pop()")}} — añade/elimina elementos desde el final de un array
+- {{jsxref("Array.prototype.unshift()", "unshift()")}} / {{jsxref("Array.prototype.shift()", "shift()")}} — añade/elimina elementos desde el principio de un array
+- {{jsxref("Array.prototype.concat()", "concat()")}} — devuelve un nuevo array compuesto por este array unido a otro/s array/s y/o valor/es
diff --git a/files/es/web/javascript/reference/global_objects/boolean/boolean/index.html b/files/es/web/javascript/reference/global_objects/boolean/boolean/index.html
deleted file mode 100644
index de9e3968be0929..00000000000000
--- a/files/es/web/javascript/reference/global_objects/boolean/boolean/index.html
+++ /dev/null
@@ -1,76 +0,0 @@
----
-title: Boolean() constructor
-slug: Web/JavaScript/Reference/Global_Objects/Boolean/Boolean
-tags:
- - Booleano
- - Constructor
- - JavaScript
- - Referencia
-translation_of: Web/JavaScript/Reference/Global_Objects/Boolean/Boolean
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Boolean/Boolean
----
-{{JSRef}}
-
-El constructor Boolean()
se usa para crear objetos {{jsxref("Boolean")}}.
-
-{{EmbedInteractiveExample("pages/js/boolean-constructor.html", "shorter")}}
-
-La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si deseas contribuir al proyecto de ejemplos interactivos, clona https://github.com/mdn/interactive-examples y envíanos una solicitud de extracción.
-
-Sintaxis
-
-new Boolean([value ])
-
-Parámetros
-
-
- value
{{optional_inline}}
- El valor inicial del objeto Boolean
.
-
-
-Ejemplos
-
-Creación de objetos Boolean
con un valor inicial de false
-
-var bNoParam = new Boolean();
-var bZero = new Boolean(0);
-var bNull = new Boolean(null);
-var bEmptyString = new Boolean('');
-var bfalse = new Boolean(false);
-
-
-Creación de objetos Boolean
con un valor inicial de true
-
-var btrue = new Boolean(true);
-var btrueString = new Boolean('true');
-var bfalseString = new Boolean('false');
-var bSuLin = new Boolean('Su Lin');
-var bArrayProto = new Boolean([]);
-var bObjProto = new Boolean({});
-
-Especificaciones
-
-
-
-
- Especificación
-
-
- {{SpecName('ESDraft', '#sec-boolean-constructor', 'Boolean constructor')}}
-
-
-
-
-Compatibilidad del navegador
-
-
-
-
-
{{Compat("javascript.builtins.Boolean.Boolean")}}
-
-
-Ve también
-
-
diff --git a/files/es/web/javascript/reference/global_objects/boolean/boolean/index.md b/files/es/web/javascript/reference/global_objects/boolean/boolean/index.md
new file mode 100644
index 00000000000000..da7876310550dd
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/boolean/boolean/index.md
@@ -0,0 +1,66 @@
+---
+title: Boolean() constructor
+slug: Web/JavaScript/Reference/Global_Objects/Boolean/Boolean
+tags:
+ - Booleano
+ - Constructor
+ - JavaScript
+ - Referencia
+translation_of: Web/JavaScript/Reference/Global_Objects/Boolean/Boolean
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Boolean/Boolean
+---
+{{JSRef}}
+
+El constructor **`Boolean()`** se usa para crear objetos {{jsxref("Boolean")}}.
+
+{{EmbedInteractiveExample("pages/js/boolean-constructor.html", "shorter")}}
+
+La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si deseas contribuir al proyecto de ejemplos interactivos, clona y envíanos una solicitud de extracción.
+
+## Sintaxis
+
+```
+new Boolean([value])
+```
+
+### Parámetros
+
+- `value` {{optional_inline}}
+ - : El valor inicial del objeto `Boolean`.
+
+## Ejemplos
+
+### Creación de objetos `Boolean` con un valor inicial de `false`
+
+```js
+var bNoParam = new Boolean();
+var bZero = new Boolean(0);
+var bNull = new Boolean(null);
+var bEmptyString = new Boolean('');
+var bfalse = new Boolean(false);
+```
+
+### Creación de objetos `Boolean` con un valor inicial de `true`
+
+```js
+var btrue = new Boolean(true);
+var btrueString = new Boolean('true');
+var bfalseString = new Boolean('false');
+var bSuLin = new Boolean('Su Lin');
+var bArrayProto = new Boolean([]);
+var bObjProto = new Boolean({});
+```
+
+## Especificaciones
+
+| Especificación |
+| ---------------------------------------------------------------------------------------------------- |
+| {{SpecName('ESDraft', '#sec-boolean-constructor', 'Boolean constructor')}} |
+
+## Compatibilidad del navegador
+
+{{Compat("javascript.builtins.Boolean.Boolean")}}
+
+## Ve también
+
+- [Boolean](/es/docs/Glossary/Boolean)
diff --git a/files/es/web/javascript/reference/global_objects/date/tojson/index.html b/files/es/web/javascript/reference/global_objects/date/tojson/index.html
deleted file mode 100644
index 65f71fded37e27..00000000000000
--- a/files/es/web/javascript/reference/global_objects/date/tojson/index.html
+++ /dev/null
@@ -1,62 +0,0 @@
----
-title: Date.prototype.toJSON()
-slug: Web/JavaScript/Reference/Global_Objects/Date/toJSON
-translation_of: Web/JavaScript/Reference/Global_Objects/Date/toJSON
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Date/toJSON
----
-{{JSRef}}
-
-El metodo toJSON()
retorna una representacion de cadena del objeto {{jsxref("Date")}}
-
-{{EmbedInteractiveExample("pages/js/date-tojson.html")}}
-
-La tabla de compatibilidad de esta página se genera a partir de datos estructurados. Si desea contribuir con los datos, por favor clone https://github.com/mdn/interactive-examples y envienos un pull request.
-
-Syntaxis
-
-dateObj .toJSON()
-
-Valor retornado
-
-Una representación de cadena de la fecha dada.
-
-Descripción
-
-{{jsxref("Date")}} las instancias se refieren a un momento específico en el tiempo. Llamando a toJSON()
retorna un string (usando {{jsxref("Date.prototype.toISOString()", "toISOString()")}}) representando el {{jsxref("Date")}} valor del objeto. Este método generalmente está destinado, de forma predeterminada, a serializar de manera útil {{jsxref("Date")}} objetos durante la serialización JSON .
-
-Ejemplos
-
-Usando toJSON()
-
-var jsonDate = (new Date()).toJSON();
-var backToDate = new Date(jsonDate);
-
-console.log(jsonDate); //2015-10-26T07:46:36.611Z
-
-
-Especificaciones
-
-
-
-
- Especificación
-
-
- {{SpecName('ESDraft', '#sec-date.prototype.tojson', 'Date.prototype.toJSON')}}
-
-
-
-
-Compatibilidad en buscadores
-
-
-
-{{Compat("javascript.builtins.Date.toJSON")}}
-
-Ver también
-
-
- {{jsxref("Date.prototype.toLocaleDateString()")}}
- {{jsxref("Date.prototype.toTimeString()")}}
- {{jsxref("Date.prototype.toUTCString()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/date/tojson/index.md b/files/es/web/javascript/reference/global_objects/date/tojson/index.md
new file mode 100644
index 00000000000000..26792f2e85936c
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/date/tojson/index.md
@@ -0,0 +1,54 @@
+---
+title: Date.prototype.toJSON()
+slug: Web/JavaScript/Reference/Global_Objects/Date/toJSON
+translation_of: Web/JavaScript/Reference/Global_Objects/Date/toJSON
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Date/toJSON
+---
+{{JSRef}}
+
+El metodo **`toJSON()`** retorna una representacion de cadena del objeto {{jsxref("Date")}}
+
+{{EmbedInteractiveExample("pages/js/date-tojson.html")}}
+
+La tabla de compatibilidad de esta página se genera a partir de datos estructurados. Si desea contribuir con los datos, por favor clone y envienos un pull request.
+
+## Syntaxis
+
+```
+dateObj.toJSON()
+```
+
+### Valor retornado
+
+Una representación de cadena de la fecha dada.
+
+## Descripción
+
+{{jsxref("Date")}} las instancias se refieren a un momento específico en el tiempo. Llamando a `toJSON()` retorna un string (usando {{jsxref("Date.prototype.toISOString()", "toISOString()")}}) representando el {{jsxref("Date")}} valor del objeto. Este método generalmente está destinado, de forma predeterminada, a serializar de manera útil {{jsxref("Date")}} objetos durante la serialización [JSON](/es/docs/Glossary/JSON) .
+
+## Ejemplos
+
+### Usando `toJSON()`
+
+```js
+var jsonDate = (new Date()).toJSON();
+var backToDate = new Date(jsonDate);
+
+console.log(jsonDate); //2015-10-26T07:46:36.611Z
+```
+
+## Especificaciones
+
+| Especificación |
+| -------------------------------------------------------------------------------------------------------- |
+| {{SpecName('ESDraft', '#sec-date.prototype.tojson', 'Date.prototype.toJSON')}} |
+
+## Compatibilidad en buscadores
+
+{{Compat("javascript.builtins.Date.toJSON")}}
+
+## Ver también
+
+- {{jsxref("Date.prototype.toLocaleDateString()")}}
+- {{jsxref("Date.prototype.toTimeString()")}}
+- {{jsxref("Date.prototype.toUTCString()")}}
diff --git a/files/es/web/javascript/reference/global_objects/decodeuricomponent/index.html b/files/es/web/javascript/reference/global_objects/decodeuricomponent/index.html
deleted file mode 100644
index 0dd16204652c16..00000000000000
--- a/files/es/web/javascript/reference/global_objects/decodeuricomponent/index.html
+++ /dev/null
@@ -1,43 +0,0 @@
----
-title: decodeURIComponent
-slug: Web/JavaScript/Reference/Global_Objects/decodeURIComponent
-tags:
- - JavaScript
- - JavaScript Reference
- - URI
-translation_of: Web/JavaScript/Reference/Global_Objects/decodeURIComponent
-original_slug: Web/JavaScript/Referencia/Objetos_globales/decodeURIComponent
----
-{{jsSidebar("Objects")}}
-
-Sumario
-
-Decodifica un Identificador de Recurso Uniforme (Uniform Resource Identifier, URI) previamente creado por {{jsxref("encodeURIComponent")}} o por una rutina similar.
-
-Sintaxis
-
-decodeURIComponent(encodedURI )
-
-Parámetros
-
-
- encodedURI
- Un Identificador de Recurso Uniforme codificado.
-
-
-
-Valor retornado
-
-Retorna una nueva cadena representando la version decodificada del componente URI dado
-
-Descripción
-
-Sustituye a cada secuencia de escape codificado en URI con el carácter que representa.
-
-Ver También
-
-
- {{jsxref("decodeURI")}}
- {{jsxref("encodeURI")}}
- {{jsxref("encodeURIComponent")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/decodeuricomponent/index.md b/files/es/web/javascript/reference/global_objects/decodeuricomponent/index.md
new file mode 100644
index 00000000000000..75a9e171543142
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/decodeuricomponent/index.md
@@ -0,0 +1,38 @@
+---
+title: decodeURIComponent
+slug: Web/JavaScript/Reference/Global_Objects/decodeURIComponent
+tags:
+ - JavaScript
+ - JavaScript Reference
+ - URI
+translation_of: Web/JavaScript/Reference/Global_Objects/decodeURIComponent
+original_slug: Web/JavaScript/Referencia/Objetos_globales/decodeURIComponent
+---
+{{jsSidebar("Objects")}}
+
+## Sumario
+
+Decodifica un Identificador de Recurso Uniforme (Uniform Resource Identifier, URI) previamente creado por {{jsxref("encodeURIComponent")}} o por una rutina similar.
+
+## Sintaxis
+
+`decodeURIComponent(encodedURI)`
+
+## Parámetros
+
+- `encodedURI`
+ - : Un Identificador de Recurso Uniforme codificado.
+
+## Valor retornado
+
+Retorna una nueva cadena representando la version decodificada del componente URI dado
+
+## Descripción
+
+Sustituye a cada secuencia de escape codificado en URI con el carácter que representa.
+
+## Ver También
+
+- {{jsxref("decodeURI")}}
+- {{jsxref("encodeURI")}}
+- {{jsxref("encodeURIComponent")}}
diff --git a/files/es/web/javascript/reference/global_objects/error/linenumber/index.html b/files/es/web/javascript/reference/global_objects/error/linenumber/index.html
deleted file mode 100644
index c714928533bacd..00000000000000
--- a/files/es/web/javascript/reference/global_objects/error/linenumber/index.html
+++ /dev/null
@@ -1,102 +0,0 @@
----
-title: Error.prototype.lineNumber
-slug: Web/JavaScript/Reference/Global_Objects/Error/lineNumber
-translation_of: Web/JavaScript/Reference/Global_Objects/Error/lineNumber
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Error/lineNumber
----
-No es una norma
-Esta característica no es una norma y no está en la lista de normas. No la utilice en sitios de producción que enfrenta la Web: no va a funcionar para todos los usuarios. También puede haber grandes incompatibilidades entre implementaciones y el comportamiento puede cambiar en el futuro.
-
-
-
-La propiedad lineNumber contiene el número de linea en el archivo que arrojó el error.
-
-
-
-Ejemplos
-
-Utilizando lineNumber
-
-var e = new Error('No fue posible analizar el dato introducido');
-throw e;
-console.log(e.lineNumber) // 2
-
-
-Ejemplo alternativo utilizando el evento 'error'
-
-window.addEventListener('error', function(e) {
- console.log(e.lineno); // 5
-});
-var e = new Error('No fue posible analizar el dato introducido');
-throw e;
-
-
-Esta es una norma soportada por Chrome, Firefox entre otros.
-
-Especificaciones
-
-No forma parte de ninguna especificación. No es una norma.
-
-Navegadores compatibles
-
-
-
-
-
Tabla de compatibilidad
-
-
-
-
- Caracteristica
- Chrome
- Firefox (Gecko)
- Internet Explorer
- Opera
- Safari
-
-
- Soporte básico
- Compatible [1]
- Compatible
- No compatible
- No compatible
- No compatible
-
-
-
-
-
[1] Objeto error en errores manejados.
-
-
-
-
- Caracteristica
- Android
- Chorme para Android
- Firefox Móvil (Gecko)
- IE Móvil
- Opera Móvil
- Safari Móvil
-
-
- Soporte básico
- No compatible
- No compatible
- Compatible
- No compatible
- No compatible
- No compatible
-
-
-
-
-
-
-
-Vea también:
-
-
- {{jsxref("Error.prototype.stack")}} {{non-standard_inline}}
- {{jsxref("Error.prototype.columnNumber")}} {{non-standard_inline}}
- {{jsxref("Error.prototype.fileName")}} {{non-standard_inline}}
-
diff --git a/files/es/web/javascript/reference/global_objects/error/linenumber/index.md b/files/es/web/javascript/reference/global_objects/error/linenumber/index.md
new file mode 100644
index 00000000000000..0e71e35e182c96
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/error/linenumber/index.md
@@ -0,0 +1,59 @@
+---
+title: Error.prototype.lineNumber
+slug: Web/JavaScript/Reference/Global_Objects/Error/lineNumber
+translation_of: Web/JavaScript/Reference/Global_Objects/Error/lineNumber
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Error/lineNumber
+---
+No es una norma
+
+Esta característica no es una norma y no está en la lista de normas. No la utilice en sitios de producción que enfrenta la Web: no va a funcionar para todos los usuarios. También puede haber grandes incompatibilidades entre implementaciones y el comportamiento puede cambiar en el futuro.
+
+La propiedad **lineNumber** contiene el número de linea en el archivo que arrojó el error.
+
+## Ejemplos
+
+### Utilizando `lineNumber`
+
+```js
+var e = new Error('No fue posible analizar el dato introducido');
+throw e;
+console.log(e.lineNumber) // 2
+```
+
+### Ejemplo alternativo utilizando el evento '`error'`
+
+```js
+window.addEventListener('error', function(e) {
+ console.log(e.lineno); // 5
+});
+var e = new Error('No fue posible analizar el dato introducido');
+throw e;
+```
+
+Esta es una norma soportada por Chrome, Firefox entre otros.
+
+## Especificaciones
+
+No forma parte de ninguna especificación. No es una norma.
+
+## Navegadores compatibles
+
+Tabla de compatibilidad
+
+| Caracteristica | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
+| -------------- | --------------- | --------------- | ----------------- | ------------- | ------------- |
+| Soporte básico | Compatible \[1] | Compatible | No compatible | No compatible | No compatible |
+
+\[1] Objeto error en errores manejados.
+
+| Caracteristica | Android | Chorme para Android | Firefox Móvil (Gecko) | IE Móvil | Opera Móvil | Safari Móvil |
+| -------------- | ------------- | ------------------- | --------------------- | ------------- | ------------- | ------------- |
+| Soporte básico | No compatible | No compatible | Compatible | No compatible | No compatible | No compatible |
+
+##
+
+## Vea también:
+
+- {{jsxref("Error.prototype.stack")}} {{non-standard_inline}}
+- {{jsxref("Error.prototype.columnNumber")}} {{non-standard_inline}}
+- {{jsxref("Error.prototype.fileName")}} {{non-standard_inline}}
diff --git a/files/es/web/javascript/reference/global_objects/eval/index.html b/files/es/web/javascript/reference/global_objects/eval/index.html
deleted file mode 100644
index fb811e398cea7c..00000000000000
--- a/files/es/web/javascript/reference/global_objects/eval/index.html
+++ /dev/null
@@ -1,262 +0,0 @@
----
-title: eval
-slug: Web/JavaScript/Reference/Global_Objects/eval
-tags:
- - JavaScript
- - eval
-translation_of: Web/JavaScript/Reference/Global_Objects/eval
-original_slug: Web/JavaScript/Referencia/Objetos_globales/eval
----
-{{jsSidebar("Objects")}}
-
-Resumen
-
-La función eval()
evalúa un código JavaScript representado como una cadena de caracteres (string), sin referenciar a un objeto en particular.
-
-Sintaxis
-
-eval(cadena de caracteres o string)
-
-
-Parámetros
-
-
- cadena de caracteres (string)
- Una cadena de caracteres (string) que representa una expresión, sentencia o secuencia de sentencias en JavaScript. La expresión puede incluir variables y propiedades de objetos existentes.
-
- Valores retornados o devueltos
-
-
-
-El valor que resulta de la evaluación del código proporcionado. Si este valor está vacío. {{jsxref("undefined")}} (artículo en inglés) es devuelto.
-
-Descripción
-
-eval()
es una propiedad de la función del objeto global.
-
-El argumento de la función eval
es una cadena de caracteres. Si la cadena de caracteres representa una expresión, eval()
evalúa la expresión. Si el argumento representa una o más sentencias JavaScript, eval()
evalúa las sentencias. No se debe llamar a eval()
para evaluar una expresión aritmética; ya que JavaScript evalúa las expresiones aritméticas automáticamente.
-
-Si construye una expresión aritmética como una cadena de caracteres, puede usar eval()
para evaluarla más tarde. Por ejemplo, suponga que tiene la variable x
. Puede posponer la evaluación de una expresión que involucre a x
mediante la asignación del valor de la cadena de caracteres de la expresión, asignando "3 * x + 2
" a la variable, y entonces llamar a eval()
posteriormente en el script.
-
-Si el argumento de eval()
no es una cadena de caracteres, eval()
devuelve el argumento sin cambio. En el siguiente ejemplo, el constructor String
es especificado, y eval()
devuelve un objeto String
en lugar de evaluar la cadena de caracteres.
-
-eval(new String("2 + 2")); // devuelve un objeto String que contiene "2 + 2"
-eval("2 + 2"); // devuelve 4
-
-
-Puede trabajar sobre esta limitación de una manera genérica utilizando toString()
.
-
-var expresion = new String("2 + 2");
-eval(expresion.toString());
-
-
-Si utiliza la función eval()
indirectamente , invocándola a través de una referencia distinta de eval
, a partir de ECMAScript 5, ésta funciona en el ámbito global en lugar de hacerlo en el ámbito local; esto quiere decir, por ejemplo, que las declaraciones de función crean funciones globales, y que el código siendo evaluado no tiene acceso a las variables locales dentro del ámbito en donde está siendo llamada.
-
-function test ( ) {
- var x = 2 , y = 4 ;
- console. log ( eval ( "x + y" ) ) ;
- var geval = eval;
- console. log ( geval ( "x + y" ) ) ;
-}
-
-No utilice eval
innecesariamente
-
-eval()
es una función peligrosa, quel ejecuta el código el cual es pasado con los privilegios de quien llama. Si ejecuta eval()
con una cadena de carcteres que podría ser afectada por un elemento malicioso, podría terminar ejecutando código malicioso dentro de la computadora del usuario con los permisos de su página o extensión web . Más importante aún, una parte del código de terceros podría accesar al ámbito en el cual eval()
fue invocada, lo que puede permitir la entrada a posibles ataques de formas a las que el constructor {{jsxref("Global_Objects/Function", "Function")}} (art. en inglés) el cual es similar, no es susceptible.
-
-eval()
es generalmente también más lenta que otras alternativas desde que se invoca en el intérprte de JS, mientras que otros muchos constructores son optimizados por los motores JS modernos.
-
-Existen alternativas más seguras (y rápidas) que eval()
para casos de uso común.
-
-Accediendo a propiedades de los miembros
-
-No debería utilizar eval()
con el fin de convertir nombres de propiedades en propiedades. Observe el siguiente ejemplo en el cual la función getNombreCampo(n)
devuelve el nombre del elemento del formulario especificado como una cadena. La primera sentencia asigna el valor de cadena del tercer elemento del formulario a la variable campo
. La segunda sentencia utiliza eval
para mostrar el valor del elemento del formulario.
-
-var campo = getNombreCampo(3);
-document.write("El campo llamado ", campo, " tiene un valor de ", eval(campo + ".value"));
-
-
-Sin embargo, eval()
no es necesario en este código. De hecho, su uso aquí no se recomienda. En su lugar, utilice los operadores de miembro (art. en inglés), que son mucho más rápidos y seguros:
-
-var campo = getFieldName(3);
-document.write("El campo llamado ", campo, " tiene un valor de ", campo[valor]);
-
-
-Considere ahora este nuevo ejemplo, en donde la propiedad del objeto a ser accesado no es conocida hasta que el código es ejecutado. Esto puede hacerse con eval:
-
-var obj = { a: 20 , b: 30 } ;
-var nombreProp = obtenerNombreProp( ) ;
-
-eval ( "var resultado = obj." + nombreProp ) ;
-
-Y con el uso de los accesores de propiedades (artículo en inglés), el cual es mucho más rápido y seguro, sería así:
-
-var obj = { a: 20 , b: 30 } ;
-var nombreProp = obtenerNombreProp( ) ;
-var resultado = obj[ nombreProp ] ;
-
-Puede incluso utilizar este método para acceder a las propiedades de los descendientes. Utilizando eval()
esto sería de la siguiente forma:
-
-var obj = { a: { b: { c: 0 } } } ;
-var propPath = getPropPath ( ) ;
-
-eval ( "var result = obj." + propPath ) ;
-
-Evitando eval()
, esto podría hacerse dividiendo la ruta de propiedad y haciendo un bucle a través de las diferentes propiedades:
-
-function getDescendantProp ( obj, desc) {
- var arr = desc. split ( "." ) ;
- while ( arr. length) {
- obj = obj[ arr. shift ( ) ] ;
- }
- return obj;
-}
-
-var obj = { a: { b: { c: 0 } } } ;
-var propPath = getPropPath ( ) ;
-var result = getDescendantProp ( obj, propPath) ;
-
-Estableciendo una propiedad que funcione de modo similar:
-
-function setDescendantProp ( obj, desc, value) {
- var arr = desc. split ( "." ) ;
- while ( arr. length > 1 ) {
- obj = obj[ arr. shift ( ) ] ;
- }
- obj[ arr[ 0 ] ] = value;
-}
-
-var obj = { a: { b: { c: 0 } } } ;
-var propPath = getPropPath ( ) ;
-var result = setDescendantProp ( obj, propPath, 1 ) ;
-
-Utilice funciones en lugar de evaluar fragmentos de código
-
-JavaScript tiene funciones de primera clase (artículo en inglés), lo que quiere decir que usted puede pasar funciones como argumentos a otras APIs, almacenarlas en variables y propiedades de objetos, etc. Muchas APIs de DOM están diseñadas con esto en mente, o sea que usted puede (y debería) escribir:
-
-
-setTimeout ( function ( ) { . . . } , 1000 ) ;
-
-
-elt. addEventListener ( "click" , function ( ) { . . . } , false ) ;
-
-Las clausuras o cierres (art. en inglés) son muy útiles como forma de crear funciones parametrizadas sin la concatenación de cadenas de caracteres o strings.
-
-Analizando JSON (convirtiendo cadenas de caracteres (strings) hacia objetos de JavaScript)
-
-Si la cadena de caracteres que usted esta llamando eval()
contiene datos (por ejemplo, un array: "[1, 2, 3]"
), en contraposición al código, debería considerar un cambio a JSON (art. en inglés), el cual permite a la cadena de caracteres utilizar un subconjunto de sintaxis de JavaScript para representar los datos. Vea también Descargando JSON y JavaScript en extensiones (art. en inglés).
-
-Observe, que ya que la sintaxis de JSON es limitada en comparación con la sintaxis de JavaScript, muchas literales válidas de JavaScript no serán analizadas como JSON. Por ejemplo, seguir comas no está permitido en JSON, y los nombres de propiedades (keys) en literales de objeto deben ser entrecomilladas. Asegúrese de utilizar un serializados de JSON para generar cadenas de caracteres que posteriormente sean analizadas como JSON.
-
-Pasar datos en lugar de código
-
-Por ejemplo, una extensión diseñada para arrastar contenido de páginas web podría tener reglas de arrastre definidas en XPath (art. en inglés) en lugar de código JavaScript.
-
-Ejecutar código sin privilegos limitados
-
-Si usted debe ejecutar código, considere ejecutarlo con privilegios reducidos. Este consejo aplica principalmente para las extensiones y las aplicaciones XUL, para lo cual puede utilizar Components.utils.evalInSandbox (art. en inglés).
-
-Ejemplos
-
-Los siguientes ejemplos muestran el resultado usando document.write
. En JavaScript del lado servidor, puede mostrar el mismo resultado llamando a la función write
en vez de document.write
.
-
-Utlizando eval
-
-En el siguiente código, las dos sentencias que contienen eval
devuelven 42. La primera evalúa la cadena "x + y + 1
"; la segunda evalúa la cadena "42
".
-
-var x = 2;
-var y = 39;
-var z = "42";
-eval("x + y + 1"); // returns 42
-eval(z); // returns 42
-
-
-Utilizando eval
para evaluar una cadena de caracteres (string) como sentencias de JavaScript
-
-El siguiente ejemplo utiliza eval
para evaluar una cadena de caracteres str
. Esta cadena consiste de sentencias de JavaScript que abren un diálogo Alert
y asignan a z
un valor de 42 si x
es cinco, y asigna 0 a z
en caso contrario. Cuando se ejecuta la segunda sentencia, eval
ocasionará que estas sentencias sean ejecutadas, y también evaluará el conjunto de sentencias y devolverá que el valor es asignado a z
.
-
-var x = 5 ;
-var str = "if (x == 5) {alert('z is 42'); z = 42;} else z = 0; ";
-
-document.write("<P>z es ", eval(str));
-
-
-La última espresión es evaluada
-
-eval()
devuelve el valor de la última expresión evaluada
-
-var str = "if ( a ) { 1+1; } else { 1+2; }" ;
-var a = true ;
-var b = eval ( str) ;
-
-console. log ( "b is : " + b) ;
-
-a = false ;
-b = eval ( str) ;
-
-console. log ( "b is : " + b) ;
-
-eval
como una cadena de caracteres (string) definiendo funciones requiere "(" y ")" como prefijo y sufijo
-
-var fctStr1 = "function a() {}"
-var fctStr2 = "(function a() {})"
-var fct1 = eval ( fctStr1)
-var fct2 = eval ( fctStr2)
-
-Especificaciones
-
-
-
-
- Especificaciones
- Status
- Comentario
-
-
- {{SpecName('ES1')}}
- {{Spec2('ES1')}}
- Definición inicial.
-
-
- {{SpecName('ES5.1', '#sec-15.1.2.1', 'eval')}}
- {{Spec2('ES5.1')}}
-
-
-
- {{SpecName('ES6', '#sec-eval-x', 'eval')}}
- {{Spec2('ES6')}}
-
-
-
- {{SpecName('ESDraft', '#sec-eval-x', 'eval')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad de navegadores
-
-{{Compat("javascript.builtins.eval")}}
-
-Observaciones específicas para Gecko
-
-
- Históricamente eval()
tenía un segundo argumento opcional, especificando un objeto en cuyo contexto la evaluación era ejecutada. Este argunmento no era estándar, y fue removido del SpiderMonkey en Gecko 1.9.1 (Firefox 3.5). Vea {{bug(442333)}}.
-
-
-Compatibilidad Hacia Atrás
-
-JavaScript 1.3 y anteriores
-
-Puede usar eval
indirectamente, aunque ésto está desaconsejado.
-
-JavaScript 1.1
-
-eval
también es un método de todos los objetos.
-
-Vea También
-
-
diff --git a/files/es/web/javascript/reference/global_objects/eval/index.md b/files/es/web/javascript/reference/global_objects/eval/index.md
new file mode 100644
index 00000000000000..5530bcbba877c0
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/eval/index.md
@@ -0,0 +1,257 @@
+---
+title: eval
+slug: Web/JavaScript/Reference/Global_Objects/eval
+tags:
+ - JavaScript
+ - eval
+translation_of: Web/JavaScript/Reference/Global_Objects/eval
+original_slug: Web/JavaScript/Referencia/Objetos_globales/eval
+---
+{{jsSidebar("Objects")}}
+
+## Resumen
+
+La función `eval()` evalúa un código JavaScript representado como una cadena de caracteres (string), sin referenciar a un objeto en particular.
+
+## Sintaxis
+
+```js
+eval(cadena de caracteres o string)
+```
+
+### Parámetros
+
+- `cadena de caracteres (string)`
+ - : Una cadena de caracteres (string) que representa una expresión, sentencia o secuencia de sentencias en JavaScript. La expresión puede incluir variables y propiedades de objetos existentes.
+
+### Valores retornados o devueltos
+
+El valor que resulta de la evaluación del código proporcionado. Si este valor está vacío. {{jsxref("undefined")}} (artículo en inglés) es devuelto.
+
+## Descripción
+
+`eval()` es una propiedad de la función del objeto global.
+
+El argumento de la función `eval` es una cadena de caracteres. Si la cadena de caracteres representa una expresión, `eval()` evalúa la expresión. Si el argumento representa una o más sentencias JavaScript, `eval()` evalúa las sentencias. No se debe llamar a `eval()` para evaluar una expresión aritmética; ya que JavaScript evalúa las expresiones aritméticas automáticamente.
+
+Si construye una expresión aritmética como una cadena de caracteres, puede usar `eval()` para evaluarla más tarde. Por ejemplo, suponga que tiene la variable `x`. Puede posponer la evaluación de una expresión que involucre a `x` mediante la asignación del valor de la cadena de caracteres de la expresión, asignando "`3 * x + 2`" a la variable, y entonces llamar a `eval()` posteriormente en el script.
+
+Si el argumento de `eval()` no es una cadena de caracteres, `eval()` devuelve el argumento sin cambio. En el siguiente ejemplo, el constructor `String` es especificado, y `eval()` devuelve un objeto `String` en lugar de evaluar la cadena de caracteres.
+
+```
+eval(new String("2 + 2")); // devuelve un objeto String que contiene "2 + 2"
+eval("2 + 2"); // devuelve 4
+```
+
+Puede trabajar sobre esta limitación de una manera genérica utilizando `toString()`.
+
+```
+var expresion = new String("2 + 2");
+eval(expresion.toString());
+```
+
+Si utiliza la función `eval()` _indirectamente_, invocándola a través de una referencia distinta de `eval`, a partir de ECMAScript 5, ésta funciona en el ámbito global en lugar de hacerlo en el ámbito local; esto quiere decir, por ejemplo, que las declaraciones de función crean funciones globales, y que el código siendo evaluado no tiene acceso a las variables locales dentro del ámbito en donde está siendo llamada.
+
+```js
+function test() {
+ var x = 2, y = 4;
+ console.log(eval("x + y")); // Llamada directa, utiliza el ámbito local, el resultado es 6
+ var geval = eval;
+ console.log(geval("x + y")); // Llamada indirecta, utiliza el ámbito global, através de ReferenceError por que `x` es indefinida
+}
+```
+
+## No utilice `eval` innecesariamente
+
+`eval()` es una función peligrosa, quel ejecuta el código el cual es pasado con los privilegios de quien llama. Si ejecuta `eval()` con una cadena de carcteres que podría ser afectada por un elemento malicioso, podría terminar ejecutando código malicioso dentro de la computadora del usuario con los permisos de su página o extensión web . Más importante aún, una parte del código de terceros podría accesar al ámbito en el cual `eval()` fue invocada, lo que puede permitir la entrada a posibles ataques de formas a las que el constructor {{jsxref("Global_Objects/Function", "Function")}} (art. en inglés) el cual es similar, no es susceptible.
+
+`eval()` es generalmente también más lenta que otras alternativas desde que se invoca en el intérprte de JS, mientras que otros muchos constructores son optimizados por los motores JS modernos.
+
+Existen alternativas más seguras (y rápidas) que `eval()`para casos de uso común.
+
+### Accediendo a propiedades de los miembros
+
+No debería utilizar `eval()` con el fin de convertir nombres de propiedades en propiedades. Observe el siguiente ejemplo en el cual la función `getNombreCampo(n)` devuelve el nombre del elemento del formulario especificado como una cadena. La primera sentencia asigna el valor de cadena del tercer elemento del formulario a la variable `campo`. La segunda sentencia utiliza `eval` para mostrar el valor del elemento del formulario.
+
+```
+var campo = getNombreCampo(3);
+document.write("El campo llamado ", campo, " tiene un valor de ", eval(campo + ".value"));
+```
+
+Sin embargo, `eval()` no es necesario en este código. De hecho, su uso aquí no se recomienda. En su lugar, utilice los [operadores de miembro](/es/Web/JavaScript/Referencia/Operadores/Miembros) (art. en inglés), que son mucho más rápidos y seguros:
+
+```js
+var campo = getFieldName(3);
+document.write("El campo llamado ", campo, " tiene un valor de ", campo[valor]);
+```
+
+Considere ahora este nuevo ejemplo, en donde la propiedad del objeto a ser accesado no es conocida hasta que el código es ejecutado. Esto puede hacerse con eval:
+
+```js
+var obj = { a: 20, b: 30 };
+var nombreProp = obtenerNombreProp(); // devuelve "a" o "b"
+
+eval( "var resultado = obj." + nombreProp );
+```
+
+Y con el uso de los [accesores de propiedades](/es/docs/Web/JavaScript/Reference/Operators/Property_Accessors) (artículo en inglés), el cual es mucho más rápido y seguro, sería así:
+
+```js
+var obj = { a: 20, b: 30 };
+var nombreProp = obtenerNombreProp(); // devuelve "a" o "b"
+var resultado = obj[ nombreProp ]; // obj[ "a" ] es el mismo que obj.a
+```
+
+Puede incluso utilizar este método para acceder a las propiedades de los descendientes. Utilizando `eval()` esto sería de la siguiente forma:
+
+```js
+var obj = {a: {b: {c: 0}}};
+var propPath = getPropPath(); // returns e.g. "a.b.c"
+
+eval( "var result = obj." + propPath );
+```
+
+Evitando `eval()`, esto podría hacerse dividiendo la ruta de propiedad y haciendo un bucle a través de las diferentes propiedades:
+
+```js
+function getDescendantProp(obj, desc) {
+ var arr = desc.split(".");
+ while(arr.length) {
+ obj = obj[arr.shift()];
+ }
+ return obj;
+}
+
+var obj = {a: {b: {c: 0}}};
+var propPath = getPropPath(); // returns e.g. "a.b.c"
+var result = getDescendantProp(obj, propPath);
+```
+
+Estableciendo una propiedad que funcione de modo similar:
+
+```js
+function setDescendantProp(obj, desc, value) {
+ var arr = desc.split(".");
+ while(arr.length > 1) {
+ obj = obj[arr.shift()];
+ }
+ obj[arr[0]] = value;
+}
+
+var obj = {a: {b: {c: 0}}};
+var propPath = getPropPath(); // returns e.g. "a.b.c"
+var result = setDescendantProp(obj, propPath, 1); // test.a.b.c will now be 1
+```
+
+### Utilice funciones en lugar de evaluar fragmentos de código
+
+JavaScript tiene [funciones de primera clase](http://en.wikipedia.org/wiki/First-class_function)(artículo en inglés), lo que quiere decir que usted puede pasar funciones como argumentos a otras APIs, almacenarlas en variables y propiedades de objetos, etc. Muchas APIs de DOM están diseñadas con esto en mente, o sea que usted puede (y debería) escribir:
+
+```js
+// instead of setTimeout(" ... ", 1000) use:
+setTimeout(function() { ... }, 1000);
+
+// instead of elt.setAttribute("onclick", "...") use:
+elt.addEventListener("click", function() { ... } , false);
+```
+
+Las [clausuras o cierres](/es/docs/Web/JavaScript/Closures)(art. en inglés) son muy útiles como forma de crear funciones parametrizadas sin la concatenación de cadenas de caracteres o strings.
+
+### Analizando JSON (convirtiendo cadenas de caracteres (strings) hacia objetos de JavaScript)
+
+Si la cadena de caracteres que usted esta llamando `eval()` contiene datos (por ejemplo, un array: `"[1, 2, 3]"`), en contraposición al código, debería considerar un cambio a [JSON](/es/docs/Glossary/JSON) (art. en inglés), el cual permite a la cadena de caracteres utilizar un subconjunto de sintaxis de JavaScript para representar los datos. Vea también [Descargando JSON y JavaScript en extensiones](/es/docs/Downloading_JSON_and_JavaScript_in_extensions) (art. en inglés).
+
+Observe, que ya que la sintaxis de JSON es limitada en comparación con la sintaxis de JavaScript, muchas literales válidas de JavaScript no serán analizadas como JSON. Por ejemplo, seguir comas no está permitido en JSON, y los nombres de propiedades (keys) en literales de objeto deben ser entrecomilladas. Asegúrese de utilizar un serializados de JSON para generar cadenas de caracteres que posteriormente sean analizadas como JSON.
+
+### Pasar datos en lugar de código
+
+Por ejemplo, una extensión diseñada para arrastar contenido de páginas web podría tener reglas de arrastre definidas en [XPath](/es/docs/XPath) (art. en inglés) en lugar de código JavaScript.
+
+### Ejecutar código sin privilegos limitados
+
+Si usted debe ejecutar código, considere ejecutarlo con privilegios reducidos. Este consejo aplica principalmente para las extensiones y las aplicaciones XUL, para lo cual puede utilizar [Components.utils.evalInSandbox](/es/docs/Components.utils.evalInSandbox) (art. en inglés).
+
+## Ejemplos
+
+Los siguientes ejemplos muestran el resultado usando `document.write`. En JavaScript del lado servidor, puede mostrar el mismo resultado llamando a la función `write` en vez de `document.write`.
+
+### Utlizando `eval`
+
+En el siguiente código, las dos sentencias que contienen `eval` devuelven 42. La primera evalúa la cadena "`x + y + 1`"; la segunda evalúa la cadena "`42`".
+
+```
+var x = 2;
+var y = 39;
+var z = "42";
+eval("x + y + 1"); // returns 42
+eval(z); // returns 42
+```
+
+### Utilizando `eval` para evaluar una cadena de caracteres (string) como sentencias de JavaScript
+
+El siguiente ejemplo utiliza `eval` para evaluar una cadena de caracteres `str`. Esta cadena consiste de sentencias de JavaScript que abren un diálogo `Alert` y asignan a `z` un valor de 42 si `x` es cinco, y asigna 0 a `z` en caso contrario. Cuando se ejecuta la segunda sentencia, `eval` ocasionará que estas sentencias sean ejecutadas, y también evaluará el conjunto de sentencias y devolverá que el valor es asignado a `z`.
+
+```js
+var x = 5;
+var str = "if (x == 5) {alert('z is 42'); z = 42;} else z = 0; ";
+
+document.write("z es ", eval(str));
+```
+
+### La última espresión es evaluada
+
+`eval()` devuelve el valor de la última expresión evaluada
+
+```js
+var str = "if ( a ) { 1+1; } else { 1+2; }";
+var a = true;
+var b = eval(str); // devuelve 2
+
+console.log("b is : " + b);
+
+a = false;
+b = eval(str); // devuelve 3
+
+console.log("b is : " + b);
+```
+
+### `eval` como una cadena de caracteres (string) definiendo funciones requiere "(" y ")" como prefijo y sufijo
+
+```js
+var fctStr1 = "function a() {}"
+var fctStr2 = "(function a() {})"
+var fct1 = eval(fctStr1) // devuelve undefined
+var fct2 = eval(fctStr2) // deuelve una función
+```
+
+## Especificaciones
+
+| Especificaciones | Status | Comentario |
+| ------------------------------------------------------------ | ---------------------------- | ------------------- |
+| {{SpecName('ES1')}} | {{Spec2('ES1')}} | Definición inicial. |
+| {{SpecName('ES5.1', '#sec-15.1.2.1', 'eval')}} | {{Spec2('ES5.1')}} | |
+| {{SpecName('ES6', '#sec-eval-x', 'eval')}} | {{Spec2('ES6')}} | |
+| {{SpecName('ESDraft', '#sec-eval-x', 'eval')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad de navegadores
+
+{{Compat("javascript.builtins.eval")}}
+
+## Observaciones específicas para Gecko
+
+- Históricamente `eval()` tenía un segundo argumento opcional, especificando un objeto en cuyo contexto la evaluación era ejecutada. Este argunmento no era estándar, y fue removido del _SpiderMonkey en_ Gecko 1.9.1 (Firefox 3.5). Vea {{bug(442333)}}.
+
+## Compatibilidad Hacia Atrás
+
+### JavaScript 1.3 y anteriores
+
+Puede usar `eval` indirectamente, aunque ésto está desaconsejado.
+
+### JavaScript 1.1
+
+`eval` también es un método de todos los objetos.
+
+## Vea También
+
+- {{jsxref("Objetos_globales/uneval", "uneval()")}}
+- [Miembros de operadores](/es/docs/Web/JavaScript/Referencia/Operadores/Miembros)
diff --git a/files/es/web/javascript/reference/global_objects/function/apply/index.html b/files/es/web/javascript/reference/global_objects/function/apply/index.html
deleted file mode 100644
index 0d1fba573f4ae7..00000000000000
--- a/files/es/web/javascript/reference/global_objects/function/apply/index.html
+++ /dev/null
@@ -1,178 +0,0 @@
----
-title: Function.prototype.apply()
-slug: Web/JavaScript/Reference/Global_Objects/Function/apply
-tags:
- - Function
- - JavaScript
- - Method
- - función
- - metodo
-translation_of: Web/JavaScript/Reference/Global_Objects/Function/apply
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Function/apply
----
-
{{JSRef("Objetos_globales", "Function")}}
-
-Resumen
-
-El método apply() invoca una determinada función asignando explícitamente el objeto this y un array o similar (array like object ) como parámetros (argumentos) para dicha función.
-
-NOTA: Aunque la sintaxis de esta función es casi idéntica a {{jsxref("Function.call", "call()")}}, la diferencia fundamental es que call()
acepta una lista de argumentos, mientras que apply()
acepta un simple array con los argumentos.
-
-Sintaxis
-
-fun .apply(thisArg [, argsArray ])
-
-Parámetros
-
-
- thisArg
- El valor del objeto this a utilizar dentro de la llamada a fun . Cabe mencionar que éste puede no ser el valor visto por el método: si el método es una función del tipo {{jsxref("Functions_and_function_scope/Strict_mode", "non-strict mode", "", 1)}}, {{jsxref("Global_Objects/null", "null")}} o {{jsxref("Global_Objects/undefined", "undefined")}} será reemplazado por el objeto global, y los valores primitivos serán encapsulados.
- argsArray
- Un objeto similar a un array (array like object ), que contiene los parámetros con los que será llamada fun
, o null
o {{jsxref("undefined")}} si ningún argumento es estipulado. Desde la versión 5 de ECMAScript estos parámetros pueden estar en un objeto similar a un array en lugar de un array. Véase browser compatibility para mayor información.
-
- Valor de retorno
-
- El resultado de llamar a la función con el valor dado this
y argumentos.
-
-
-
-Descripción
-
-Puede estipularse un objeto this
diferente al llamar una función. this
se refiere al objeto actual, el objeto haciendo la llamada. Con apply
, puede escribirse un método una vez y heredarlo a otro objeto, sin necesidad de reescribir el método para adecuarlo al nuevo objeto.
-
-apply
es muy similar a {{jsxref("Function.call", "call()")}}, excepto por el tipo de argumentos que soporta. Puede utilizarse un arreglo de parámetros en lugar de un conjunto de pares nombre-valor. Con apply
, puede utilizarse un arreglo literal, por ejemplo, fun .apply(this, ['eat', 'bananas'])
, o un objeto Array
, por ejemplo, fun .apply(this, new Array('eat', 'bananas'))
.
-
-Puede también utilizarse {{jsxref("Functions/arguments", "arguments")}} como parámetro argsArray
. arguments
es una variable local a la función. Puede utilizarse para acceder a todos los argumentos no específicados en la llamada al objeto. Por lo tanto, no se requiere conocer todos los argumentos del objeto invocado cuando se utiliza el método apply
. Puede utilizarse arguments
para pasar los argumentos al objeto invocado. El objeto invocado es entonces responsable por el manejo de los argumentos.
-
-Desde la 5ta edición de ECMAScript se puede utilizar también cualquier tipo de objeto similar a un arreglo, que en términos prácticos significa que tendrá una propiedad length
y propiedades integer en el rango (0...length)
. Por ejemplo, ahora puede utilizarse un {{domxref("NodeList")}} o un objeto personalizado como: {'length': 2, '0': 'eat', '1': 'bananas'}
.
-
-{{ note("La mayoría de los navegadores, incluidos Chrome 14 e Internet Explorer 9, aún no soportan el uso de objetos similares a un array y arrojarán una excepción.") }}
-
-
-
-Ejemplos
-
-Utilizando apply
para encadenar constructores
-
-Puedes utilizar apply
para encadenar {{jsxref("Operators/new", "constructors")}} para un objeto, similar a Java. En el ejemplo siguiente se crea un método global a {{jsxref("Function")}} llamado construct
, en cual posibilita el uso de un objeto similar a un arreglo en un constructor en lugar de una lista de argumentos.
-
-Function.prototype.construct = function (aArgs) {
- var fConstructor = this, fNewConstr = function () { fConstructor.apply(this, aArgs); };
- fNewConstr.prototype = fConstructor.prototype;
- return new fNewConstr();
-};
-
-Ejemplo de uso:
-
-function MyConstructor () {
- for (var nProp = 0; nProp < arguments.length; nProp++) {
- this["property" + nProp] = arguments[nProp];
- }
-}
-
-var myArray = [4, "Hello world!", false];
-var myInstance = MyConstructor.construct(myArray);
-
-alert(myInstance.property1); // alerts "Hello world!"
-alert(myInstance instanceof MyConstructor); // alerts "true"
-alert(myInstance.constructor); // alerts "MyConstructor"
-
-Nota: El método Function.construct
no nativo no funcionará con algunos constructores nativos (como {{jsxref("Date")}}, por ejemplo). En estos casos se deberá utilizar el método {{jsxref("Function.bind")}} (por ejemplo, supóngase un arreglo como el siguiente para utilizar con el constructor Date
: [2012, 11, 4]
; en este caso se tendría que escribir algo como: new (Function.prototype.bind.apply(Date, [null].concat([2012, 11, 4])))()
– de cualquier manera, ésta no es la mejor manera de hacerlo y probablemente no debería utilizarse en ningún entorno en producción).
-
-apply
y funciones built-in
-
-El uso inteligente de apply
permite utilizar funciones built-in para algunas tareas que, de otra manera, habrían sido escritas recorriendo los valores del arreglo dentro de un bucle. Como ejemplo, vamos a utilizar Math.max
/Math.min
para encontrar el máximo/mínimo valor en un arreglo.
-
-/* min/max number in an array */
-var numbers = [5, 6, 2, 3, 7];
-
-/* using Math.min/Math.max apply */
-var max = Math.max.apply(null, numbers); /* This about equal to Math.max(numbers[0], ...) or Math.max(5, 6, ..) */
-var min = Math.min.apply(null, numbers);
-
-/* vs. simple loop based algorithm */
-max = -Infinity, min = +Infinity;
-
-for (var i = 0; i < numbers.length; i++) {
- if (numbers[i] > max)
- max = numbers[i];
- if (numbers[i] < min)
- min = numbers[i];
-}
-
-Pero cuidado: utilizando apply
de esta manera estás corriendo el riesgo de exceder el límite de argumentos permitido por el motor de JavaScript. Las consecuencias de aplicar una función con demasiados argumentos (imagínate más de decenas de miles de argumentos) varían entre los distintos motores (JavaScriptCore tiene un límite de argumentos fijo de 65536 ), porque el límite (de hecho, incluso el comportamiento de cualquier pila excesivamente larga) no está especificado. Algunos motores lanzarán una excepción. Más perniciosamente, otros limitarán de manera arbitraria el número de argumentos que se están pasando en realidad a la función. (Para ilustrar este último caso: si un motor tuviera un límite de cuatro argumentos [por supuesto, los límites reales son significamente mayores], sería como si los argumentos 5, 6, 2 y 3 hubieran sido pasados a apply
en los ejemplos anteriores, en lugar del arreglo completo). Si el valor de tu arreglo pudiera crecer en decenas de miles, utiliza una estrategia híbrida: aplica a tu función trozos del array a la vez:
-
-function minOfArray(arr) {
- var min = Infinity;
- var QUANTUM = 32768;
-
- for (var i = 0, len = arr.length; i < len; i += QUANTUM) {
- var submin = Math.min.apply(null, arr.slice(i, Math.min(i + QUANTUM, len)));
- min = Math.min(submin, min);
- }
-
- return min;
-}
-
-var min = minOfArray([5, 6, 2, 3, 7]);
-
-Utilizando apply en "monkey-patching"
-
-(Reemplazando de manera dinámica los argumentos en tiempo de ejecución)
-
-apply
puede ser la mejor manera de reemplazar dinámicamente una función 'built-in' de Firefox, o de una librería de JavaScript. Dada una función someobject.foo
, puedes modificar la función de una forma 'hacker', como ésta:
-
-var originalfoo = someobject.foo;
-someobject.foo = function() {
- // Haz algo antes de llamar a la función
- console.log(arguments);
- // Llama a la función como la hubieras llamado normalmente
- originalfoo.apply(this, arguments);
- // Aquí, ejecuta algo después
-}
-
-Este método es especialmente útil cuando quieres depurar eventos, o interfaces con algún elemento que no tiene API, al igual que los diversos .on
(eventos [event]...,
como los que se usan en el Devtools Inspector )
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES3')}}
- {{Spec2('ES3')}}
- Definición Inicial. Implementada in JavaScript 1.3.
-
-
- {{SpecName('ES5.1', '#sec-15.3.4.3', 'Function.prototype.apply')}}
- {{Spec2('ES5.1')}}
-
-
-
- {{SpecName('ES6', '#sec-function.prototype.apply', 'Function.prototype.apply')}}
- {{Spec2('ES6')}}
-
-
-
- {{SpecName('ESDraft', '#sec-function.prototype.apply', 'Function.prototype.apply')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad entre navegadores
-
-{{Compat("javascript.builtins.Function.apply")}}
-
-Véase también
-
-
- {{jsxref("Functions/arguments", "arguments")}} objetos
- {{jsxref("Function.prototype.bind()")}}
- {{jsxref("Function.prototype.call()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/function/apply/index.md b/files/es/web/javascript/reference/global_objects/function/apply/index.md
new file mode 100644
index 00000000000000..f260ac312c967c
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/function/apply/index.md
@@ -0,0 +1,160 @@
+---
+title: Function.prototype.apply()
+slug: Web/JavaScript/Reference/Global_Objects/Function/apply
+tags:
+ - Function
+ - JavaScript
+ - Method
+ - función
+ - metodo
+translation_of: Web/JavaScript/Reference/Global_Objects/Function/apply
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Function/apply
+---
+{{JSRef("Objetos_globales", "Function")}}
+
+## Resumen
+
+El método **apply()** invoca una determinada función asignando explícitamente el objeto **this** y un array o similar ([array like object](/es/docs/JavaScript/Guide/Predefined_Core_Objects#Working_with_Array-like_objects)) como parámetros (**argumentos)** para dicha función.
+
+> **Nota:** Aunque la sintaxis de esta función es casi idéntica a {{jsxref("Function.call", "call()")}}, la diferencia fundamental es que `call()` acepta una lista de argumentos, mientras que `apply()` acepta un simple array con los argumentos.
+
+## Sintaxis
+
+```
+fun.apply(thisArg[, argsArray])
+```
+
+### Parámetros
+
+- `thisArg`
+ - : El valor del objeto **this** a utilizar dentro de la llamada a _fun_. Cabe mencionar que éste puede no ser el valor visto por el método: si el método es una función del tipo {{jsxref("Functions_and_function_scope/Strict_mode", "non-strict mode", "", 1)}}, {{jsxref("Global_Objects/null", "null")}} o {{jsxref("Global_Objects/undefined", "undefined")}} será reemplazado por el objeto global, y los valores primitivos serán encapsulados.
+- `argsArray`
+ - : Un objeto similar a un array ([array like object](/es/docs/JavaScript/Guide/Predefined_Core_Objects#Working_with_Array-like_objects)), que contiene los parámetros con los que será llamada _`fun`_, o `null` o {{jsxref("undefined")}} si ningún argumento es estipulado. Desde la versión 5 de ECMAScript estos parámetros pueden estar en un objeto similar a un array en lugar de un array. Véase [browser compatibility](#browser_compatibility) para mayor información.
+
+### Valor de retorno
+
+El resultado de llamar a la función con el valor dado **`this`** y argumentos.
+
+## Descripción
+
+Puede estipularse un objeto `this` diferente al llamar una función. `this` se refiere al objeto actual, el objeto haciendo la llamada. Con `apply`, puede escribirse un método una vez y heredarlo a otro objeto, sin necesidad de reescribir el método para adecuarlo al nuevo objeto.
+
+`apply` es muy similar a {{jsxref("Function.call", "call()")}}, excepto por el tipo de argumentos que soporta. Puede utilizarse un arreglo de parámetros en lugar de un conjunto de pares nombre-valor. Con `apply`, puede utilizarse un arreglo literal, por ejemplo, `fun.apply(this, ['eat', 'bananas'])`, o un objeto `Array`, por ejemplo, `fun.apply(this, new Array('eat', 'bananas'))`.
+
+Puede también utilizarse {{jsxref("Functions/arguments", "arguments")}} como parámetro `argsArray`. `arguments` es una variable local a la función. Puede utilizarse para acceder a todos los argumentos no específicados en la llamada al objeto. Por lo tanto, no se requiere conocer todos los argumentos del objeto invocado cuando se utiliza el método `apply`. Puede utilizarse `arguments` para pasar los argumentos al objeto invocado. El objeto invocado es entonces responsable por el manejo de los argumentos.
+
+Desde la 5ta edición de ECMAScript se puede utilizar también cualquier tipo de objeto similar a un arreglo, que en términos prácticos significa que tendrá una propiedad `length` y propiedades integer en el rango (`0...length)`. Por ejemplo, ahora puede utilizarse un {{domxref("NodeList")}} o un objeto personalizado como: `{'length': 2, '0': 'eat', '1': 'bananas'}`.
+
+{{ note("La mayoría de los navegadores, incluidos Chrome 14 e Internet Explorer 9, aún no soportan el uso de objetos similares a un array y arrojarán una excepción.") }}
+
+## Ejemplos
+
+### Utilizando **`apply`** para encadenar constructores
+
+Puedes utilizar `apply` para encadenar {{jsxref("Operators/new", "constructors")}} para un objeto, similar a Java. En el ejemplo siguiente se crea un método global a {{jsxref("Function")}} llamado `construct`, en cual posibilita el uso de un objeto similar a un arreglo en un constructor en lugar de una lista de argumentos.
+
+```js
+Function.prototype.construct = function (aArgs) {
+ var fConstructor = this, fNewConstr = function () { fConstructor.apply(this, aArgs); };
+ fNewConstr.prototype = fConstructor.prototype;
+ return new fNewConstr();
+};
+```
+
+Ejemplo de uso:
+
+```js
+function MyConstructor () {
+ for (var nProp = 0; nProp < arguments.length; nProp++) {
+ this["property" + nProp] = arguments[nProp];
+ }
+}
+
+var myArray = [4, "Hello world!", false];
+var myInstance = MyConstructor.construct(myArray);
+
+alert(myInstance.property1); // alerts "Hello world!"
+alert(myInstance instanceof MyConstructor); // alerts "true"
+alert(myInstance.constructor); // alerts "MyConstructor"
+```
+
+> **Nota:** El método `Function.construct` no nativo no funcionará con algunos constructores nativos (como {{jsxref("Date")}}, por ejemplo). En estos casos se deberá utilizar el método {{jsxref("Function.bind")}} (por ejemplo, supóngase un arreglo como el siguiente para utilizar con el constructor `Date`: `[2012, 11, 4]`; en este caso se tendría que escribir algo como: `new (Function.prototype.bind.apply(Date, [null].concat([2012, 11, 4])))()` – de cualquier manera, ésta no es la mejor manera de hacerlo y probablemente no debería utilizarse en ningún entorno en producción).
+
+### **`apply`** y funciones **built-in**
+
+El uso inteligente de **`apply`** permite utilizar funciones built-in para algunas tareas que, de otra manera, habrían sido escritas recorriendo los valores del arreglo dentro de un bucle. Como ejemplo, vamos a utilizar `Math.max`/`Math.min`para encontrar el máximo/mínimo valor en un arreglo.
+
+```js
+/* min/max number in an array */
+var numbers = [5, 6, 2, 3, 7];
+
+/* using Math.min/Math.max apply */
+var max = Math.max.apply(null, numbers); /* This about equal to Math.max(numbers[0], ...) or Math.max(5, 6, ..) */
+var min = Math.min.apply(null, numbers);
+
+/* vs. simple loop based algorithm */
+max = -Infinity, min = +Infinity;
+
+for (var i = 0; i < numbers.length; i++) {
+ if (numbers[i] > max)
+ max = numbers[i];
+ if (numbers[i] < min)
+ min = numbers[i];
+}
+```
+
+Pero cuidado: utilizando `apply` de esta manera estás corriendo el riesgo de exceder el límite de argumentos permitido por el motor de JavaScript. Las consecuencias de aplicar una función con demasiados argumentos (imagínate más de decenas de miles de argumentos) varían entre los distintos motores (JavaScriptCore tiene un [límite de argumentos fijo de 65536](https://bugs.webkit.org/show_bug.cgi?id=80797)), porque el límite (de hecho, incluso el comportamiento de cualquier pila excesivamente larga) no está especificado. Algunos motores lanzarán una excepción. Más perniciosamente, otros limitarán de manera arbitraria el número de argumentos que se están pasando en realidad a la función. (Para ilustrar este último caso: si un motor tuviera un límite de cuatro argumentos \[por supuesto, los límites reales son significamente mayores], sería como si los argumentos 5, 6, 2 y 3 hubieran sido pasados a `apply` en los ejemplos anteriores, en lugar del arreglo completo). Si el valor de tu arreglo pudiera crecer en decenas de miles, utiliza una estrategia híbrida: aplica a tu función trozos del array a la vez:
+
+```js
+function minOfArray(arr) {
+ var min = Infinity;
+ var QUANTUM = 32768;
+
+ for (var i = 0, len = arr.length; i < len; i += QUANTUM) {
+ var submin = Math.min.apply(null, arr.slice(i, Math.min(i + QUANTUM, len)));
+ min = Math.min(submin, min);
+ }
+
+ return min;
+}
+
+var min = minOfArray([5, 6, 2, 3, 7]);
+```
+
+### Utilizando apply en "monkey-patching"
+
+(Reemplazando de manera dinámica los argumentos en tiempo de ejecución)
+
+`apply`puede ser la mejor manera de reemplazar dinámicamente una función 'built-in' de Firefox, o de una librería de JavaScript. Dada una función `someobject.foo`, puedes modificar la función de una forma 'hacker', como ésta:
+
+```js
+var originalfoo = someobject.foo;
+someobject.foo = function() {
+ // Haz algo antes de llamar a la función
+ console.log(arguments);
+ // Llama a la función como la hubieras llamado normalmente
+ originalfoo.apply(this, arguments);
+ // Aquí, ejecuta algo después
+}
+```
+
+Este método es especialmente útil cuando quieres depurar eventos, o interfaces con algún elemento que no tiene API, al igual que los diversos `.on` (eventos` [event]..., `como los que se usan en el [Devtools Inspector](/es/docs/Tools/Page_Inspector#Developer_API))
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| ---------------------------------------------------------------------------------------------------------------- | ---------------------------- | --------------------------------------------------- |
+| {{SpecName('ES3')}} | {{Spec2('ES3')}} | Definición Inicial. Implementada in JavaScript 1.3. |
+| {{SpecName('ES5.1', '#sec-15.3.4.3', 'Function.prototype.apply')}} | {{Spec2('ES5.1')}} | |
+| {{SpecName('ES6', '#sec-function.prototype.apply', 'Function.prototype.apply')}} | {{Spec2('ES6')}} | |
+| {{SpecName('ESDraft', '#sec-function.prototype.apply', 'Function.prototype.apply')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad entre navegadores
+
+{{Compat("javascript.builtins.Function.apply")}}
+
+## Véase también
+
+- {{jsxref("Functions/arguments", "arguments")}} objetos
+- {{jsxref("Function.prototype.bind()")}}
+- {{jsxref("Function.prototype.call()")}}
diff --git a/files/es/web/javascript/reference/global_objects/function/call/index.html b/files/es/web/javascript/reference/global_objects/function/call/index.html
deleted file mode 100644
index cf7b494cdd3db1..00000000000000
--- a/files/es/web/javascript/reference/global_objects/function/call/index.html
+++ /dev/null
@@ -1,114 +0,0 @@
----
-title: Function.prototype.call()
-slug: Web/JavaScript/Reference/Global_Objects/Function/call
-tags:
- - Function
- - JavaScript
- - Method
-translation_of: Web/JavaScript/Reference/Global_Objects/Function/call
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Function/call
----
-{{JSRef("Objetos_globales", "Function")}}
-
-Resumen
-
-El método call()
llama a una función con un valor dado this
y con argumentos provistos individualmente.
-
-Sintaxis
-
-function .call(thisArg [, arg1 [, arg2 [, ...]]])
-
-Parametros
-
-
- thisArg
{{optional_inline}}
- El valor a usar como this
cuando se llama a function
.
-
-
-
Cuidado: En ciertos casos, thisArg
puede no ser el valor actual visto por el método.
-
-
Si el método es una función en {{jsxref("Strict_mode", "non-strict mode", "", 1)}}, {{jsxref("Global_Objects/null", "null")}} y {{jsxref("Global_Objects/undefined", "undefined")}} serán reemplazados con el objeto global, y valores primitivos serán convertidos a objetos.
-
-
- arg1, arg2, ...
- Argumentos para el objeto.
-
- Valor de retorno
-
- El resultado de llamar a la función con el this
especificado y los argumentos.
-
-
-Descripción
-
-call()
permite que una función/método que pertenece a un objeto, ser asignada y llamada para un objeto diferente.
-
-call()
provee un nuevo valor de this
a la función/método. Con call()
, puedes escribir un método ona vez y heredarlo a otro objeto, sin tener que reescribir el método en el nuevo objeto.
-
-Nota: Mientras la sintaxis de esta función es casi identica a la función {{jsxref("Function.apply", "apply()")}}, la diferencia fundamental es que call()
acepta una lista de argumentos , mientras apply()
accepta un arreglo sencillo de argumentos .
-
-Ejemplos
-
-Usando call
para encadenar constructores para un objeto
-
-Puede usar call
para encadenar constructores para un objeto (similar a Java).
-
-En el siguiente ejemplo, el constructor para el objeto Producto
es definido con dos parametros, nombre
y precio
.
-
-Otras dos funciones Comida
y Juguete
invocan a Producto
, pasándo this
, nombre
y precio
. Producto
inicializa las propiedades nombre
y precio
, ambas funciones especializadas definen la categoria
.
-
-function Producto(nombre, precio) {
- this.nombre = nombre;
- this.precio = precio;
-
- if (precio < 0)
- throw RangeError('No se puede crear el producto "' + nombre + '" con un precio negativo');
- return this;
-}
-
-function Comida(nombre, precio) {
- Producto.call(this, nombre, precio);
- this.categoria = 'comida';
-}
-Comida.prototype = new Producto();
-
-function Juguete(nombre, precio) {
- Producto.call(this, nombre, precio);
- this.categoria = 'juguete';
-}
-Juguete.prototype = new Producto();
-
-var queso = new Comida('feta', 5);
-var diversion = new Juguete('robot', 40);
-
-
-Usando call
para invocar una función anónima
-
-En este ejemplo, creamos una función anónima y usamos call
para invocarla en cada objeto en un arreglo.
-
-El propósito principal de la función anónima aquí es agregar una función print
a cada objeto, el cual puede imprimir el índice correcto en el arreglo.
-
-
-
Pasar el objeto como valor this
no es estrictamente necesario, pero se hace con propósito explicativo.
-
-
-var animales = [
- {especie: 'Leon', nombre: 'Rey'},
- {especie: 'Whale', nombre: 'Fail'}
-];
-
-for (var i = 0; i < animales.length; i++) {
- (function (i) {
- this.imprimir = function () {
- console.log('#' + i + ' ' + this.especie + ': ' + this.nombre);
- }
- this.imprimir();
- }).call(animales[i], i);
-}
-
-
-See also
-
-
- {{jsxref("Function.prototype.bind()")}}
- {{jsxref("Function.prototype.apply()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/function/call/index.md b/files/es/web/javascript/reference/global_objects/function/call/index.md
new file mode 100644
index 00000000000000..a6a52c5940ee99
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/function/call/index.md
@@ -0,0 +1,111 @@
+---
+title: Function.prototype.call()
+slug: Web/JavaScript/Reference/Global_Objects/Function/call
+tags:
+ - Function
+ - JavaScript
+ - Method
+translation_of: Web/JavaScript/Reference/Global_Objects/Function/call
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Function/call
+---
+{{JSRef("Objetos_globales", "Function")}}
+
+## Resumen
+
+El método **`call()`** llama a una función con un valor dado `this` y con argumentos provistos individualmente.
+
+## Sintaxis
+
+```
+function.call(thisArg[, arg1[, arg2[, ...]]])
+```
+
+### Parametros
+
+- `thisArg` {{optional_inline}}
+
+ - : El valor a usar como `this` cuando se llama a _`function`_.
+
+ > **Nota:** **Advertencia:** En ciertos casos, `thisArg` puede no ser el valor actual visto por el método.
+ >
+ > Si el método es una función en {{jsxref("Strict_mode", "non-strict mode", "", 1)}}, {{jsxref("Global_Objects/null", "null")}} y {{jsxref("Global_Objects/undefined", "undefined")}} serán reemplazados con el objeto global, y valores primitivos serán convertidos a objetos.
+
+- `arg1, arg2, ...`
+ - : Argumentos para el objeto.
+
+- ### Valor de retorno
+
+ - : El resultado de llamar a la función con el `this` especificado y los argumentos.
+
+## Descripción
+
+`call()` permite que una función/método que pertenece a un objeto, ser asignada y llamada para un objeto diferente.
+
+`call()` provee un nuevo valor de `this` a la función/método. Con `call()`, puedes escribir un método ona vez y heredarlo a otro objeto, sin tener que reescribir el método en el nuevo objeto.
+
+> **Nota:** Mientras la sintaxis de esta función es casi identica a la función {{jsxref("Function.apply", "apply()")}}, la diferencia fundamental es que `call()` acepta una **lista de argumentos**, mientras `apply()` accepta un **arreglo sencillo de argumentos**.
+
+## Ejemplos
+
+### Usando `call` para encadenar constructores para un objeto
+
+Puede usar `call` para encadenar constructores para un objeto (similar a Java).
+
+En el siguiente ejemplo, el constructor para el objeto `Producto` es definido con dos parametros, `nombre` y `precio`.
+
+Otras dos funciones `Comida` y `Juguete` invocan a `Producto`, pasándo `this`, `nombre` y `precio`. `Producto` inicializa las propiedades `nombre` y `precio`, ambas funciones especializadas definen la `categoria`.
+
+```js
+function Producto(nombre, precio) {
+ this.nombre = nombre;
+ this.precio = precio;
+
+ if (precio < 0)
+ throw RangeError('No se puede crear el producto "' + nombre + '" con un precio negativo');
+ return this;
+}
+
+function Comida(nombre, precio) {
+ Producto.call(this, nombre, precio);
+ this.categoria = 'comida';
+}
+Comida.prototype = new Producto();
+
+function Juguete(nombre, precio) {
+ Producto.call(this, nombre, precio);
+ this.categoria = 'juguete';
+}
+Juguete.prototype = new Producto();
+
+var queso = new Comida('feta', 5);
+var diversion = new Juguete('robot', 40);
+```
+
+### Usando `call` para invocar una función anónima
+
+En este ejemplo, creamos una función anónima y usamos `call` para invocarla en cada objeto en un arreglo.
+
+El propósito principal de la función anónima aquí es agregar una función `print` a cada objeto, el cual puede imprimir el índice correcto en el arreglo.
+
+> **Nota:** Pasar el objeto como valor `this` no es estrictamente necesario, pero se hace con propósito explicativo.
+
+```js
+var animales = [
+ {especie: 'Leon', nombre: 'Rey'},
+ {especie: 'Whale', nombre: 'Fail'}
+];
+
+for (var i = 0; i < animales.length; i++) {
+ (function (i) {
+ this.imprimir = function () {
+ console.log('#' + i + ' ' + this.especie + ': ' + this.nombre);
+ }
+ this.imprimir();
+ }).call(animales[i], i);
+}
+```
+
+## See also
+
+- {{jsxref("Function.prototype.bind()")}}
+- {{jsxref("Function.prototype.apply()")}}
diff --git a/files/es/web/javascript/reference/global_objects/function/caller/index.html b/files/es/web/javascript/reference/global_objects/function/caller/index.html
deleted file mode 100644
index fbe65237765de6..00000000000000
--- a/files/es/web/javascript/reference/global_objects/function/caller/index.html
+++ /dev/null
@@ -1,81 +0,0 @@
----
-title: Function.caller
-slug: Web/JavaScript/Reference/Global_Objects/Function/caller
-tags:
- - Función Javascript No-standard Propiedad
-translation_of: Web/JavaScript/Reference/Global_Objects/Function/caller
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Function/caller
----
-{{JSRef("Global_Objects", "Function")}} {{non-standard_header}}
-
-Resumen
-
-La propiedad function .caller
retorna la función que llamó a la función especificada.
-
-Descripción
-
-Si la función f
fue llamada por desde nivel raiz (top level code), el valor de f.caller
es {{jsxref("Global_Objects/null", "null")}}, de lo contrario se retorna la función que llamó a f
.
-
-Esta propiedad reemplaza a la propiedad obsoleta {{jsxref("Functions_and_function_scope/arguments/caller", "arguments.caller")}} del objeto {{jsxref("Funciones/arguments", "arguments")}}.
-
-la propiedad especial __caller__
, la cual retornaba el objeto de activación del llamador y permitía reconstruir la pila de llamadas, ha sido removida por motivos de seguridad.
-
-Notas
-
-En caso de recursión se puede reconstruir la pila de llamada utilizando esta propiedad, tal como se muestra a continuación:
-
-function f(n) { g(n - 1); }
-function g(n) { if (n > 0) { f(n); } else { stop(); } }
-f(2);
-
-
-Al momento de ejecutar stop()
este se llama con la siguiente pila de llamadas:
-
-f(2) -> g(1) -> f(1) -> g(0) -> stop()
-
-
-Siendo verdadero la siguiente consideración:
-
-stop.caller === g && f.caller === g && g.caller === f
-
-
-Por lo tanto si se intenta obtener el rastro de llamadas (stack trace) de la función stop()
como se muestra a continuación:
-
-var f = stop;
-var stack = 'Stack trace:';
-while (f) {
- stack += '\n' + f.name;
- f = f.caller;
-}
-
-
-se provocará una bucle que nunca termina.
-
-Ejemplos
-
-Ejemplo: Verificar el valor de la propiedad caller
de una función
-
-El siguiente código verifica el valor de la propiedad caller
de una función.
-
-function myFunc() {
- if (myFunc.caller == null) {
- return 'The function was called from the top!';
- } else {
- return 'This function\'s caller was ' + myFunc.caller;
- }
-}
-
-
-Especificación
-
-No es parte de ninguna especificación. Se implementa en JavaScript 1.5.
-
-Compatiblilidad de Navegadores
-
-{{Compat("javascript.builtins.Function.caller")}}
-
-Véase también
-
-
- Problema de implementación para SpiderMonkey {{bug(65683)}}
-
diff --git a/files/es/web/javascript/reference/global_objects/function/caller/index.md b/files/es/web/javascript/reference/global_objects/function/caller/index.md
new file mode 100644
index 00000000000000..f107dab122f532
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/function/caller/index.md
@@ -0,0 +1,84 @@
+---
+title: Function.caller
+slug: Web/JavaScript/Reference/Global_Objects/Function/caller
+tags:
+ - Función Javascript No-standard Propiedad
+translation_of: Web/JavaScript/Reference/Global_Objects/Function/caller
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Function/caller
+---
+{{JSRef("Global_Objects", "Function")}} {{non-standard_header}}
+
+## Resumen
+
+La propiedad **`function.caller`** retorna la función que llamó a la función especificada.
+
+## Descripción
+
+Si la función `f` fue llamada por desde nivel raiz (top level code), el valor de `f.caller` es {{jsxref("Global_Objects/null", "null")}}, de lo contrario se retorna la función que llamó a `f`.
+
+Esta propiedad reemplaza a la propiedad obsoleta {{jsxref("Functions_and_function_scope/arguments/caller", "arguments.caller")}} del objeto {{jsxref("Funciones/arguments", "arguments")}}.
+
+la propiedad especial `__caller__`, la cual retornaba el objeto de activación del llamador y permitía reconstruir la pila de llamadas, ha sido removida por motivos de seguridad.
+
+### Notas
+
+En caso de recursión se puede reconstruir la pila de llamada utilizando esta propiedad, tal como se muestra a continuación:
+
+```js
+function f(n) { g(n - 1); }
+function g(n) { if (n > 0) { f(n); } else { stop(); } }
+f(2);
+```
+
+Al momento de ejecutar `stop()` este se llama con la siguiente pila de llamadas:
+
+```
+f(2) -> g(1) -> f(1) -> g(0) -> stop()
+```
+
+Siendo verdadero la siguiente consideración:
+
+```
+stop.caller === g && f.caller === g && g.caller === f
+```
+
+Por lo tanto si se intenta obtener el rastro de llamadas (stack trace) de la función `stop()` como se muestra a continuación:
+
+```js
+var f = stop;
+var stack = 'Stack trace:';
+while (f) {
+ stack += '\n' + f.name;
+ f = f.caller;
+}
+```
+
+se provocará una bucle que nunca termina.
+
+## Ejemplos
+
+### Ejemplo: Verificar el valor de la propiedad `caller` de una función
+
+El siguiente código verifica el valor de la propiedad `caller` de una función.
+
+```js
+function myFunc() {
+ if (myFunc.caller == null) {
+ return 'The function was called from the top!';
+ } else {
+ return 'This function\'s caller was ' + myFunc.caller;
+ }
+}
+```
+
+## Especificación
+
+No es parte de ninguna especificación. Se implementa en JavaScript 1.5.
+
+## Compatiblilidad de Navegadores
+
+{{Compat("javascript.builtins.Function.caller")}}
+
+## Véase también
+
+- Problema de implementación para SpiderMonkey {{bug(65683)}}
diff --git a/files/es/web/javascript/reference/global_objects/function/displayname/index.html b/files/es/web/javascript/reference/global_objects/function/displayname/index.html
deleted file mode 100644
index 3e8d67a05209eb..00000000000000
--- a/files/es/web/javascript/reference/global_objects/function/displayname/index.html
+++ /dev/null
@@ -1,78 +0,0 @@
----
-title: Function.displayName
-slug: Web/JavaScript/Reference/Global_Objects/Function/displayName
-translation_of: Web/JavaScript/Reference/Global_Objects/Function/displayName
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Function/displayName
----
-{{JSRef}} {{non-standard_header}}
-
-The function .displayName
property returns the display name of the function.
-
-Description
-
-Cuando se define la propiedad displayName
, retorna un mensaje con el nombre para mostrar en una función:
-
-function doSomething() {}
-
-console.log(doSomething.displayName); // "undefined"
-
-var popup = function(content) { console.log(content); };
-
-popup.displayName = 'Show Popup';
-
-console.log(popup.displayName); // "Show Popup"
-
-
-Tu puedes definir una funcion con un nombre a mostrar en un {{jsxref("Functions", "function expression", "", 1)}}:
-
-var object = {
- someMethod: function() {}
-};
-
-object.someMethod.displayName = 'someMethod';
-
-console.log(object.someMethod.displayName); // logs "someMethod"
-
-try { someMethod } catch(e) { console.log(e); }
-// ReferenceError: someMethod is not defined
-
-
-Puedes cambiar dinámicamente el displayName
de una función:
-
-var object = {
- // anonymous
- someMethod: function(value) {
- arguments.callee.displayName = 'someMethod (' + value + ')';
- }
-};
-
-console.log(object.someMethod.displayName); // "undefined"
-
-object.someMethod('123')
-console.log(object.someMethod.displayName); // "someMethod (123)"
-
-
-Ejemplos
-
-Normalmente, se prefiere por consolas y profilers sobre {{jsxref("Function.name", "func.name")}} a mostrar el nombre de una función.
-
-Al ingresar lo siguiente en una consola, debería mostrarse como algo así como "function My Function()
":
-
-var a = function() {};
-a.displayName = 'My Function';
-
-a; // "function My Function()"
-
-Specifications
-
-Not part of any specification.
-
-Browser compatibility
-
-
-
-
-
{{Compat("javascript.builtins.Function.displayName")}}
-
-
-
diff --git a/files/es/web/javascript/reference/global_objects/function/displayname/index.md b/files/es/web/javascript/reference/global_objects/function/displayname/index.md
new file mode 100644
index 00000000000000..9f54be6bcab52e
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/function/displayname/index.md
@@ -0,0 +1,77 @@
+---
+title: Function.displayName
+slug: Web/JavaScript/Reference/Global_Objects/Function/displayName
+translation_of: Web/JavaScript/Reference/Global_Objects/Function/displayName
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Function/displayName
+---
+{{JSRef}} {{non-standard_header}}
+
+The **`function.displayName`** property returns the display name of the function.
+
+## Description
+
+Cuando se define la propiedad `displayName` , retorna un mensaje con el nombre para mostrar en una función:
+
+```js
+function doSomething() {}
+
+console.log(doSomething.displayName); // "undefined"
+
+var popup = function(content) { console.log(content); };
+
+popup.displayName = 'Show Popup';
+
+console.log(popup.displayName); // "Show Popup"
+```
+
+Tu puedes definir una funcion con un nombre a mostrar en un {{jsxref("Functions", "function expression", "", 1)}}:
+
+```js
+var object = {
+ someMethod: function() {}
+};
+
+object.someMethod.displayName = 'someMethod';
+
+console.log(object.someMethod.displayName); // logs "someMethod"
+
+try { someMethod } catch(e) { console.log(e); }
+// ReferenceError: someMethod is not defined
+```
+
+Puedes cambiar dinámicamente el `displayName` de una función:
+
+```js
+var object = {
+ // anonymous
+ someMethod: function(value) {
+ arguments.callee.displayName = 'someMethod (' + value + ')';
+ }
+};
+
+console.log(object.someMethod.displayName); // "undefined"
+
+object.someMethod('123')
+console.log(object.someMethod.displayName); // "someMethod (123)"
+```
+
+## Ejemplos
+
+Normalmente, se prefiere por consolas y profilers sobre {{jsxref("Function.name", "func.name")}} a mostrar el nombre de una función.
+
+Al ingresar lo siguiente en una consola, debería mostrarse como algo así como "`function My Function()`":
+
+```js
+var a = function() {};
+a.displayName = 'My Function';
+
+a; // "function My Function()"
+```
+
+## Specifications
+
+Not part of any specification.
+
+## Browser compatibility
+
+{{Compat("javascript.builtins.Function.displayName")}}
diff --git a/files/es/web/javascript/reference/global_objects/function/function/index.html b/files/es/web/javascript/reference/global_objects/function/function/index.html
deleted file mode 100644
index 91ac6f6efacfb9..00000000000000
--- a/files/es/web/javascript/reference/global_objects/function/function/index.html
+++ /dev/null
@@ -1,93 +0,0 @@
----
-title: Function() constructor
-slug: Web/JavaScript/Reference/Global_Objects/Function/Function
-tags:
- - Constructor
- - Function
- - JavaScript
- - Referencia
- - función
-translation_of: Web/JavaScript/Reference/Global_Objects/Function/Function
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Function/Función
----
-{{JSRef("Objetos_globales", "Function")}}
-
-El constructor Function
crea un nuevo objeto Function
. Llamar al constructor directamente puede crear funciones dinámicamente, pero tiene problemas de seguridad y de rendimiento similares (pero mucho menos importantes) para {{jsxref("eval")}}. Sin embargo, a diferencia de eval, el constructor Function
crea funciones que solo se ejecutan en el ámbito global.
-
-{{EmbedInteractiveExample("pages/js/function-constructor.html","shorter")}}
-
-La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si deseas contribuir al proyecto de ejemplos interactivos, clona https://github.com/mdn/interactive-examples y envíanos una solicitud de extracción.
-
-Sintaxis
-
-new Function([arg1 [, arg2 [, ...argN ]] ,] functionBody )
-
-Parámetros
-
-
- arg1 , arg2 , ... argN
- Nombres que utilizará la función como nombres de argumentos formales. Cada uno debe ser una cadena que corresponda a un identificador JavaScript válido, o una lista de dichas cadenas separadas por una coma. Por ejemplo: "x
", "theValue
" —o "x,theValue
".
- functionBody
- Una cadena que contiene las declaraciones de JavaScript que comprenden la definición de función.
-
-
-Descripción
-
-Los objetos Function
creados con el constructor Function
se procesan cuando se crea la función. Esto es menos eficiente que declarar una función con una {{jsxref("Operators/function", "expresión de función")}} o {{jsxref("Statements/function", "declaración de función")}} y llamarla dentro de tu código porque tales funciones se procesan con el resto del código.
-
-Todos los argumentos pasados a la función se tratan como los nombres de los identificadores de los parámetros en la función que se va a crear, en el orden en que se pasan. Omitir un argumento dará como resultado que el valor de ese parámetro sea undefined
.
-
-Invocar el constructor Function
como función (sin usar el operador new
) tiene el mismo efecto que invocarlo como constructor.
-
-Ejemplos
-
-Especificar argumentos con el constructor Function
-
-El siguiente código crea un objeto Function
que toma dos argumentos.
-
-// El ejemplo se puede ejecutar directamente en tu consola JavaScript
-
-// Crea una función que toma dos argumentos y devuelve la suma de esos argumentos
-const adder = new Function('a', 'b', 'return a + b');
-
-// Llama a la función
-adder(2, 6);
-// 8
-
-
-Los argumentos "a
" y "b
" son nombres de argumentos formales que se utilizan en el cuerpo de la función, "return a + b
".
-
-Especificaciones
-
-
-
-
- Especificación
-
-
-
-
- {{SpecName('ESDraft', '#sec-function-constructor', 'Constructor Function')}}
-
-
-
-
-Compatibilidad del navegador
-
-
-
-
-
{{Compat("javascript.builtins.Function.Function")}}
-
-
-Ve también
-
-
- {{jsxref("Functions", "Funciones y ámbito de la función", "", 1)}}
- {{jsxref("Statements/function", "Declaración de function")}}
- {{jsxref("Operators/function*", "Expresión function*")}}
- {{jsxref("Statements/function", "Declaración de function*")}}
- {{jsxref("Operators/function*", "Expresión function*")}}
- {{jsxref("AsyncFunction", "Función asíncrona", "", 1)}}
- {{jsxref("GeneratorFunction", "Función generadora", "", 1)}}
-
diff --git a/files/es/web/javascript/reference/global_objects/function/function/index.md b/files/es/web/javascript/reference/global_objects/function/function/index.md
new file mode 100644
index 00000000000000..73410843ba4b12
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/function/function/index.md
@@ -0,0 +1,79 @@
+---
+title: Function() constructor
+slug: Web/JavaScript/Reference/Global_Objects/Function/Function
+tags:
+ - Constructor
+ - Function
+ - JavaScript
+ - Referencia
+ - función
+translation_of: Web/JavaScript/Reference/Global_Objects/Function/Function
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Function/Función
+---
+{{JSRef("Objetos_globales", "Function")}}
+
+El constructor **`Function`** crea un nuevo **objeto** `Function`. Llamar al constructor directamente puede crear funciones dinámicamente, pero tiene problemas de seguridad y de rendimiento similares (pero mucho menos importantes) para {{jsxref("eval")}}. Sin embargo, a diferencia de eval, el constructor `Function` crea funciones que solo se ejecutan en el ámbito global.
+
+{{EmbedInteractiveExample("pages/js/function-constructor.html","shorter")}}
+
+La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si deseas contribuir al proyecto de ejemplos interactivos, clona y envíanos una solicitud de extracción.
+
+## Sintaxis
+
+```
+new Function([arg1 [, arg2 [, ...argN]] ,] functionBody)
+```
+
+### Parámetros
+
+- `arg1, arg2, ... argN`
+ - : Nombres que utilizará la función como nombres de argumentos formales. Cada uno debe ser una cadena que corresponda a un identificador JavaScript válido, o una lista de dichas cadenas separadas por una coma. Por ejemplo: "`x`", "`theValue`" —o "`x,theValue`".
+- `functionBody`
+ - : Una cadena que contiene las declaraciones de JavaScript que comprenden la definición de función.
+
+## Descripción
+
+Los objetos `Function` creados con el constructor `Function` se procesan cuando se crea la función. Esto es menos eficiente que declarar una función con una {{jsxref("Operators/function", "expresión de función")}} o {{jsxref("Statements/function", "declaración de función")}} y llamarla dentro de tu código porque tales funciones se procesan con el resto del código.
+
+Todos los argumentos pasados a la función se tratan como los nombres de los identificadores de los parámetros en la función que se va a crear, en el orden en que se pasan. Omitir un argumento dará como resultado que el valor de ese parámetro sea `undefined`.
+
+Invocar el constructor `Function` como función (sin usar el operador `new`) tiene el mismo efecto que invocarlo como constructor.
+
+## Ejemplos
+
+### Especificar argumentos con el constructor Function
+
+El siguiente código crea un objeto `Function` que toma dos argumentos.
+
+```js
+// El ejemplo se puede ejecutar directamente en tu consola JavaScript
+
+// Crea una función que toma dos argumentos y devuelve la suma de esos argumentos
+const adder = new Function('a', 'b', 'return a + b');
+
+// Llama a la función
+adder(2, 6);
+// 8
+```
+
+Los argumentos "`a`" y "`b`" son nombres de argumentos formales que se utilizan en el cuerpo de la función, "`return a + b`".
+
+## Especificaciones
+
+| Especificación |
+| ---------------------------------------------------------------------------------------------------- |
+| {{SpecName('ESDraft', '#sec-function-constructor', 'Constructor Function')}} |
+
+## Compatibilidad del navegador
+
+{{Compat("javascript.builtins.Function.Function")}}
+
+## Ve también
+
+- {{jsxref("Functions", "Funciones y ámbito de la función", "", 1)}}
+- {{jsxref("Statements/function", "Declaración de function")}}
+- {{jsxref("Operators/function*", "Expresión function*")}}
+- {{jsxref("Statements/function", "Declaración de function*")}}
+- {{jsxref("Operators/function*", "Expresión function*")}}
+- {{jsxref("AsyncFunction", "Función asíncrona", "", 1)}}
+- {{jsxref("GeneratorFunction", "Función generadora", "", 1)}}
diff --git a/files/es/web/javascript/reference/global_objects/function/name/index.html b/files/es/web/javascript/reference/global_objects/function/name/index.html
deleted file mode 100644
index 705e2c6c03dbf8..00000000000000
--- a/files/es/web/javascript/reference/global_objects/function/name/index.html
+++ /dev/null
@@ -1,136 +0,0 @@
----
-title: Function.name
-slug: Web/JavaScript/Reference/Global_Objects/Function/name
-translation_of: Web/JavaScript/Reference/Global_Objects/Function/name
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Function/name
----
-{{JSRef}}
-
-La propiedad function .name
retorna el nombre de la función o retorna "anonymous"
por funciones creadas anónimamente.
-
-{{js_property_attributes(0,0,1)}}
-
-Nótese que en implementaciones no estándar previas a ES2015 el atributo configurable
también era false
.
-
-Ejemplos
-
-Nombre de una declaración de función
-
-La propiedad name
retorna el nombre de una declaración de función.
-
-function doSomething() {}
-
-console.log(doSomething.name); // imprime en pantalla "doSomething"
-
-
-Nombre de constructor de función
-
-Las funciones creadas con la sintaxis new Function(...)
o simplemente Function(...)
tienen como propiedad name
una cadena vacía. En los ejemplos a continuación se crean funciones anónimas, tales que su name
retorna una cadena vacía:
-
-var f = function() {};
-var object = {
- someMethod: function() {}
-};
-
-console.log(f.name == ''); // true
-console.log(object.someMethod.name == ''); // también true
-
-
-Nombres de función inferidos
-
-Los navegadores que implementan funciones ES2015 pueden inferir el nombre de una función anónima de su posición sintáctica. Por ejemplo:
-
-var f = function() {};
-console.log(f.name); // "f"
-
-Se puede definir una función con un nombre en un {{jsxref("Operators/Function", "function expression", "", 1)}}:
-
-var object = {
- someMethod: function object_someMethod() {}
-};
-console.log(object.someMethod.name); // imprime "object_someMethod"
-
-try { object_someMethod } catch(e) { console.log(e); }
-// ReferenceError: object_someMethod is not defined
-
-
-No se puede cambiar el nombre de una función, esta propiedad es de solo lectura:
-
-var object = {
- // anonymous
- someMethod: function() {}
-};
-
-object.someMethod.name = 'someMethod';
-console.log(object.someMethod.name); // cadena vacía, someMethod es anónimo
-
-
-Sin embargo, se puede usar {{jsxref("Object.defineProperty()")}} para cambiarlo.
-
-Nombres de métodos
-
-var o = {
- foo(){}
-};
-o.foo.name; // "foo";
-
-Nombres de funciones atadas (creadas con .bind())
-
-{{jsxref("Function.bind()")}} produce una función cuyo nombre es igual a "bound " seguido del nombre de la función original.
-
-function foo() {};
-foo.bind({}).name; // "bound foo"
-
-Nombres de funciones getters y setters
-
-Cuando se usan get
y set ,
"get" y "set" aparecerán en el nombre de la función.
-
-var o = {
- get foo(){},
- set foo(x){}
-};
-
-var descriptor = Object.getOwnPropertyDescriptor(o, "foo");
-descriptor.get.name; // "get foo"
-descriptor.set.name; // "set foo";
-
-Ejemplos
-
-Se puede usar obj.constructor.name
para saber cuál es la "clase" de un objeto:
-
-function a() {}
-
-var b = new a();
-
-console.log(b.constructor.name); // imprime "a"
-
-
-Polyfill
-
-Para versiones de IE < 9, se puede usar fn._name()
en su lugar. Para IE9 o posteriores se puede usar el siguiente polyfill .
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentarios
-
-
- {{SpecName('ES2015', '#sec-name', 'name')}}
- {{Spec2('ES2015')}}
- Definición inicial.
-
-
- {{SpecName('ESDraft', '#sec-name', 'name')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad con navegadores
-
-{{Compat("javascript.builtins.Function.name")}}
diff --git a/files/es/web/javascript/reference/global_objects/function/name/index.md b/files/es/web/javascript/reference/global_objects/function/name/index.md
new file mode 100644
index 00000000000000..c22ce32a7420a1
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/function/name/index.md
@@ -0,0 +1,132 @@
+---
+title: Function.name
+slug: Web/JavaScript/Reference/Global_Objects/Function/name
+translation_of: Web/JavaScript/Reference/Global_Objects/Function/name
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Function/name
+---
+{{JSRef}}
+
+La propiedad **`function.name`** retorna el nombre de la función o retorna `"anonymous"` por funciones creadas anónimamente.
+
+{{js_property_attributes(0,0,1)}}Nótese que en implementaciones no estándar previas a ES2015 el atributo `configurable` también era `false`.
+
+## Ejemplos
+
+### Nombre de una declaración de función
+
+La propiedad `name` retorna el nombre de una declaración de función.
+
+```js
+function doSomething() {}
+
+console.log(doSomething.name); // imprime en pantalla "doSomething"
+```
+
+### Nombre de constructor de función
+
+Las funciones creadas con la sintaxis `new Function(...)` o simplemente `Function(...)` tienen como propiedad `name` una cadena vacía. En los ejemplos a continuación se crean funciones anónimas, tales que su `name` retorna una cadena vacía:
+
+```js
+var f = function() {};
+var object = {
+ someMethod: function() {}
+};
+
+console.log(f.name == ''); // true
+console.log(object.someMethod.name == ''); // también true
+```
+
+### Nombres de función inferidos
+
+Los navegadores que implementan funciones ES2015 pueden inferir el nombre de una función anónima de su posición sintáctica. Por ejemplo:
+
+```js
+var f = function() {};
+console.log(f.name); // "f"
+```
+
+Se puede definir una función con un nombre en un {{jsxref("Operators/Function", "function expression", "", 1)}}:
+
+```js
+var object = {
+ someMethod: function object_someMethod() {}
+};
+console.log(object.someMethod.name); // imprime "object_someMethod"
+
+try { object_someMethod } catch(e) { console.log(e); }
+// ReferenceError: object_someMethod is not defined
+```
+
+No se puede cambiar el nombre de una función, esta propiedad es de solo lectura:
+
+```js
+var object = {
+ // anonymous
+ someMethod: function() {}
+};
+
+object.someMethod.name = 'someMethod';
+console.log(object.someMethod.name); // cadena vacía, someMethod es anónimo
+```
+
+Sin embargo, se puede usar {{jsxref("Object.defineProperty()")}} para cambiarlo.
+
+### Nombres de métodos
+
+```js
+var o = {
+ foo(){}
+};
+o.foo.name; // "foo";
+```
+
+### Nombres de funciones atadas (creadas con .bind())
+
+{{jsxref("Function.bind()")}} produce una función cuyo nombre es igual a "bound " seguido del nombre de la función original.
+
+```js
+function foo() {};
+foo.bind({}).name; // "bound foo"
+```
+
+### Nombres de funciones getters y setters
+
+Cuando se usan [`get`](/en-US/docs/Web/JavaScript/Reference/Functions/get) y `set,`"get" y "set" aparecerán en el nombre de la función.
+
+```js
+var o = {
+ get foo(){},
+ set foo(x){}
+};
+
+var descriptor = Object.getOwnPropertyDescriptor(o, "foo");
+descriptor.get.name; // "get foo"
+descriptor.set.name; // "set foo";
+```
+
+## Ejemplos
+
+Se puede usar `obj.constructor.name` para saber cuál es la "clase" de un objeto:
+
+```js
+function a() {}
+
+var b = new a();
+
+console.log(b.constructor.name); // imprime "a"
+```
+
+## Polyfill
+
+Para versiones de IE < 9, se puede usar `fn._name()` en su lugar. Para IE9 o posteriores se puede usar el siguiente [polyfill](https://github.com/JamesMGreene/Function.name).
+
+## Especificaciones
+
+| Especificación | Estado | Comentarios |
+| ------------------------------------------------------------ | ---------------------------- | ------------------- |
+| {{SpecName('ES2015', '#sec-name', 'name')}} | {{Spec2('ES2015')}} | Definición inicial. |
+| {{SpecName('ESDraft', '#sec-name', 'name')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad con navegadores
+
+{{Compat("javascript.builtins.Function.name")}}
diff --git a/files/es/web/javascript/reference/global_objects/index.html b/files/es/web/javascript/reference/global_objects/index.html
deleted file mode 100644
index 13be601edab2d6..00000000000000
--- a/files/es/web/javascript/reference/global_objects/index.html
+++ /dev/null
@@ -1,204 +0,0 @@
----
-title: Objetos globales
-slug: Web/JavaScript/Reference/Global_Objects
-tags:
- - JavaScript
- - Referencia
-translation_of: Web/JavaScript/Reference/Global_Objects
-original_slug: Web/JavaScript/Referencia/Objetos_globales
----
-{{jsSidebar("Objects")}}
-
-Este capítulo documenta todo acerca de estándares de Javascript, los objetos integrados en JavaScript, así como los métodos y propiedades de cada uno.
-
-El término "objetos globales" (u objetos incorporados estándar) aquí no debe confundirse con el objeto global . Aquí, los objetos globales se refieren a objetos en el ámbito global . Se puede acceder al objeto global en sí usando el operador {{jsxref("Operadores/this", "this")}} en el ámbito global (pero solo si no se usa el modo estricto ECMAScript 5, en ese caso devuelve {{jsxref("undefined")}}). De hecho, el alcance global consiste en las propiedades del objeto global, incluidas las propiedades heredadas, si las hay.
-
-Otros objetos en el alcance global son creados por el script de usuario o son proporcionados por la aplicación host. Los objetos host disponibles en los contextos del navegador están documentados en la referencia de la API . Para obtener más información acerca de la distinción entre el DOM y el núcleo de JavaScript , vea Introducción a las tecnologías JavaScript .
-
-Objetos estándar por categoría
-
-Propiedades de valor
-
-Estas propiedades globales devuelven un valor simple; ellos no tienen propiedades o métodos.
-
-
- {{jsxref("Infinity")}}
- {{jsxref("NaN")}}
- {{jsxref("undefined")}}
- {{jsxref("null")}} literal
- {{JSxRef("globalThis")}}
-
-
-Propiedades de funciones
-
-Estas funciones globales -funciones llamadas globalmente en lugar de un objeto- devuelven directamente sus resultados a la persona que llama.
-
-
- {{jsxref("Objetos_globales/eval", "eval()")}}
- {{jsxref("Objetos_globales/uneval", "uneval()")}} {{non-standard_inline}}
- {{jsxref("Objetos_globales/isFinite", "isFinite()")}}
- {{jsxref("Objetos_globales/isNaN", "isNaN()")}}
- {{jsxref("Objetos_globales/parseFloat", "parseFloat()")}}
- {{jsxref("Objetos_globales/parseInt", "parseInt()")}}
- {{jsxref("Objetos_globales/decodeURI", "decodeURI()")}}
- {{jsxref("Objetos_globales/decodeURIComponent", "decodeURIComponent()")}}
- {{jsxref("Objetos_globales/encodeURI", "encodeURI()")}}
- {{jsxref("Objetos_globales/encodeURIComponent", "encodeURIComponent()")}}
- {{jsxref("Objetos_globales/escape", "escape()")}} {{deprecated_inline}}
- {{jsxref("Objetos_globales/unescape", "unescape()")}} {{deprecated_inline}}
-
-
-Objetos fundamentales
-
-Estos son los objetos fundamentales y básicos sobre los que se basan todos los demás objetos. Esto incluye objetos que representan objetos generales, funciones y errores.
-
-
- {{jsxref("Object")}}
- {{jsxref("Function")}}
- {{jsxref("Boolean")}}
- {{jsxref("Symbol")}}
- {{jsxref("Error")}}
- {{jsxref("EvalError")}}
- {{jsxref("InternalError")}}
- {{jsxref("RangeError")}}
- {{jsxref("ReferenceError")}}
- {{jsxref("SyntaxError")}}
- {{jsxref("TypeError")}}
- {{jsxref("URIError")}}
-
-
-Números y fechas
-
-Estos son los objetos base que representan números, fechas y cálculos matemáticos.
-
-
- {{jsxref("Number")}}
- {{JSxRef("BigInt")}}
- {{jsxref("Math")}}
- {{jsxref("Date")}}
-
-
-Procesamiento de texto
-
-Estos objetos representan cadenas y soporte para manipularlos.
-
-
- {{jsxref("String")}}
- {{jsxref("RegExp")}}
-
-
-Colecciones indexadas
-
-Estos objetos representan colecciones de datos que están ordenadas por un valor de índice. Esto incluye matrices (tipadas) y construcciones tipo array.
-
-
- {{jsxref("Array")}}
- {{jsxref("Int8Array")}}
- {{jsxref("Uint8Array")}}
- {{jsxref("Uint8ClampedArray")}}
- {{jsxref("Int16Array")}}
- {{jsxref("Uint16Array")}}
- {{jsxref("Int32Array")}}
- {{jsxref("Uint32Array")}}
- {{jsxref("Float32Array")}}
- {{jsxref("Float64Array")}}
- {{JSxRef("BigInt64Array")}}
- {{JSxRef("BigUint64Array")}}
-
-
-Colecciones con clave
-
-Estos objetos representan colecciones que usan claves; estos contienen elementos que son iterables en el orden de inserción.
-
-
- {{jsxref("Map")}}
- {{jsxref("Set")}}
- {{jsxref("WeakMap")}}
- {{jsxref("WeakSet")}}
-
-
-Colecciones de vectores
-
-Los tipos de datos vectoriales {{Glossary("SIMD")}} son objetos donde los datos se organizan en carriles.
-
-
- {{jsxref("SIMD")}} {{experimental_inline}}
- {{jsxref("Float32x4", "SIMD.Float32x4")}} {{experimental_inline}}
- {{jsxref("Float64x2", "SIMD.Float64x2")}} {{experimental_inline}}
- {{jsxref("Int8x16", "SIMD.Int8x16")}} {{experimental_inline}}
- {{jsxref("Int16x8", "SIMD.Int16x8")}} {{experimental_inline}}
- {{jsxref("Int32x4", "SIMD.Int32x4")}} {{experimental_inline}}
- {{jsxref("Uint8x16", "SIMD.Uint8x16")}} {{experimental_inline}}
- {{jsxref("Uint16x8", "SIMD.Uint16x8")}} {{experimental_inline}}
- {{jsxref("Uint32x4", "SIMD.Uint32x4")}} {{experimental_inline}}
- {{jsxref("Bool8x16", "SIMD.Bool8x16")}} {{experimental_inline}}
- {{jsxref("Bool16x8", "SIMD.Bool16x8")}} {{experimental_inline}}
- {{jsxref("Bool32x4", "SIMD.Bool32x4")}} {{experimental_inline}}
- {{jsxref("Bool64x2", "SIMD.Bool64x2")}} {{experimental_inline}}
-
-
-Datos estructurados
-
-Estos objetos representan e interactúan con los búferes de datos estructurados y los datos codificados utilizando la notación de objetos JavaScript (JSON del inglés J avaS cript O bject N otation).
-
-
- {{jsxref("ArrayBuffer")}}
- {{jsxref("SharedArrayBuffer")}} {{experimental_inline}}
- {{jsxref("Atomics")}} {{experimental_inline}}
- {{jsxref("DataView")}}
- {{jsxref("JSON")}}
-
-
-Objetos de abstracción de control
-
-
- {{jsxref("Promise")}}
- {{jsxref("Generator")}}
- {{jsxref("GeneratorFunction")}}
- {{experimental_inline}} {{jsxref("AsyncFunction")}}
-
-
-Reflexión
-
-
- {{jsxref("Reflect")}}
- {{jsxref("Proxy")}}
-
-
-Internacionalización
-
-Adiciones al núcleo de ECMAScript para funcionalidades sensibles al lenguaje.
-
-
- {{jsxref("Intl")}}
- {{jsxref("Objetos_globales/Collator", "Intl.Collator")}}
- {{jsxref("Objetos_globales/DateTimeFormat", "Intl.DateTimeFormat")}}
- {{jsxref("Objetos_globales/NumberFormat", "Intl.NumberFormat")}}
-
-
-WebAssembly
-
-
- {{jsxref("WebAssembly")}}
- {{jsxref("WebAssembly.Module")}}
- {{jsxref("WebAssembly.Instance")}}
- {{jsxref("WebAssembly.Memory")}}
- {{jsxref("WebAssembly.Table")}}
- {{jsxref("WebAssembly.CompileError")}}
- {{jsxref("WebAssembly.LinkError")}}
- {{jsxref("WebAssembly.RuntimeError")}}
-
-
-Otro
-
-
-
-
- {{JSxRef("Functions/arguments", "arguments")}}
-
-
-
-
-
-
-
diff --git a/files/es/web/javascript/reference/global_objects/index.md b/files/es/web/javascript/reference/global_objects/index.md
new file mode 100644
index 00000000000000..b5faa1846bdf8a
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/index.md
@@ -0,0 +1,168 @@
+---
+title: Objetos globales
+slug: Web/JavaScript/Reference/Global_Objects
+tags:
+ - JavaScript
+ - Referencia
+translation_of: Web/JavaScript/Reference/Global_Objects
+original_slug: Web/JavaScript/Referencia/Objetos_globales
+---
+{{jsSidebar("Objects")}}
+
+Este capítulo documenta todo acerca de estándares de Javascript, los objetos integrados en JavaScript, así como los métodos y propiedades de cada uno.
+
+El término "objetos globales" (u objetos incorporados estándar) aquí no debe confundirse con el **objeto global**. Aquí, los objetos globales se refieren a **objetos en el ámbito global**. Se puede acceder al **objeto global** en sí usando el operador {{jsxref("Operadores/this", "this")}} en el ámbito global (pero solo si no se usa el modo estricto ECMAScript 5, en ese caso devuelve {{jsxref("undefined")}}). De hecho, el alcance global consiste en las propiedades del objeto global, incluidas las propiedades heredadas, si las hay.
+
+Otros objetos en el alcance global son [creados por el script de usuario](/es/docs/Web/JavaScript/Guide/Working_with_Objects#Creating_new_objects) o son proporcionados por la aplicación host. Los objetos host disponibles en los contextos del navegador están documentados en la [referencia de la API](/es/docs/Web/API/Reference). Para obtener más información acerca de la distinción entre el [DOM](/es/docs/DOM/DOM_Reference) y el núcleo de [JavaScript](/es/docs/Web/JavaScript), vea [Introducción a las tecnologías JavaScript](/es/docs/Web/JavaScript/JavaScript_technologies_overview).
+
+## Objetos estándar por categoría
+
+### Propiedades de valor
+
+Estas propiedades globales devuelven un valor simple; ellos no tienen propiedades o métodos.
+
+- {{jsxref("Infinity")}}
+- {{jsxref("NaN")}}
+- {{jsxref("undefined")}}
+- {{jsxref("null")}} literal
+- {{JSxRef("globalThis")}}
+
+### Propiedades de funciones
+
+Estas funciones globales -funciones llamadas globalmente en lugar de un objeto- devuelven directamente sus resultados a la persona que llama.
+
+- {{jsxref("Objetos_globales/eval", "eval()")}}
+- {{jsxref("Objetos_globales/uneval", "uneval()")}} {{non-standard_inline}}
+- {{jsxref("Objetos_globales/isFinite", "isFinite()")}}
+- {{jsxref("Objetos_globales/isNaN", "isNaN()")}}
+- {{jsxref("Objetos_globales/parseFloat", "parseFloat()")}}
+- {{jsxref("Objetos_globales/parseInt", "parseInt()")}}
+- {{jsxref("Objetos_globales/decodeURI", "decodeURI()")}}
+- {{jsxref("Objetos_globales/decodeURIComponent", "decodeURIComponent()")}}
+- {{jsxref("Objetos_globales/encodeURI", "encodeURI()")}}
+- {{jsxref("Objetos_globales/encodeURIComponent", "encodeURIComponent()")}}
+- {{jsxref("Objetos_globales/escape", "escape()")}} {{deprecated_inline}}
+- {{jsxref("Objetos_globales/unescape", "unescape()")}} {{deprecated_inline}}
+
+### Objetos fundamentales
+
+Estos son los objetos fundamentales y básicos sobre los que se basan todos los demás objetos. Esto incluye objetos que representan objetos generales, funciones y errores.
+
+- {{jsxref("Object")}}
+- {{jsxref("Function")}}
+- {{jsxref("Boolean")}}
+- {{jsxref("Symbol")}}
+- {{jsxref("Error")}}
+- {{jsxref("EvalError")}}
+- {{jsxref("InternalError")}}
+- {{jsxref("RangeError")}}
+- {{jsxref("ReferenceError")}}
+- {{jsxref("SyntaxError")}}
+- {{jsxref("TypeError")}}
+- {{jsxref("URIError")}}
+
+### Números y fechas
+
+Estos son los objetos base que representan números, fechas y cálculos matemáticos.
+
+- {{jsxref("Number")}}
+- {{JSxRef("BigInt")}}
+- {{jsxref("Math")}}
+- {{jsxref("Date")}}
+
+### Procesamiento de texto
+
+Estos objetos representan cadenas y soporte para manipularlos.
+
+- {{jsxref("String")}}
+- {{jsxref("RegExp")}}
+
+### Colecciones indexadas
+
+Estos objetos representan colecciones de datos que están ordenadas por un valor de índice. Esto incluye matrices (tipadas) y construcciones tipo array.
+
+- {{jsxref("Array")}}
+- {{jsxref("Int8Array")}}
+- {{jsxref("Uint8Array")}}
+- {{jsxref("Uint8ClampedArray")}}
+- {{jsxref("Int16Array")}}
+- {{jsxref("Uint16Array")}}
+- {{jsxref("Int32Array")}}
+- {{jsxref("Uint32Array")}}
+- {{jsxref("Float32Array")}}
+- {{jsxref("Float64Array")}}
+- {{JSxRef("BigInt64Array")}}
+- {{JSxRef("BigUint64Array")}}
+
+### Colecciones con clave
+
+Estos objetos representan colecciones que usan claves; estos contienen elementos que son iterables en el orden de inserción.
+
+- {{jsxref("Map")}}
+- {{jsxref("Set")}}
+- {{jsxref("WeakMap")}}
+- {{jsxref("WeakSet")}}
+
+### Colecciones de vectores
+
+Los tipos de datos vectoriales {{Glossary("SIMD")}} son objetos donde los datos se organizan en carriles.
+
+- {{jsxref("SIMD")}} {{experimental_inline}}
+- {{jsxref("Float32x4", "SIMD.Float32x4")}} {{experimental_inline}}
+- {{jsxref("Float64x2", "SIMD.Float64x2")}} {{experimental_inline}}
+- {{jsxref("Int8x16", "SIMD.Int8x16")}} {{experimental_inline}}
+- {{jsxref("Int16x8", "SIMD.Int16x8")}} {{experimental_inline}}
+- {{jsxref("Int32x4", "SIMD.Int32x4")}} {{experimental_inline}}
+- {{jsxref("Uint8x16", "SIMD.Uint8x16")}} {{experimental_inline}}
+- {{jsxref("Uint16x8", "SIMD.Uint16x8")}} {{experimental_inline}}
+- {{jsxref("Uint32x4", "SIMD.Uint32x4")}} {{experimental_inline}}
+- {{jsxref("Bool8x16", "SIMD.Bool8x16")}} {{experimental_inline}}
+- {{jsxref("Bool16x8", "SIMD.Bool16x8")}} {{experimental_inline}}
+- {{jsxref("Bool32x4", "SIMD.Bool32x4")}} {{experimental_inline}}
+- {{jsxref("Bool64x2", "SIMD.Bool64x2")}} {{experimental_inline}}
+
+### Datos estructurados
+
+Estos objetos representan e interactúan con los búferes de datos estructurados y los datos codificados utilizando la notación de objetos JavaScript (JSON del inglés **J**ava**S**cript **O**bject **N**otation).
+
+- {{jsxref("ArrayBuffer")}}
+- {{jsxref("SharedArrayBuffer")}} {{experimental_inline}}
+- {{jsxref("Atomics")}} {{experimental_inline}}
+- {{jsxref("DataView")}}
+- {{jsxref("JSON")}}
+
+### Objetos de abstracción de control
+
+- {{jsxref("Promise")}}
+- {{jsxref("Generator")}}
+- {{jsxref("GeneratorFunction")}}
+- {{experimental_inline}} {{jsxref("AsyncFunction")}}
+
+### Reflexión
+
+- {{jsxref("Reflect")}}
+- {{jsxref("Proxy")}}
+
+### Internacionalización
+
+Adiciones al núcleo de ECMAScript para funcionalidades sensibles al lenguaje.
+
+- {{jsxref("Intl")}}
+- {{jsxref("Objetos_globales/Collator", "Intl.Collator")}}
+- {{jsxref("Objetos_globales/DateTimeFormat", "Intl.DateTimeFormat")}}
+- {{jsxref("Objetos_globales/NumberFormat", "Intl.NumberFormat")}}
+
+### WebAssembly
+
+- {{jsxref("WebAssembly")}}
+- {{jsxref("WebAssembly.Module")}}
+- {{jsxref("WebAssembly.Instance")}}
+- {{jsxref("WebAssembly.Memory")}}
+- {{jsxref("WebAssembly.Table")}}
+- {{jsxref("WebAssembly.CompileError")}}
+- {{jsxref("WebAssembly.LinkError")}}
+- {{jsxref("WebAssembly.RuntimeError")}}
+
+### Otro
+
+- {{JSxRef("Functions/arguments", "arguments")}}
diff --git a/files/es/web/javascript/reference/global_objects/intl/relativetimeformat/index.html b/files/es/web/javascript/reference/global_objects/intl/relativetimeformat/index.html
deleted file mode 100644
index 9af98b50a7fffa..00000000000000
--- a/files/es/web/javascript/reference/global_objects/intl/relativetimeformat/index.html
+++ /dev/null
@@ -1,107 +0,0 @@
----
-title: Intl.RelativeTimeFormat
-slug: Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat
-tags:
- - RelatimeTimeFormat
-translation_of: Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Intl/RelativeTimeFormat
----
-{{JSRef}}
-
-El objeto Intl.RelativeTimeFormat
te proporciona una manera de formatear tiempos relativos con traducciones.
-
-{{EmbedInteractiveExample("pages/js/intl-relativetimeformat.html")}}
-
-El código de este ejemplo interactivo está disponible en un repositorio GitHub. Si quieres contribuir a los ejemplos interactivos del proyecto, por favor, clona https://github.com/mdn/interactive-examples y manda una Pull Request.
-
-Constructor
-
-
- {{jsxref("RelativeTimeFormat.RelativeTimeFormat()", "Intl.RelativeTimeFormat.RelativeTimeFormat()")}}
- Crea una nueva instancia de Intl.RelativeTimeFormat
.
-
-
-Métodos estáticos
-
-
- {{jsxref("RelativeTimeFormat.supportedLocalesOf", "Intl.RelativeTimeFormat.supportedLocalesOf()")}}
- Devuelve un {{jsxref("Array")}} con todos los idiomas disponibles sin necesidad de usar el que hay por defecto.
-
-
-Métodos de instancia
-
-
- {{jsxref("RelativeTimeFormat.format", "Intl.RelativeTimeFormat.prototype.format()")}}
- Formatea value
y unit
conforme al idioma y las opciones de formateo al crear la instancia con Intl.RelativeTimeFormat
.
- {{jsxref("RelativeTimeFormat.formatToParts", "Intl.RelativeTimeFormat.prototype.formatToParts()")}}
- Devuelve un {{jsxref("Array")}} de objetos representando el tiempo relativo en partes que pueden ser usadas en traducciones.
- {{jsxref("RelativeTimeFormat.resolvedOptions", "Intl.RelativeTimeFormat.prototype.resolvedOptions()")}}
- Devuelve un nuevo objeto con las propiedades que reflejan las opciones de localización y formato usadas durante la inicialización del objeto.
-
-
-Ejemplos
-
-Ejemplo básico
-
-El siguiente ejemplo muestra cómo conseguir el tiempo relativo para el mejor idioma según el usuario.
-
-// Crea un formateador de tiempo relativo en tu lenguaje
-// con los valores por defectos pasados expresamente.
-const rtf = new Intl.RelativeTimeFormat("en", {
- localeMatcher: "best fit", // otros valores: "lookup"
- numeric: "always", // otros valores: "auto"
- style: "long", // otros valores: "short" or "narrow"
-});
-
-// Formatea el tiempo relativo con valores negativos (-1).
-rtf.format(-1, "day");
-// > "Hace 1 día"
-
-// Formatea el tiempo relativo con valores positivos (1).
-rtf.format(1, "day");
-// > "Dentro de 1 día"
-
-
-
-El siguiente ejemplo muestra cómo crear un formateador de tiempo relativo que devuelve las partes separadas:
-
-const rtf = new Intl.RelativeTimeFormat("es", { numeric: "auto" });
-
-// Formatea el tiempo relativo usando día como unidad.
-rtf.formatToParts(-1, "day");
-// > [{ type: "literal", value: "ayer"}]
-
-rtf.formatToParts(100, "day");
-// > [{ type: "literal", value: "Dentro de " },
-// > { type: "integer", value: "100", unit: "day" },
-// > { type: "literal", value: " días" }]
-
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES Int Draft', '#relativetimeformat-objects', 'RelativeTimeFormat')}}
-
-
-
-
-
-
-Compatibilidad en navegadores
-
-
-
-{{Compat("javascript.builtins.Intl.RelativeTimeFormat")}}
-
-Ver también
-
-
diff --git a/files/es/web/javascript/reference/global_objects/intl/relativetimeformat/index.md b/files/es/web/javascript/reference/global_objects/intl/relativetimeformat/index.md
new file mode 100644
index 00000000000000..b326c5e083626c
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/intl/relativetimeformat/index.md
@@ -0,0 +1,89 @@
+---
+title: Intl.RelativeTimeFormat
+slug: Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat
+tags:
+ - RelatimeTimeFormat
+translation_of: Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Intl/RelativeTimeFormat
+---
+{{JSRef}}
+
+El objeto **`Intl.RelativeTimeFormat`** te proporciona una manera de formatear tiempos relativos con traducciones.
+
+{{EmbedInteractiveExample("pages/js/intl-relativetimeformat.html")}}
+
+El código de este ejemplo interactivo está disponible en un repositorio GitHub. Si quieres contribuir a los ejemplos interactivos del proyecto, por favor, clona y manda una Pull Request.
+
+## Constructor
+
+- {{jsxref("RelativeTimeFormat.RelativeTimeFormat()", "Intl.RelativeTimeFormat.RelativeTimeFormat()")}}
+ - : Crea una nueva instancia de `Intl.RelativeTimeFormat`.
+
+## Métodos estáticos
+
+- {{jsxref("RelativeTimeFormat.supportedLocalesOf", "Intl.RelativeTimeFormat.supportedLocalesOf()")}}
+ - : Devuelve un {{jsxref("Array")}} con todos los idiomas disponibles sin necesidad de usar el que hay por defecto.
+
+## Métodos de instancia
+
+- {{jsxref("RelativeTimeFormat.format", "Intl.RelativeTimeFormat.prototype.format()")}}
+ - : Formatea `value` y `unit` conforme al idioma y las opciones de formateo al crear la instancia con [`Intl.RelativeTimeFormat`](/es/docs/Web/JavaScript/Reference/Global_Objects/Intl.RelativeTimeFormat).
+- {{jsxref("RelativeTimeFormat.formatToParts", "Intl.RelativeTimeFormat.prototype.formatToParts()")}}
+ - : Devuelve un {{jsxref("Array")}} de objetos representando el tiempo relativo en partes que pueden ser usadas en traducciones.
+- {{jsxref("RelativeTimeFormat.resolvedOptions", "Intl.RelativeTimeFormat.prototype.resolvedOptions()")}}
+ - : Devuelve un nuevo objeto con las propiedades que reflejan las opciones de localización y formato usadas durante la inicialización del objeto.
+
+## Ejemplos
+
+### Ejemplo básico
+
+El siguiente ejemplo muestra cómo conseguir el tiempo relativo para el mejor idioma según el usuario.
+
+```js
+// Crea un formateador de tiempo relativo en tu lenguaje
+// con los valores por defectos pasados expresamente.
+const rtf = new Intl.RelativeTimeFormat("en", {
+ localeMatcher: "best fit", // otros valores: "lookup"
+ numeric: "always", // otros valores: "auto"
+ style: "long", // otros valores: "short" or "narrow"
+});
+
+// Formatea el tiempo relativo con valores negativos (-1).
+rtf.format(-1, "day");
+// > "Hace 1 día"
+
+// Formatea el tiempo relativo con valores positivos (1).
+rtf.format(1, "day");
+// > "Dentro de 1 día"
+```
+
+### Usando `formatToParts`
+
+El siguiente ejemplo muestra cómo crear un formateador de tiempo relativo que devuelve las partes separadas:
+
+```js
+const rtf = new Intl.RelativeTimeFormat("es", { numeric: "auto" });
+
+// Formatea el tiempo relativo usando día como unidad.
+rtf.formatToParts(-1, "day");
+// > [{ type: "literal", value: "ayer"}]
+
+rtf.formatToParts(100, "day");
+// > [{ type: "literal", value: "Dentro de " },
+// > { type: "integer", value: "100", unit: "day" },
+// > { type: "literal", value: " días" }]
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| ------------------------------------------------------------------------------------------------------------ | ------ | ---------- |
+| {{SpecName('ES Int Draft', '#relativetimeformat-objects', 'RelativeTimeFormat')}} | | |
+
+## Compatibilidad en navegadores
+
+{{Compat("javascript.builtins.Intl.RelativeTimeFormat")}}
+
+## Ver también
+
+- [The Intl.RelativeTimeFormat API](https://developers.google.com/web/updates/2018/10/intl-relativetimeformat)
diff --git a/files/es/web/javascript/reference/global_objects/math/abs/index.html b/files/es/web/javascript/reference/global_objects/math/abs/index.html
deleted file mode 100644
index 29749308b9cd44..00000000000000
--- a/files/es/web/javascript/reference/global_objects/math/abs/index.html
+++ /dev/null
@@ -1,102 +0,0 @@
----
-title: Math.abs()
-slug: Web/JavaScript/Reference/Global_Objects/Math/abs
-tags:
- - JavaScript
- - Math
- - Referencia
- - metodo
-translation_of: Web/JavaScript/Reference/Global_Objects/Math/abs
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Math/abs
----
-{{JSRef}}
-
-La función Math.abs()
retorna el valor absoluto de un número, que es
-
-Math.abs ( x ) = | x | = { x if x > 0 0 if x = 0 - x if x < 0 {\mathtt{\operatorname{Math.abs}(x)}} = {|x|} = \begin{cases} x & \text{if} \quad x \geq 0 \\ -x & \text{if} \quad x < 0 \end{cases}
-
-Sintaxis
-
-Math.abs(x )
-
-Parámetros
-
-
- x
- Un número.
-
- Valor de retorno
-
- El valor absoluto del número dado.
-
-
-
-
-
-Descripción
-
-Como abs()
es un método estático de Math
, deberías siempre usar Math.abs()
, en lugar de un método de un objeto Math
que crees (Math
no es un constructor).
-
-Ejemplos
-
-Comportamiento de Math.abs()
-
-Pasando un string no-numérico o una variable {{jsxref("undefined")}}/empty retorna {{jsxref("NaN")}}. Pasando {{jsxref("null")}} retorna 0.
-
-Math.abs('-1'); // 1
-Math.abs(-2); // 2
-Math.abs(null); // 0
-Math.abs(''); // 0
-
Math.abs([]); // 0
-Math.abs([2]); // 2
-
Math.abs([1,2]); // NaN
-Math.abs({}); // NaN
-Math.abs('string'); // NaN
-Math.abs(); // NaN
-
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES1')}}
- {{Spec2('ES1')}}
- Definición inicial. Implementado en JavaScript 1.0.
-
-
- {{SpecName('ES5.1', '#sec-15.8.2.1', 'Math.abs')}}
- {{Spec2('ES5.1')}}
-
-
-
- {{SpecName('ES6', '#sec-math.abs', 'Math.abs')}}
- {{Spec2('ES6')}}
-
-
-
- {{SpecName('ESDraft', '#sec-math.abs', 'Math.abs')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad en navegadores
-
-{{Compat("javascript.builtins.Math.abs")}}
-
-Ver también
-
-
- {{jsxref("Math.ceil()")}}
- {{jsxref("Math.floor()")}}
- {{jsxref("Math.round()")}}
- {{jsxref("Math.sign()")}} {{experimental_inline}}
- {{jsxref("Math.trunc()")}} {{experimental_inline}}
-
diff --git a/files/es/web/javascript/reference/global_objects/math/abs/index.md b/files/es/web/javascript/reference/global_objects/math/abs/index.md
new file mode 100644
index 00000000000000..7b6bfbcafb97ce
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/math/abs/index.md
@@ -0,0 +1,75 @@
+---
+title: Math.abs()
+slug: Web/JavaScript/Reference/Global_Objects/Math/abs
+tags:
+ - JavaScript
+ - Math
+ - Referencia
+ - metodo
+translation_of: Web/JavaScript/Reference/Global_Objects/Math/abs
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Math/abs
+---
+{{JSRef}}
+
+La función **`Math.abs()`** retorna el valor absoluto de un número, que es
+
+Math.abs ( x ) = | x | = { x if x > 0 0 if x = 0 - x if x < 0 {\mathtt{\operatorname{Math.abs}(x)}} = {|x|} = \begin{cases} x & \text{if} \quad x \geq 0 \\ -x & \text{if} \quad x < 0 \end{cases}
+
+## Sintaxis
+
+```
+Math.abs(x)
+```
+
+### Parámetros
+
+- `x`
+ - : Un número.
+
+### Valor de retorno
+
+El valor absoluto del número dado.
+
+## Descripción
+
+Como `abs()` es un método estático de `Math`, deberías siempre usar `Math.abs()`, en lugar de un método de un objeto `Math` que crees (`Math` no es un constructor).
+
+## Ejemplos
+
+### Comportamiento de `Math.abs()`
+
+Pasando un string no-numérico o una variable {{jsxref("undefined")}}/empty retorna {{jsxref("NaN")}}. Pasando {{jsxref("null")}} retorna 0.
+
+```js
+Math.abs('-1'); // 1
+Math.abs(-2); // 2
+Math.abs(null); // 0
+Math.abs(''); // 0
+Math.abs([]); // 0
+Math.abs([2]); // 2
+Math.abs([1,2]); // NaN
+Math.abs({}); // NaN
+Math.abs('string'); // NaN
+Math.abs(); // NaN
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| -------------------------------------------------------------------- | ---------------------------- | --------------------------------------------------- |
+| {{SpecName('ES1')}} | {{Spec2('ES1')}} | Definición inicial. Implementado en JavaScript 1.0. |
+| {{SpecName('ES5.1', '#sec-15.8.2.1', 'Math.abs')}} | {{Spec2('ES5.1')}} | |
+| {{SpecName('ES6', '#sec-math.abs', 'Math.abs')}} | {{Spec2('ES6')}} | |
+| {{SpecName('ESDraft', '#sec-math.abs', 'Math.abs')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad en navegadores
+
+{{Compat("javascript.builtins.Math.abs")}}
+
+## Ver también
+
+- {{jsxref("Math.ceil()")}}
+- {{jsxref("Math.floor()")}}
+- {{jsxref("Math.round()")}}
+- {{jsxref("Math.sign()")}} {{experimental_inline}}
+- {{jsxref("Math.trunc()")}} {{experimental_inline}}
diff --git a/files/es/web/javascript/reference/global_objects/math/atan/index.html b/files/es/web/javascript/reference/global_objects/math/atan/index.html
deleted file mode 100644
index 19467da4d566ec..00000000000000
--- a/files/es/web/javascript/reference/global_objects/math/atan/index.html
+++ /dev/null
@@ -1,108 +0,0 @@
----
-title: Math.atan()
-slug: Web/JavaScript/Reference/Global_Objects/Math/atan
-tags:
- - JavaScript
- - Matemática
- - Math
- - Method
- - Trigonometría
-translation_of: Web/JavaScript/Reference/Global_Objects/Math/atan
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Math/atan
----
-{{JSRef}}
-
-La función Math.atan()
retorna el arcotangente (en radianes) de un number, esto es
-
-Math.atan ( x ) = arctan ( x ) = el único y ∊ [ - π 2 ; π 2 ] tal que tan ( y ) = x \mathtt{\operatorname{Math.atan}(x)} = \arctan(x) = \text{ the unique } \; y \in \left[-\frac{\pi}{2}; \frac{\pi}{2}\right] \, \text{such that} \; \tan(y) = x
-
-{{EmbedInteractiveExample("pages/js/math-atan.html")}}
-
-La fuente para este ejemplo interactivo se encuentra almacenado en un repositorio de GitHub. Si quieres contribuir al proyecto de ejemplos interactivos, por favor clona el repositorio que hay en este link: https://github.com/mdn/interactive-examples ; y envíanos una pull request .
-
-Sintaxis
-
-Math.atan(x )
-
-Parámetros
-
-
- x
- Un número.
-
-
-Valor de retorno
-
-El arcotangente (en radianes) de el número dado.
-
-Descripción
-
-El método Math.atan()
retorna un valor numérico entre - π 2 -\frac{\pi}{2} y π 2 \frac{\pi}{2} radianes.
-
-Dado que atan()
es un método estático de Math
, siempre debes usarlo como Math.atan()
, y no como un método de un objeto Math
que hayas creado (Math
no es un constructor).
-
-Ejemplos
-
-Usando Math.atan()
-
-Math.atan(1); // 0.7853981633974483
-Math.atan(0); // 0
-Math.atan(-0); // -0
-
-Math.atan(Infinity); // 1.5707963267948966
-Math.atan(-Infinity); // -1.5707963267948966
-
- // El ángulo que la línea [(0,0);(x,y)] forma con el eje-x en un sistema de coordenadas Cartesianas.
-Math.atan(y / x);
-
-
-Nota que podrías querer evitar usar ± Infinity
por razones de estilo. En este caso, {{jsxref("Math.atan2()")}} con 0
como segundo argumento puede ser una mejor solución.
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES1')}}
- {{Spec2('ES1')}}
- Definición inicial. Implementada en JavaScript 1.0.
-
-
- {{SpecName('ES5.1', '#sec-15.8.2.4', 'Math.atan')}}
- {{Spec2('ES5.1')}}
-
-
-
- {{SpecName('ES6', '#sec-math.atan', 'Math.atan')}}
- {{Spec2('ES6')}}
-
-
-
- {{SpecName('ESDraft', '#sec-math.atan', 'Math.atan')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad con el navegador
-
-
-
-{{Compat("javascript.builtins.Math.atan")}}
-
-Ver también
-
-
- {{jsxref("Math.acos()")}}
- {{jsxref("Math.asin()")}}
- {{jsxref("Math.atan2()")}}
- {{jsxref("Math.cos()")}}
- {{jsxref("Math.sin()")}}
- {{jsxref("Math.tan()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/math/atan/index.md b/files/es/web/javascript/reference/global_objects/math/atan/index.md
new file mode 100644
index 00000000000000..8bcac923959928
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/math/atan/index.md
@@ -0,0 +1,82 @@
+---
+title: Math.atan()
+slug: Web/JavaScript/Reference/Global_Objects/Math/atan
+tags:
+ - JavaScript
+ - Matemática
+ - Math
+ - Method
+ - Trigonometría
+translation_of: Web/JavaScript/Reference/Global_Objects/Math/atan
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Math/atan
+---
+{{JSRef}}
+
+La función **`Math.atan()`** retorna el arcotangente (en radianes) de un number, esto es
+
+Math.atan ( x ) = arctan ( x ) = el único y ∊ [ - π 2 ; π 2 ] tal que tan ( y ) = x \mathtt{\operatorname{Math.atan}(x)} = \arctan(x) = \text{ the unique } \; y \in \left[-\frac{\pi}{2}; \frac{\pi}{2}\right] \, \text{such that} \; \tan(y) = x
+
+{{EmbedInteractiveExample("pages/js/math-atan.html")}}
+
+La fuente para este ejemplo interactivo se encuentra almacenado en un repositorio de GitHub. Si quieres contribuir al proyecto de ejemplos interactivos, por favor clona el repositorio que hay en este link: ; y envíanos una _pull request_.
+
+## Sintaxis
+
+```
+Math.atan(x)
+```
+
+### Parámetros
+
+- `x`
+ - : Un número.
+
+### Valor de retorno
+
+El arcotangente (en radianes) de el número dado.
+
+## Descripción
+
+El método `Math.atan()` retorna un valor numérico entre - π 2 -\frac{\pi}{2} y π 2 \frac{\pi}{2} radianes.
+
+Dado que `atan()` es un método estático de `Math`, siempre debes usarlo como `Math.atan()`, y no como un método de un objeto `Math` que hayas creado (`Math` no es un constructor).
+
+## Ejemplos
+
+### Usando `Math.atan()`
+
+```js
+Math.atan(1); // 0.7853981633974483
+Math.atan(0); // 0
+Math.atan(-0); // -0
+
+Math.atan(Infinity); // 1.5707963267948966
+Math.atan(-Infinity); // -1.5707963267948966
+
+// El ángulo que la línea [(0,0);(x,y)] forma con el eje-x en un sistema de coordenadas Cartesianas.
+Math.atan(y / x);
+```
+
+Nota que podrías querer evitar usar **±**`Infinity` por razones de estilo. En este caso, {{jsxref("Math.atan2()")}} con `0` como segundo argumento puede ser una mejor solución.
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| ------------------------------------------------------------------------ | ---------------------------- | --------------------------------------------------- |
+| {{SpecName('ES1')}} | {{Spec2('ES1')}} | Definición inicial. Implementada en JavaScript 1.0. |
+| {{SpecName('ES5.1', '#sec-15.8.2.4', 'Math.atan')}} | {{Spec2('ES5.1')}} | |
+| {{SpecName('ES6', '#sec-math.atan', 'Math.atan')}} | {{Spec2('ES6')}} | |
+| {{SpecName('ESDraft', '#sec-math.atan', 'Math.atan')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad con el navegador
+
+{{Compat("javascript.builtins.Math.atan")}}
+
+## Ver también
+
+- {{jsxref("Math.acos()")}}
+- {{jsxref("Math.asin()")}}
+- {{jsxref("Math.atan2()")}}
+- {{jsxref("Math.cos()")}}
+- {{jsxref("Math.sin()")}}
+- {{jsxref("Math.tan()")}}
diff --git a/files/es/web/javascript/reference/global_objects/math/cbrt/index.html b/files/es/web/javascript/reference/global_objects/math/cbrt/index.html
deleted file mode 100644
index 6018ed49838107..00000000000000
--- a/files/es/web/javascript/reference/global_objects/math/cbrt/index.html
+++ /dev/null
@@ -1,97 +0,0 @@
----
-title: Math.cbrt()
-slug: Web/JavaScript/Reference/Global_Objects/Math/cbrt
-translation_of: Web/JavaScript/Reference/Global_Objects/Math/cbrt
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Math/cbrt
----
-{{JSRef}}
-
-La función Math.cbrt()
nos retorna la raíz del cubo del numero, eso es
-
-M a t h . c b r t ( x ) = x 3 = the unique y such that y 3 = x \mathtt{Math.cbrt(x)} = \sqrt[3]{x} = \text{un unico} \; y \; \text{de tal manera que} \; y^3 = x
-
-{{EmbedInteractiveExample("pages/js/math-cbrt.html")}}
-
-The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone
https://github.com/mdn/interactive-examples and send us a pull request.
-
-Sintaxis
-
-Math.cbrt(x )
-
-Parametros
-
-
- x
- Un numero
-
-
-Valor retornado
-
-La raíz cubica del numero proporcionado
-
-Descripción
-
-Al cbrt()
ser un metodo estatico de Math
, tu siempre la puedes usar como Math.cbrt()
,un metodo de Math
que es un objeto que se crea (Math
no es un constructor).
-
-
-
-Para x ≥ 0 x \geq 0 , tenemos x 3 = x 1 / 3 \sqrt[3]{x} = x^{1/3} esto puede ser emulado con la siguiente función:
-
-if (!Math.cbrt) {
- Math.cbrt = (function(pow) {
- return function cbrt(x){
- // Esto asegura que numeros negativos sigan siendo negativos
- return x < 0 ? -pow(-x, 1/3) : pow(x, 1/3);
- };
- })(Math.pow); // Localiza Math.pow para una mayor eficiencía
-}
-
-
-Ejemplos
-
-Usando Math.cbrt()
-
-Math.cbrt(NaN); // NaN
-Math.cbrt(-1); // -1
-Math.cbrt(-0); // -0
-Math.cbrt(-Infinity); // -Infinito
-Math.cbrt(0); // 0
-Math.cbrt(1); // 1
-Math.cbrt(Infinity); // Infinito
-Math.cbrt(null); // 0
-Math.cbrt(2); // 1.2599210498948732
-
-
-Especificaciones
-
-
-
-
- Especificación
-
-
-
-
- {{SpecName('ESDraft', '#sec-math.cbrt', 'Math.cbrt')}}
-
-
-
-
-Compatibilidad
-
-
-
-
-
-
-
-and send us a pull request.
-
-{{Compat("javascript.builtins.Math.cbrt")}}
-
-Puedes leer
-
-
diff --git a/files/es/web/javascript/reference/global_objects/math/cbrt/index.md b/files/es/web/javascript/reference/global_objects/math/cbrt/index.md
new file mode 100644
index 00000000000000..92257affb41493
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/math/cbrt/index.md
@@ -0,0 +1,80 @@
+---
+title: Math.cbrt()
+slug: Web/JavaScript/Reference/Global_Objects/Math/cbrt
+translation_of: Web/JavaScript/Reference/Global_Objects/Math/cbrt
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Math/cbrt
+---
+{{JSRef}}
+
+La función **`Math.cbrt()`** nos retorna la raíz del cubo del numero, eso es
+
+M a t h . c b r t ( x ) = x 3 = the unique y such that y 3 = x \mathtt{Math.cbrt(x)} = \sqrt[3]{x} = \text{un unico} \; y \; \text{de tal manera que} \; y^3 = x
+
+{{EmbedInteractiveExample("pages/js/math-cbrt.html")}}The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone and send us a pull request.
+
+## Sintaxis
+
+```
+Math.cbrt(x)
+```
+
+### Parametros
+
+- _x_
+ - : Un numero
+
+### Valor retornado
+
+La raíz cubica del numero proporcionado
+
+## Descripción
+
+Al `cbrt()` ser un metodo estatico de `Math`, tu siempre la puedes usar como `Math.cbrt()`,un metodo de `Math` que es un objeto que se crea (`Math` no es un constructor).
+
+## Poliformismo
+
+Para x ≥ 0 x \geq 0 , tenemos x 3 = x 1 / 3 \sqrt[3]{x} = x^{1/3} esto puede ser emulado con la siguiente función:
+
+```js
+if (!Math.cbrt) {
+ Math.cbrt = (function(pow) {
+ return function cbrt(x){
+ // Esto asegura que numeros negativos sigan siendo negativos
+ return x < 0 ? -pow(-x, 1/3) : pow(x, 1/3);
+ };
+ })(Math.pow); // Localiza Math.pow para una mayor eficiencía
+}
+```
+
+## Ejemplos
+
+### Usando Math.cbrt()
+
+```js
+Math.cbrt(NaN); // NaN
+Math.cbrt(-1); // -1
+Math.cbrt(-0); // -0
+Math.cbrt(-Infinity); // -Infinito
+Math.cbrt(0); // 0
+Math.cbrt(1); // 1
+Math.cbrt(Infinity); // Infinito
+Math.cbrt(null); // 0
+Math.cbrt(2); // 1.2599210498948732
+```
+
+## Especificaciones
+
+| Especificación |
+| ------------------------------------------------------------------------ |
+| {{SpecName('ESDraft', '#sec-math.cbrt', 'Math.cbrt')}} |
+
+## Compatibilidad
+
+[and send us a pull request.](https://github.com/mdn/browser-compat-data)
+
+[{{Compat("javascript.builtins.Math.cbrt")}}](https://github.com/mdn/browser-compat-data)
+
+## Puedes leer
+
+- [{{jsxref("Math.pow()")}}](https://github.com/mdn/browser-compat-data)
+- [{{jsxref("Math.sqrt()")}}](https://github.com/mdn/browser-compat-data)
diff --git a/files/es/web/javascript/reference/global_objects/math/cos/index.html b/files/es/web/javascript/reference/global_objects/math/cos/index.html
deleted file mode 100644
index 1644e27d86541e..00000000000000
--- a/files/es/web/javascript/reference/global_objects/math/cos/index.html
+++ /dev/null
@@ -1,75 +0,0 @@
----
-title: Math.cos()
-slug: Web/JavaScript/Reference/Global_Objects/Math/cos
-translation_of: Web/JavaScript/Reference/Global_Objects/Math/cos
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Math/cos
----
-{{JSRef}}
-
-La función estática Math.cos()
devuelve el coseno del ángulo especificado, que debe ser especificado en radianes . Este valor es longitud adyacente longitud hipotenusa .
-
-{{EmbedInteractiveExample("pages/js/math-cos.html")}}
-
-El código fuente de este ejemplo interactivo está almacenado en un repositorio de GitHub. Si te gustaría contribuir con el proyecto de ejemplos interactivos, por favor clona https://github.com/mdn/interactive-examples y envíanos un pull request.
-
-Sintaxis
-
-Math.cos(x )
-
-Parametros
-
-
- x
- El ángulo en radianes por el cual devolverá el coseno.
-
-
-Valor de retorno
-
-El coseno del número dado.
-
-Descripción
-
-El método Math.cos()
retorna un valor numérico entre -1 y 1, que representa el coseno del ángulo.
-
-Debido a que cos()
es un método estático de Math
, siempre debes utilizarlo como Math.cos()
, en lugar de como un método de un objeto Math
que hayas creado (Math
no es un constructor).
-
-Ejemplos
-
-Usando Math.cos()
-
-Math.cos(0); // 1
-Math.cos(1); // 0.5403023058681398
-
-Math.cos(Math.PI); // -1
-Math.cos(2 * Math.PI); // 1
-
-
-Especificaciones
-
-
-
-
- Especificación
-
-
- {{SpecName('ESDraft', '#sec-math.cos', 'Math.cos')}}
-
-
-
-
-Compatibilidad de navegadores
-
-
-
-{{Compat("javascript.builtins.Math.cos")}}
-
-Ver también
-
-
- {{jsxref("Math.acos()")}}
- {{jsxref("Math.asin()")}}
- {{jsxref("Math.atan()")}}
- {{jsxref("Math.atan2()")}}
- {{jsxref("Math.sin()")}}
- {{jsxref("Math.tan()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/math/cos/index.md b/files/es/web/javascript/reference/global_objects/math/cos/index.md
new file mode 100644
index 00000000000000..e0595cc4244db8
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/math/cos/index.md
@@ -0,0 +1,65 @@
+---
+title: Math.cos()
+slug: Web/JavaScript/Reference/Global_Objects/Math/cos
+translation_of: Web/JavaScript/Reference/Global_Objects/Math/cos
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Math/cos
+---
+{{JSRef}}
+
+La función estática **`Math.cos()`** devuelve el [coseno](https://es.wikipedia.org/wiki/Coseno) del ángulo especificado, que debe ser especificado en [radianes](https://es.wikipedia.org/wiki/Radi%C3%A1n). Este valor es longitud adyacente longitud hipotenusa .
+
+{{EmbedInteractiveExample("pages/js/math-cos.html")}}
+
+El código fuente de este ejemplo interactivo está almacenado en un repositorio de GitHub. Si te gustaría contribuir con el proyecto de ejemplos interactivos, por favor clona y envíanos un pull request.
+
+## Sintaxis
+
+```
+Math.cos(x)
+```
+
+### Parametros
+
+- `x`
+ - : El ángulo en radianes por el cual devolverá el coseno.
+
+### Valor de retorno
+
+El coseno del número dado.
+
+## Descripción
+
+El método `Math.cos()` retorna un valor numérico entre -1 y 1, que representa el coseno del ángulo.
+
+Debido a que `cos()` es un método estático de `Math`, siempre debes utilizarlo como `Math.cos()`, en lugar de como un método de un objeto `Math` que hayas creado (`Math` no es un constructor).
+
+## Ejemplos
+
+### Usando `Math.cos()`
+
+```js
+Math.cos(0); // 1
+Math.cos(1); // 0.5403023058681398
+
+Math.cos(Math.PI); // -1
+Math.cos(2 * Math.PI); // 1
+```
+
+## Especificaciones
+
+| Especificación |
+| -------------------------------------------------------------------- |
+| {{SpecName('ESDraft', '#sec-math.cos', 'Math.cos')}} |
+
+## Compatibilidad de navegadores
+
+{{Compat("javascript.builtins.Math.cos")}}
+
+## Ver también
+
+- {{jsxref("Math.acos()")}}
+- {{jsxref("Math.asin()")}}
+- {{jsxref("Math.atan()")}}
+- {{jsxref("Math.atan2()")}}
+- {{jsxref("Math.sin()")}}
+- {{jsxref("Math.tan()")}}
diff --git a/files/es/web/javascript/reference/global_objects/math/expm1/index.html b/files/es/web/javascript/reference/global_objects/math/expm1/index.html
deleted file mode 100644
index fadb33b6c43da3..00000000000000
--- a/files/es/web/javascript/reference/global_objects/math/expm1/index.html
+++ /dev/null
@@ -1,90 +0,0 @@
----
-title: Math.expm1()
-slug: Web/JavaScript/Reference/Global_Objects/Math/expm1
-tags:
- - JavaScript
- - Matemáticas
- - Math
- - Method
- - Referencia
- - metodo
-translation_of: Web/JavaScript/Reference/Global_Objects/Math/expm1
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Math/expm1
----
-{{JSRef}}
-
-La función Math.expm1()
regresa ex - 1
, donde x
es el argumento, y {{jsxref("Math.E", "e", "", 1)}} la base del logaritmo natural.
-
-{{EmbedInteractiveExample("pages/js/math-expm1.html")}}
-
-El código para este ejemplo interactivo está almacenado en un repositorio de GitHub. Sí te gustaría contribuir al proyecto de ejemplos interactivos If you'd like to contribute, por favor clona
https://github.com/mdn/interactive-examples y envíanos un pull request.
-
-Sintaxis
-
-Math.expm1(x )
-
-Parámetos
-
-
- x
- Un número.
-
-
-Valor de retorno
-
-Un número representando ex - 1
, donde e
es {{jsxref("Math.E", "Número de Euler", "", 1)}} y x
es el argumento.
-
-Descripción
-
-Debido a que expm1()
es un método estático de Math
, uselo siempre como Math.expm1()
, en lugar de como un método del objeto Math
que creó (Math
no es un constructor).
-
-Ejemplos
-
-Usando Math.expm1()
-
-Math.expm1(-1); // -0.6321205588285577
-Math.expm1(0); // 0
-Math.expm1(1); // 1.718281828459045
-
-
-Polyfill
-
-Esto puede ser emulado con la ayuda de la función {{jsxref("Math.exp()")}}:
-
-Math.expm1 = Math.expm1 || function(x) {
- return Math.exp(x) - 1;
-};
-
-
-Especificaciones
-
-
-
-
- Especificación
-
-
-
-
- {{SpecName('ESDraft', '#sec-math.expm1', 'Math.expm1')}}
-
-
-
-
-Compatibilidad de navegadores
-
-
-
-{{Compat("javascript.builtins.Math.expm1")}}
-
-Vea también
-
-
- {{jsxref("Math.E")}}
- {{jsxref("Math.exp()")}}
- {{jsxref("Math.log()")}}
- {{jsxref("Math.log10()")}}
- {{jsxref("Math.log1p()")}}
- {{jsxref("Math.log2()")}}
- {{jsxref("Math.pow()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/math/expm1/index.md b/files/es/web/javascript/reference/global_objects/math/expm1/index.md
new file mode 100644
index 00000000000000..1a6e8cbe943196
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/math/expm1/index.md
@@ -0,0 +1,77 @@
+---
+title: Math.expm1()
+slug: Web/JavaScript/Reference/Global_Objects/Math/expm1
+tags:
+ - JavaScript
+ - Matemáticas
+ - Math
+ - Method
+ - Referencia
+ - metodo
+translation_of: Web/JavaScript/Reference/Global_Objects/Math/expm1
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Math/expm1
+---
+{{JSRef}}
+
+La función **`Math.expm1()`** regresa `ex - 1`, donde `x` es el argumento, y {{jsxref("Math.E", "e", "", 1)}} la base del logaritmo natural.
+
+{{EmbedInteractiveExample("pages/js/math-expm1.html")}}El código para este ejemplo interactivo está almacenado en un repositorio de GitHub. Sí te gustaría contribuir al proyecto de ejemplos interactivos If you'd like to contribute, por favor clona y envíanos un pull request.
+
+## Sintaxis
+
+```
+Math.expm1(x)
+```
+
+### Parámetos
+
+- `x`
+ - : Un número.
+
+### Valor de retorno
+
+Un número representando `ex - 1`, donde `e` es {{jsxref("Math.E", "Número de Euler", "", 1)}} y `x` es el argumento.
+
+## Descripción
+
+Debido a que `expm1()` es un método estático de `Math`, uselo siempre como `Math.expm1()`, en lugar de como un método del objeto `Math` que creó (`Math` no es un constructor).
+
+## Ejemplos
+
+### Usando Math.expm1()
+
+```js
+Math.expm1(-1); // -0.6321205588285577
+Math.expm1(0); // 0
+Math.expm1(1); // 1.718281828459045
+```
+
+## Polyfill
+
+Esto puede ser emulado con la ayuda de la función {{jsxref("Math.exp()")}}:
+
+```js
+Math.expm1 = Math.expm1 || function(x) {
+ return Math.exp(x) - 1;
+};
+```
+
+## Especificaciones
+
+| Especificación |
+| ---------------------------------------------------------------------------- |
+| {{SpecName('ESDraft', '#sec-math.expm1', 'Math.expm1')}} |
+
+## Compatibilidad de navegadores
+
+{{Compat("javascript.builtins.Math.expm1")}}
+
+## Vea también
+
+- {{jsxref("Math.E")}}
+- {{jsxref("Math.exp()")}}
+- {{jsxref("Math.log()")}}
+- {{jsxref("Math.log10()")}}
+- {{jsxref("Math.log1p()")}}
+- {{jsxref("Math.log2()")}}
+- {{jsxref("Math.pow()")}}
diff --git a/files/es/web/javascript/reference/global_objects/math/round/index.html b/files/es/web/javascript/reference/global_objects/math/round/index.md
similarity index 51%
rename from files/es/web/javascript/reference/global_objects/math/round/index.html
rename to files/es/web/javascript/reference/global_objects/math/round/index.md
index 08379815ec9800..71f4fbae22f690 100644
--- a/files/es/web/javascript/reference/global_objects/math/round/index.html
+++ b/files/es/web/javascript/reference/global_objects/math/round/index.md
@@ -4,41 +4,38 @@
translation_of: Web/JavaScript/Reference/Global_Objects/Math/round
original_slug: Web/JavaScript/Referencia/Objetos_globales/Math/round
---
-{{JSRef}}
+{{JSRef}}La función **`Math.round()`**`retorna el valor de un número redondeado al entero más cercano.`
-La función Math.round()
retorna el valor de un número redondeado al entero más cercano.
+## Sumario
-Sumario
+Devuelve el valor del número dado redondeado al entero más cercano.
-Devuelve el valor del número dado redondeado al entero más cercano.
+## Sintaxis
-Sintaxis
+```
+Math.round(x)
+```
-Math.round(x )
+### Parámetros
-Parámetros
+Un número.
-
- Un número.
-
+### Valor de Retorno
-Valor de Retorno
+El valor del número dado redondeado al entero más cercano.
-
- El valor del número dado redondeado al entero más cercano.
-
+## Descripción
-Descripción
+Si la porción fraccionaría del número es 0.5 o mayor, el argumento es redondeado al siguiente número entero superior. Si la porción de la fracción del número es menor a 0.5, el argumento es redondeado al siguiente número entero inferior.
-Si la porción fraccionaría del número es 0.5 o mayor, el argumento es redondeado al siguiente número entero superior. Si la porción de la fracción del número es menor a 0.5, el argumento es redondeado al siguiente número entero inferior.
+Debido a que round() es un método estático de Math, siempre se debe utilizar como Math.round(), en vez de un método del objeto Math que ha creado. (Math no es un constructor)
-Debido a que round() es un método estático de Math, siempre se debe utilizar como Math.round(), en vez de un método del objeto Math que ha creado. (Math no es un constructor)
+## Ejemplos
-Ejemplos
+### Usando `Math.round()`
-Usando Math.round()
-
-// Retorna el valor 20
+```js
+// Retorna el valor 20
x = Math.round(20.49);
// Retorna el valor 21
@@ -54,11 +51,12 @@ Usando Math.round()
// Note el error de redondeo debido a la inexactitud del punto aritmético.
// Compare esto con Math.round10(1.005, -2) de el ejemplo de abajo.
x = Math.round(1.005*100)/100;
-
+```
-Redondeo decimal
+### Redondeo decimal
-// Conclusión
+```js
+// Conclusión
(function() {
/**
* Ajuste decimal de un número.
@@ -76,7 +74,7 @@ Redondeo decimal
value = +value;
exp = +exp;
// Si el valor no es un número o el exp no es un entero...
- if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) {
+ if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) {
return NaN;
}
// Shift
@@ -127,47 +125,24 @@ Redondeo decimal
Math.ceil10(51, 1); // 60
Math.ceil10(-55.59, -1); // -55.5
Math.ceil10(-59, 1); // -50
-
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES1')}}
- {{Spec2('ES1')}}
-
- Definición inicial. Implementada en JavaScript 1.0.
-
-
-
- {{SpecName('ES5.1', '#sec-15.8.2.15', 'Math.round')}}
- {{Spec2('ES5.1')}}
-
-
-
- {{SpecName('ES6', '#sec-math.round', 'Math.round')}}
- {{Spec2('ES6')}}
-
-
-
-
-
-Compatibilidad en navegadores
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| ------------------------------------------------------------------------ | ------------------------ | --------------------------------------------------- |
+| {{SpecName('ES1')}} | {{Spec2('ES1')}} | Definición inicial. Implementada en JavaScript 1.0. |
+| {{SpecName('ES5.1', '#sec-15.8.2.15', 'Math.round')}} | {{Spec2('ES5.1')}} | |
+| {{SpecName('ES6', '#sec-math.round', 'Math.round')}} | {{Spec2('ES6')}} | |
+
+## Compatibilidad en navegadores
{{Compat("javascript.builtins.Math.round")}}
-Véase también
+## Véase también
-
- {{jsxref("Math.abs()")}}
- {{jsxref("Math.ceil()")}}
- {{jsxref("Math.floor()")}}
- {{jsxref("Math.sign()")}} {{experimental_inline}}
- {{jsxref("Math.trunc()")}} {{experimental_inline}}
-
+- {{jsxref("Math.abs()")}}
+- {{jsxref("Math.ceil()")}}
+- {{jsxref("Math.floor()")}}
+- {{jsxref("Math.sign()")}} {{experimental_inline}}
+- {{jsxref("Math.trunc()")}} {{experimental_inline}}
diff --git a/files/es/web/javascript/reference/global_objects/math/tan/index.html b/files/es/web/javascript/reference/global_objects/math/tan/index.html
deleted file mode 100644
index a31a90eb18a4e0..00000000000000
--- a/files/es/web/javascript/reference/global_objects/math/tan/index.html
+++ /dev/null
@@ -1,83 +0,0 @@
----
-title: Math.tan()
-slug: Web/JavaScript/Reference/Global_Objects/Math/tan
-tags:
- - Matemáticas
- - Referencia
- - metodo
-translation_of: Web/JavaScript/Reference/Global_Objects/Math/tan
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Math/tan
----
-{{JSRef}}
-
-La función Math.tan()
retorna la tangente de un número.
-
-{{EmbedInteractiveExample("pages/js/math-tan.html")}}
-
-La fuente para este ejemplo interactivo se encuentra almacenada en un repositorio de GitHub. Si quieres contribuir al proyecto de ejemplos interactivos, por favor, clona el repositorio en este link: https://github.com/mdn/interactive-examples y envíanos un Pull Request .
-
-Sintaxis
-
-Math.tan(x )
-
-Parámetros
-
-
- x
- Un número que representa un ángulo en radianes.
-
-
-Valor de retorno
-
-La tangente del número proporcionado.
-
-Descripción
-
-El método Math.tan()
retorna un valor numérico que representa la tangente de un ángulo.
-
-Dado que tan()
es un método estático de Math
, siempre debes usarlo como Math.tan()
, y no como un método de un objeto Math
que hayas creado (Math
no es un constructor).
-
-Ejemplos
-
-Usando Math.tan()
-
-Math.tan(1); // 1.5574077246549023
-
-
-Ya que la función Math.tan()
acepta radianes, pero es más fácil trabajar con grados, la siguiente función acepta un valor en grados, lo convierte a radianes, y retorna la tangente de dicho valor.
-
-function getTanDeg(deg) {
- var rad = deg * Math.PI/180;
- return Math.tan(rad);
-}
-
-
-Especificaciones
-
-
-
-
- Especificación
-
-
- {{SpecName('ESDraft', '#sec-math.tan', 'Math.tan')}}
-
-
-
-
-Compatibilidad con el navegador
-
-
-
-{{Compat("javascript.builtins.Math.tan")}}
-
-Ver también
-
-
- {{jsxref("Math.acos()")}}
- {{jsxref("Math.asin()")}}
- {{jsxref("Math.atan()")}}
- {{jsxref("Math.atan2()")}}
- {{jsxref("Math.cos()")}}
- {{jsxref("Math.sin()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/math/tan/index.md b/files/es/web/javascript/reference/global_objects/math/tan/index.md
new file mode 100644
index 00000000000000..a64a045d848105
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/math/tan/index.md
@@ -0,0 +1,74 @@
+---
+title: Math.tan()
+slug: Web/JavaScript/Reference/Global_Objects/Math/tan
+tags:
+ - Matemáticas
+ - Referencia
+ - metodo
+translation_of: Web/JavaScript/Reference/Global_Objects/Math/tan
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Math/tan
+---
+{{JSRef}}
+
+La función **`Math.tan()`** retorna la tangente de un número.
+
+{{EmbedInteractiveExample("pages/js/math-tan.html")}}
+
+La fuente para este ejemplo interactivo se encuentra almacenada en un repositorio de GitHub. Si quieres contribuir al proyecto de ejemplos interactivos, por favor, clona el repositorio en este link: y envíanos un _Pull Request_.
+
+## Sintaxis
+
+```
+Math.tan(x)
+```
+
+### Parámetros
+
+- `x`
+ - : Un número que representa un ángulo en radianes.
+
+### Valor de retorno
+
+La tangente del número proporcionado.
+
+## Descripción
+
+El método `Math.tan()` retorna un valor numérico que representa la tangente de un ángulo.
+
+Dado que `tan()` es un método estático de `Math`, siempre debes usarlo como `Math.tan()`, y no como un método de un objeto `Math` que hayas creado (`Math` no es un constructor).
+
+## Ejemplos
+
+### Usando `Math.tan()`
+
+```js
+Math.tan(1); // 1.5574077246549023
+```
+
+Ya que la función `Math.tan()` acepta radianes, pero es más fácil trabajar con grados, la siguiente función acepta un valor en grados, lo convierte a radianes, y retorna la tangente de dicho valor.
+
+```js
+function getTanDeg(deg) {
+ var rad = deg * Math.PI/180;
+ return Math.tan(rad);
+}
+```
+
+## Especificaciones
+
+| Especificación |
+| -------------------------------------------------------------------- |
+| {{SpecName('ESDraft', '#sec-math.tan', 'Math.tan')}} |
+
+## Compatibilidad con el navegador
+
+{{Compat("javascript.builtins.Math.tan")}}
+
+## Ver también
+
+- {{jsxref("Math.acos()")}}
+- {{jsxref("Math.asin()")}}
+- {{jsxref("Math.atan()")}}
+- {{jsxref("Math.atan2()")}}
+- {{jsxref("Math.cos()")}}
+- {{jsxref("Math.sin()")}}
diff --git a/files/es/web/javascript/reference/global_objects/number/max_safe_integer/index.html b/files/es/web/javascript/reference/global_objects/number/max_safe_integer/index.html
deleted file mode 100644
index 1c019c309feda8..00000000000000
--- a/files/es/web/javascript/reference/global_objects/number/max_safe_integer/index.html
+++ /dev/null
@@ -1,69 +0,0 @@
----
-title: Number.MAX_SAFE_INTEGER
-slug: Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER
-tags:
- - ECMAScript 2015
- - JavaScript
- - Number
- - Property
-translation_of: Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Number/MAX_SAFE_INTEGER
----
-{{JSRef}}
-
-La constante Number.MAX_SAFE_INTEGER
es el número mas grande 'seguro' en JavaScript (253 - 1
).
-
-{{EmbedInteractiveExample("pages/js/number-maxsafeinteger.html")}}
-
-La fuente de este ejemplo interactivo está almacenada en GitHub. Si quieres contribuir al proyecto de ejmplos interactivos, por favor clona https://github.com/mdn/interactive-examples y envíanos un 'pull request'.
-
-{{js_property_attributes(0, 0, 0)}}
-
-Descripción
-
-La constante MAX_SAFE_INTEGER
tiene un valor de 9007199254740991
(9,007,199,254,740,991 o ~9 mil billones). El razonamiento detrás de ese número es que JavaScript usa números flotantes de doble precisión tal como está especfificado en IEEE 754 por lo que puedes representar números de forma segura entre -(253 - 1)
y 253 - 1
.
-
-Seguro, en este contexto, se refiere a la habilidad de representar enteros de forma exacta y compararlos de forma correcta. Por ejemplo, Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2
evaluará como 'verdadero', lo cual es matemáticamente incorrecto. Ver {{jsxref("Number.isSafeInteger()")}} para más información.
-
-Debido a que MAX_SAFE_INTEGER
es una propiedad estática de {{jsxref("Number")}}, siempre se usa como Number.MAX_SAFE_INTEGER
, en lugar de como una propiedad de un objeto {{jsxref("Number")}} que hayas creado.
-
-Ejemplos
-
-Number.MAX_SAFE_INTEGER // 9007199254740991
-Math.pow(2, 53) - 1 // 9007199254740991
-
-
-Especificaciones
-
-
-
-
- Especificación
- Estatus
- Comentario
-
-
- {{SpecName('ES2015', '#sec-number.max_safe_integer', 'Number.MAX_SAFE_INTEGER')}}
- {{Spec2('ES2015')}}
- Definición inicial.
-
-
- {{SpecName('ESDraft', '#sec-number.max_safe_integer', 'Number.MAX_SAFE_INTEGER')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad con navegadores
-
-
-
-{{Compat("javascript.builtins.Number.MAX_SAFE_INTEGER")}}
-
-Ver también
-
-
- {{jsxref("Number.MIN_SAFE_INTEGER")}}
- {{jsxref("Number.isSafeInteger()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/number/max_safe_integer/index.md b/files/es/web/javascript/reference/global_objects/number/max_safe_integer/index.md
new file mode 100644
index 00000000000000..65e012a0b6c4bd
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/number/max_safe_integer/index.md
@@ -0,0 +1,51 @@
+---
+title: Number.MAX_SAFE_INTEGER
+slug: Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER
+tags:
+ - ECMAScript 2015
+ - JavaScript
+ - Number
+ - Property
+translation_of: Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Number/MAX_SAFE_INTEGER
+---
+{{JSRef}}
+
+La constante **`Number.MAX_SAFE_INTEGER`** es el número mas grande 'seguro' en JavaScript (`253 - 1`).
+
+{{EmbedInteractiveExample("pages/js/number-maxsafeinteger.html")}}
+
+La fuente de este ejemplo interactivo está almacenada en GitHub. Si quieres contribuir al proyecto de ejmplos interactivos, por favor clona y envíanos un 'pull request'.
+
+{{js_property_attributes(0, 0, 0)}}
+
+## Descripción
+
+La constante `MAX_SAFE_INTEGER` tiene un valor de `9007199254740991` (9,007,199,254,740,991 o \~9 mil billones). El razonamiento detrás de ese número es que JavaScript usa [números flotantes de doble precisión](http://en.wikipedia.org/wiki/Double_precision_floating-point_format) tal como está especfificado en [IEEE 754](http://en.wikipedia.org/wiki/IEEE_floating_point) por lo que puedes representar números de forma segura entre `-(253 - 1)` y `253 - 1`.
+
+Seguro, en este contexto, se refiere a la habilidad de representar enteros de forma exacta y compararlos de forma correcta. Por ejemplo, `Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2` evaluará como 'verdadero', lo cual es matemáticamente incorrecto. Ver {{jsxref("Number.isSafeInteger()")}} para más información.
+
+Debido a que `MAX_SAFE_INTEGER` es una propiedad estática de {{jsxref("Number")}}, siempre se usa como `Number.MAX_SAFE_INTEGER`, en lugar de como una propiedad de un objeto {{jsxref("Number")}} que hayas creado.
+
+## Ejemplos
+
+```js
+Number.MAX_SAFE_INTEGER // 9007199254740991
+Math.pow(2, 53) - 1 // 9007199254740991
+```
+
+## Especificaciones
+
+| Especificación | Estatus | Comentario |
+| ------------------------------------------------------------------------------------------------------------ | ---------------------------- | ------------------- |
+| {{SpecName('ES2015', '#sec-number.max_safe_integer', 'Number.MAX_SAFE_INTEGER')}} | {{Spec2('ES2015')}} | Definición inicial. |
+| {{SpecName('ESDraft', '#sec-number.max_safe_integer', 'Number.MAX_SAFE_INTEGER')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad con navegadores
+
+{{Compat("javascript.builtins.Number.MAX_SAFE_INTEGER")}}
+
+## Ver también
+
+- {{jsxref("Number.MIN_SAFE_INTEGER")}}
+- {{jsxref("Number.isSafeInteger()")}}
diff --git a/files/es/web/javascript/reference/global_objects/object/__definegetter__/index.html b/files/es/web/javascript/reference/global_objects/object/__definegetter__/index.html
deleted file mode 100644
index bede01e00fc20c..00000000000000
--- a/files/es/web/javascript/reference/global_objects/object/__definegetter__/index.html
+++ /dev/null
@@ -1,97 +0,0 @@
----
-title: Object.prototype.__defineGetter__()
-slug: Web/JavaScript/Reference/Global_Objects/Object/__defineGetter__
-tags:
- - JavaScript
- - Objeto
- - Prototipo
- - Prototype
- - metodo
-translation_of: Web/JavaScript/Reference/Global_Objects/Object/__defineGetter__
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Object/__defineGetter__
----
-{{JSRef}}
-
-
-
Esta característica está obsoleta en favor de definir getters usando el object initializer syntax o la API {{jsxref("Object.defineProperty()")}}.
-
-
En todo caso, como es ampliamente implementada y usada en la Web, es poco probable que los navegadores dejen de implementarla.
-
-
-El método __defineGetter__
enlaza una propiedad de un objeto a una función a ser llamada cuando esa propiedad es buscada.
-
-Sintaxis
-
-obj .__defineGetter__(prop , func )
-
-Parámetros
-
-
- prop
- Un texto (string) que contiene el nombre de la propiedad para enlazar la función dada.
- func
- A function to be bound to a lookup of the specified property.
-
-
-Descripción
-
-The __defineGetter__
allows a {{jsxref("Operators/get", "getter", "", 1)}} to be defined on a pre-existing object.
-
-Ejemplos
-
-// Forma no-estándar y obsoleta
-
-var o = {};
-o.__defineGetter__('gimmeFive', function() { return 5; });
-console.log(o.gimmeFive); // 5
-
-
-// Formas compatibles con el estándar
-
-// Usando el operador get
-var o = { get gimmeFive() { return 5; } };
-console.log(o.gimmeFive); // 5
-
-// Usando Object.defineProperty
-var o = {};
-Object.defineProperty(o, 'gimmeFive', {
- get: function() {
- return 5;
- }
-});
-console.log(o.gimmeFive); // 5
-
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('JavaScript', '#object.prototype.__definegetter__', 'Object.prototype.__defineGetter__()')}}
- {{Spec2('JavaScript')}}
-
-
-
-
-
-Compatibilidad de navegadores
-
-{{Compat("javascript.builtins.Object.defineGetter")}}
-
-Mira también
-
-
diff --git a/files/es/web/javascript/reference/global_objects/object/__definegetter__/index.md b/files/es/web/javascript/reference/global_objects/object/__definegetter__/index.md
new file mode 100644
index 00000000000000..894bdeba4958df
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/object/__definegetter__/index.md
@@ -0,0 +1,83 @@
+---
+title: Object.prototype.__defineGetter__()
+slug: Web/JavaScript/Reference/Global_Objects/Object/__defineGetter__
+tags:
+ - JavaScript
+ - Objeto
+ - Prototipo
+ - Prototype
+ - metodo
+translation_of: Web/JavaScript/Reference/Global_Objects/Object/__defineGetter__
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Object/__defineGetter__
+---
+{{JSRef}}
+
+> **Advertencia:** Esta característica está obsoleta en favor de definir getters usando el [object initializer syntax](/es/docs/Web/JavaScript/Reference/Operators/Object_initializer) o la API {{jsxref("Object.defineProperty()")}}.
+>
+> En todo caso, como es ampliamente implementada y usada en la Web, es poco probable que los navegadores dejen de implementarla.
+
+El método **`__defineGetter__`** enlaza una propiedad de un objeto a una función a ser llamada cuando esa propiedad es buscada.
+
+## Sintaxis
+
+```
+obj.__defineGetter__(prop, func)
+```
+
+### Parámetros
+
+- `prop`
+ - : Un texto (string) que contiene el nombre de la propiedad para enlazar la función dada.
+- `func`
+ - : A function to be bound to a lookup of the specified property.
+
+## Descripción
+
+The `__defineGetter__` allows a {{jsxref("Operators/get", "getter", "", 1)}} to be defined on a pre-existing object.
+
+## Ejemplos
+
+```js
+// Forma no-estándar y obsoleta
+
+var o = {};
+o.__defineGetter__('gimmeFive', function() { return 5; });
+console.log(o.gimmeFive); // 5
+
+
+// Formas compatibles con el estándar
+
+// Usando el operador get
+var o = { get gimmeFive() { return 5; } };
+console.log(o.gimmeFive); // 5
+
+// Usando Object.defineProperty
+var o = {};
+Object.defineProperty(o, 'gimmeFive', {
+ get: function() {
+ return 5;
+ }
+});
+console.log(o.gimmeFive); // 5
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| ---------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | ---------- |
+| {{SpecName('JavaScript', '#object.prototype.__definegetter__', 'Object.prototype.__defineGetter__()')}} | {{Spec2('JavaScript')}} | |
+
+## Compatibilidad de navegadores
+
+{{Compat("javascript.builtins.Object.defineGetter")}}
+
+## Mira también
+
+- {{jsxref("Object.prototype.__defineSetter__()")}}
+- {{jsxref("Operators/get", "get")}} operator
+- {{jsxref("Object.defineProperty()")}}
+- {{jsxref("Object.prototype.__lookupGetter__()")}}
+- {{jsxref("Object.prototype.__lookupSetter__()")}}
+- [JS Guide: Defining Getters and Setters](/es/docs/Web/JavaScript/Guide/Working_with_Objects#Defining_getters_and_setters)
+- [\[Blog Post\] Deprecation of \_\_defineGetter\_\_ and \_\_defineSetter\_\_](http://whereswalden.com/2010/04/16/more-spidermonkey-changes-ancient-esoteric-very-rarely-used-syntax-for-creating-getters-and-setters-is-being-removed/)
+- {{bug(647423)}}
diff --git a/files/es/web/javascript/reference/global_objects/object/defineproperties/index.html b/files/es/web/javascript/reference/global_objects/object/defineproperties/index.html
deleted file mode 100644
index 551dc4e2e445c9..00000000000000
--- a/files/es/web/javascript/reference/global_objects/object/defineproperties/index.html
+++ /dev/null
@@ -1,149 +0,0 @@
----
-title: Object.defineProperties()
-slug: Web/JavaScript/Reference/Global_Objects/Object/defineProperties
-tags:
- - ECMAScript5
- - JavaScript
- - JavaScript 1.8.5
- - Método(2)
- - Objeto
-translation_of: Web/JavaScript/Reference/Global_Objects/Object/defineProperties
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Object/defineProperties
----
-{{JSRef("Objetos_globales", "Object")}}
-
-Sumario
-
-El metodo Object.defineProperties()
define nuevas o modifica propiedades existentes directamente en el objeto, retornando el objeto.
-
-Sintáxis
-
-Object.defineProperties(obj , propiedades )
-
-Parámetros
-
-
- obj
- El objeto sobre el cual se crearán o modificaran sus propiedades.
- propiedades
- Un objeto cuyas propiedades enumerables propias consituyen descriptores para las propiedades a ser definidas o modificadas.
-
-
-Descripción
-
-Object.defineProperties
, en escencia, define todas las propiedades correspondientes a las propiedades propias con capacidad de enumeración de props
en el objeto objrops.
-
-Ejemplo
-
-Object.defineProperties(obj, {
- "property1": {
- value: true,
- writable: true
- },
- "property2": {
- value: "Hello",
- writable: false
- }
- // etc. etc.
-});
-
-Polyfill
-
-Asumiendo una ejecución pristina del entorno con todos los nombres y propiedades referidas a sus valores iniciales, Object.defineProperties
es casi completamente equivalente (note el comentario en isCallable
) a la siguiente reimplementación de JavaScript:
-
-function defineProperties(obj, properties) {
- function convertToDescriptor(desc) {
- function hasProperty(obj, prop) {
- return Object.prototype.hasOwnProperty.call(obj, prop);
- }
-
- function isCallable(v) {
- // NB: modify as necessary if other values than functions are callable.
- return typeof v === "function";
- }
-
- if (typeof desc !== "object" || desc === null)
- throw new TypeError("bad desc");
-
- var d = {};
-
- if (hasProperty(desc, "enumerable"))
- d.enumerable = !!obj.enumerable;
- if (hasProperty(desc, "configurable"))
- d.configurable = !!obj.configurable;
- if (hasProperty(desc, "value"))
- d.value = obj.value;
- if (hasProperty(desc, "writable"))
- d.writable = !!desc.writable;
- if ( hasProperty(desc, "get") ) {
- var g = desc.get;
-
- if (!isCallable(g) && g !== "undefined")
- throw new TypeError("bad get");
- d.get = g;
- }
- if ( hasProperty(desc, "set") ) {
- var s = desc.set;
- if (!isCallable(s) && s !== "undefined")
- throw new TypeError("bad set");
- d.set = s;
- }
-
- if (("get" in d || "set" in d) && ("value" in d || "writable" in d))
- throw new TypeError("identity-confused descriptor");
-
- return d;
- }
-
- if (typeof obj !== "object" || obj === null)
- throw new TypeError("bad obj");
-
- properties = Object(properties);
-
- var keys = Object.keys(properties);
- var descs = [];
-
- for (var i = 0; i < keys.length; i++)
- descs.push([keys[i], convertToDescriptor(properties[keys[i]])]);
-
- for (var i = 0; i < descs.length; i++)
- Object.defineProperty(obj, descs[i][0], descs[i][1]);
-
- return obj;
-}
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES5.1', '#sec-15.2.3.7', 'Object.defineProperties')}}
- {{Spec2('ES5.1')}}
- Definición inicial. Implementada en JavaScript 1.8.5
-
-
- {{SpecName('ES6', '#sec-object.defineproperties', 'Object.defineProperties')}}
- {{Spec2('ES6')}}
-
-
-
-
-
-Compatibilidad de navegadores
-
-Basado en Kangax's compat tables .
-
-{{Compat("javascript.builtins.Object.defineProperties")}}
-
-Ver también
-
-
diff --git a/files/es/web/javascript/reference/global_objects/object/defineproperties/index.md b/files/es/web/javascript/reference/global_objects/object/defineproperties/index.md
new file mode 100644
index 00000000000000..8b963f9e72c401
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/object/defineproperties/index.md
@@ -0,0 +1,136 @@
+---
+title: Object.defineProperties()
+slug: Web/JavaScript/Reference/Global_Objects/Object/defineProperties
+tags:
+ - ECMAScript5
+ - JavaScript
+ - JavaScript 1.8.5
+ - Método(2)
+ - Objeto
+translation_of: Web/JavaScript/Reference/Global_Objects/Object/defineProperties
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Object/defineProperties
+---
+{{JSRef("Objetos_globales", "Object")}}
+
+## Sumario
+
+El metodo **`Object.defineProperties()`** define nuevas o modifica propiedades existentes directamente en el objeto, retornando el objeto.
+
+## Sintáxis
+
+```
+Object.defineProperties(obj, propiedades)
+```
+
+### Parámetros
+
+- obj
+ - : El objeto sobre el cual se crearán o modificaran sus propiedades.
+- propiedades
+ - : Un objeto cuyas propiedades enumerables propias consituyen descriptores para las propiedades a ser definidas o modificadas.
+
+## Descripción
+
+`Object.defineProperties`, en escencia, define todas las propiedades correspondientes a las propiedades propias con capacidad de enumeración de `props` en el objeto `objrops.`
+
+## Ejemplo
+
+```js
+Object.defineProperties(obj, {
+ "property1": {
+ value: true,
+ writable: true
+ },
+ "property2": {
+ value: "Hello",
+ writable: false
+ }
+ // etc. etc.
+});
+```
+
+## Polyfill
+
+Asumiendo una ejecución pristina del entorno con todos los nombres y propiedades referidas a sus valores iniciales, `Object.defineProperties` es casi completamente equivalente (note el comentario en `isCallable`) a la siguiente reimplementación de JavaScript:
+
+```
+function defineProperties(obj, properties) {
+ function convertToDescriptor(desc) {
+ function hasProperty(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+ }
+
+ function isCallable(v) {
+ // NB: modify as necessary if other values than functions are callable.
+ return typeof v === "function";
+ }
+
+ if (typeof desc !== "object" || desc === null)
+ throw new TypeError("bad desc");
+
+ var d = {};
+
+ if (hasProperty(desc, "enumerable"))
+ d.enumerable = !!obj.enumerable;
+ if (hasProperty(desc, "configurable"))
+ d.configurable = !!obj.configurable;
+ if (hasProperty(desc, "value"))
+ d.value = obj.value;
+ if (hasProperty(desc, "writable"))
+ d.writable = !!desc.writable;
+ if ( hasProperty(desc, "get") ) {
+ var g = desc.get;
+
+ if (!isCallable(g) && g !== "undefined")
+ throw new TypeError("bad get");
+ d.get = g;
+ }
+ if ( hasProperty(desc, "set") ) {
+ var s = desc.set;
+ if (!isCallable(s) && s !== "undefined")
+ throw new TypeError("bad set");
+ d.set = s;
+ }
+
+ if (("get" in d || "set" in d) && ("value" in d || "writable" in d))
+ throw new TypeError("identity-confused descriptor");
+
+ return d;
+ }
+
+ if (typeof obj !== "object" || obj === null)
+ throw new TypeError("bad obj");
+
+ properties = Object(properties);
+
+ var keys = Object.keys(properties);
+ var descs = [];
+
+ for (var i = 0; i < keys.length; i++)
+ descs.push([keys[i], convertToDescriptor(properties[keys[i]])]);
+
+ for (var i = 0; i < descs.length; i++)
+ Object.defineProperty(obj, descs[i][0], descs[i][1]);
+
+ return obj;
+}
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| -------------------------------------------------------------------------------------------------------- | ------------------------ | ---------------------------------------------------- |
+| {{SpecName('ES5.1', '#sec-15.2.3.7', 'Object.defineProperties')}} | {{Spec2('ES5.1')}} | Definición inicial. Implementada en JavaScript 1.8.5 |
+| {{SpecName('ES6', '#sec-object.defineproperties', 'Object.defineProperties')}} | {{Spec2('ES6')}} | |
+
+## Compatibilidad de navegadores
+
+Basado en [Kangax's compat tables](http://kangax.github.com/es5-compat-table/).
+
+{{Compat("javascript.builtins.Object.defineProperties")}}
+
+## Ver también
+
+- {{jsxref("Object.defineProperty()")}}
+- {{jsxref("Object.keys()")}}
+- [Enumerability and ownership of properties](/es/docs/Enumerability_and_ownership_of_properties)
diff --git a/files/es/web/javascript/reference/global_objects/object/freeze/index.html b/files/es/web/javascript/reference/global_objects/object/freeze/index.html
deleted file mode 100644
index d63098985f3870..00000000000000
--- a/files/es/web/javascript/reference/global_objects/object/freeze/index.html
+++ /dev/null
@@ -1,175 +0,0 @@
----
-title: Object.freeze()
-slug: Web/JavaScript/Reference/Global_Objects/Object/freeze
-translation_of: Web/JavaScript/Reference/Global_Objects/Object/freeze
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Object/freeze
----
-{{JSRef}}
-
-El método Object.freeze()
congela un objeto, es decir: impide que se le agreguen nuevas propiedades; impide que se puedan eliminar las propiedades ya existentes; impide que dichas propiedades, o su capacidad de enumeración, configuración, o escritura, puedan ser modificadas; impide también que se pueda modificar su prototipo. El método devuelve el objeto recibido.
-
-{{EmbedInteractiveExample("pages/js/object-freeze.html")}}
-
-El código de este ejemplo interactivo está almacenado en un repositorio de GitHub. Si quieres contribuir al proyecto de ejemplos interactivos, puedes clonar https://github.com/mdn/interactive-examples y enviarnos un pull request .
-
-Sintaxis
-
-Object.freeze(obj )
-
-Parámetros
-
-
- obj
- El objeto a congelar .
-
-
-Valor devuelto
-
-El mismo objeto
-
-Descripción
-
-Nada puede ser agregado o removido de las propiedades establecidas de un objeto congelado . Cualquier intento de hacerlo fallará, ya sea de manera silenciosa o arrojando una excepción {{jsxref("TypeError")}} (más comunmente, pero no exclusivamente, en {{jsxref("Strict_mode", "strict mode", "", 1)}}).
-
-Los valores no pueden ser cambiados por propiedades de datos. Propiedades de acceso (getters y setters ) funcionan igual (y aún dan la ilusión de que estas cambiando el valor). Note que los valores que son objetos aún pueden ser modificados, a menos que esten congelados tambien.
-
-La función retorna el mismo objeto pasado en ella, no crea una copia congelada
-
-Ejemplos
-
-Congelando Objetos
-
-var obj = {
- prop: function() {},
- foo: 'bar'
-};
-
-// Nuevas propiedades pueden ser agregadas,
-// propiedades existentes pueden cambiar o removerse
-obj.foo = 'baz';
-obj.lumpy = 'woof';
-delete obj.prop;
-
-// Ambos, el objeto pasado como argumento tanto como el que se regresa
-// serán congelados
-// Es innecesario salvar el objeto que es regresado en orden de congelar
-// el original.
-var o = Object.freeze(obj);
-
-assert(Object.isFrozen(obj) === true);
-
-// Ahora cualquier cambio fallará
-obj.foo = 'quux'; // No hace nada de manera silenciosa
-obj.quaxxor = 'the friendly duck'; // No agrega una nueva propiedad, de manera silenciosa
-
-// ...y en modo estrico tal intento arrojará TypeErrors
-function fail(){
- 'use strict';
- obj.foo = 'sparky'; // arroja un TypeError
- delete obj.quaxxor; // arroja un TypeError
- obj.sparky = 'arf'; // arroja un TypeError
-}
-
-fail();
-
-// Los intentos utilizando Object.defineProperty tambien arrojarán una excepción...
-Object.defineProperty(obj, 'ohai', { value: 17 }); // arroja un TypeError
-Object.defineProperty(obj, 'foo', { value: 'eit' }); // arroja un TypeError
-
-// Es imposible cambiar un prototipo
-// Estos ejemplos retornan un error TypeError
-Object.setPrototype(obj,{x:20})
-obj.__proto__ = {x:20}
-
-
-El siguiente ejemplo muestra que los valores de objetos en un objeto congelado pueden ser mutados (la congelación es superficial).
-
-obj1 = {
- internal: {}
-};
-
-Object.freeze(obj1);
-obj1.internal.a = 'aValue';
-
-obj1.internal.a // 'aValue'
-
-// Para hacer obj completamente inmutable, congelamos cada objeto en obj.
-// Para hacerlo, usamos esta función.
-function deepFreeze(obj) {
-
- // Recuperamos el nombre de las propiedades en obj
- var propNames = Object.getOwnPropertyNames(obj);
-
- // Congelamos las propiedades antes de congelar a obj
- propNames.forEach(function(name) {
- var prop = obj[name];
-
- // Si la propiedad es un objeto, llamaremos a deepFreezze para que congele las propiedades de ese objeto
- if (typeof prop == 'object' && prop !== null && !Object.isFrozen(prop))
- deepFreeze(prop);
- });
-
- // congelamos a obj
- return Object.freeze(obj);
-}
-
-obj2 = {
- internal: {}
-};
-
-deepFreeze(obj2);
-obj2.internal.a = 'anotherValue';
-obj2.internal.a; // undefined
-
-
-Notas
-
-En ES5, si el argumento pasado a este método no es un objeto (un primitivo), entonces causará un {{jsxref("TypeError")}}. En ES6, un argumento no-objeto será tratado como si fuera un objeto congelado cualquiera, simplemente lo regresa.
-
-> Object.freeze(1)
-TypeError: 1 is not an object // Código ES5
-
-> Object.freeze(1)
-1 // Código ES6
-
-
-Especificaciones
-
-
-
-
- Specification
- Status
- Comment
-
-
- {{SpecName('ES5.1', '#sec-15.2.3.9', 'Object.freeze')}}
- {{Spec2('ES5.1')}}
- Definición inicial. Implementado en JavaScript 1.8.5.
-
-
- {{SpecName('ES6', '#sec-object.freeze', 'Object.freeze')}}
- {{Spec2('ES6')}}
-
-
-
- {{SpecName('ESDraft', '#sec-object.freeze', 'Object.freeze')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad de navegadores
-
-{{Compat("javascript.builtins.Object.freeze")}}
-
-Mira también
-
-
- {{jsxref("Object.isFrozen()")}}
- {{jsxref("Object.preventExtensions()")}}
- {{jsxref("Object.isExtensible()")}}
- {{jsxref("Object.seal()")}}
- {{jsxref("Object.isSealed()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/object/freeze/index.md b/files/es/web/javascript/reference/global_objects/object/freeze/index.md
new file mode 100644
index 00000000000000..2652f0b5771469
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/object/freeze/index.md
@@ -0,0 +1,157 @@
+---
+title: Object.freeze()
+slug: Web/JavaScript/Reference/Global_Objects/Object/freeze
+translation_of: Web/JavaScript/Reference/Global_Objects/Object/freeze
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Object/freeze
+---
+{{JSRef}}
+
+El método **`Object.freeze()`** _congela_ un objeto, es decir: impide que se le agreguen nuevas propiedades; impide que se puedan eliminar las propiedades ya existentes; impide que dichas propiedades, o su capacidad de enumeración, configuración, o escritura, puedan ser modificadas; impide también que se pueda modificar su prototipo. El método devuelve el objeto recibido.
+
+{{EmbedInteractiveExample("pages/js/object-freeze.html")}}
+
+El código de este ejemplo interactivo está almacenado en un repositorio de GitHub. Si quieres contribuir al proyecto de ejemplos interactivos, puedes clonar y enviarnos un _pull request_.
+
+## Sintaxis
+
+```
+Object.freeze(obj)
+```
+
+### Parámetros
+
+- `obj`
+ - : El objeto a _congelar_.
+
+### Valor devuelto
+
+El mismo objeto
+
+## Descripción
+
+Nada puede ser agregado o removido de las propiedades establecidas de un objeto _congelado_. Cualquier intento de hacerlo fallará, ya sea de manera silenciosa o _arrojando una excepción_ {{jsxref("TypeError")}} (más comunmente, pero no exclusivamente, en {{jsxref("Strict_mode", "strict mode", "", 1)}}).
+
+Los valores no pueden ser cambiados por propiedades de datos. Propiedades de acceso (_getters_ y _setters_) funcionan igual (y aún dan la ilusión de que estas cambiando el valor). Note que los valores que son objetos aún pueden ser modificados, a menos que esten _congelados_ tambien.
+
+La función retorna el mismo objeto pasado en ella, no crea una copia _congelada_
+
+## Ejemplos
+
+### Congelando Objetos
+
+```js
+var obj = {
+ prop: function() {},
+ foo: 'bar'
+};
+
+// Nuevas propiedades pueden ser agregadas,
+// propiedades existentes pueden cambiar o removerse
+obj.foo = 'baz';
+obj.lumpy = 'woof';
+delete obj.prop;
+
+// Ambos, el objeto pasado como argumento tanto como el que se regresa
+// serán congelados
+// Es innecesario salvar el objeto que es regresado en orden de congelar
+// el original.
+var o = Object.freeze(obj);
+
+assert(Object.isFrozen(obj) === true);
+
+// Ahora cualquier cambio fallará
+obj.foo = 'quux'; // No hace nada de manera silenciosa
+obj.quaxxor = 'the friendly duck'; // No agrega una nueva propiedad, de manera silenciosa
+
+// ...y en modo estrico tal intento arrojará TypeErrors
+function fail(){
+ 'use strict';
+ obj.foo = 'sparky'; // arroja un TypeError
+ delete obj.quaxxor; // arroja un TypeError
+ obj.sparky = 'arf'; // arroja un TypeError
+}
+
+fail();
+
+// Los intentos utilizando Object.defineProperty tambien arrojarán una excepción...
+Object.defineProperty(obj, 'ohai', { value: 17 }); // arroja un TypeError
+Object.defineProperty(obj, 'foo', { value: 'eit' }); // arroja un TypeError
+
+// Es imposible cambiar un prototipo
+// Estos ejemplos retornan un error TypeError
+Object.setPrototype(obj,{x:20})
+obj.__proto__ = {x:20}
+```
+
+El siguiente ejemplo muestra que los valores de objetos en un objeto congelado pueden ser mutados (la congelación es superficial).
+
+```js
+obj1 = {
+ internal: {}
+};
+
+Object.freeze(obj1);
+obj1.internal.a = 'aValue';
+
+obj1.internal.a // 'aValue'
+
+// Para hacer obj completamente inmutable, congelamos cada objeto en obj.
+// Para hacerlo, usamos esta función.
+function deepFreeze(obj) {
+
+ // Recuperamos el nombre de las propiedades en obj
+ var propNames = Object.getOwnPropertyNames(obj);
+
+ // Congelamos las propiedades antes de congelar a obj
+ propNames.forEach(function(name) {
+ var prop = obj[name];
+
+ // Si la propiedad es un objeto, llamaremos a deepFreezze para que congele las propiedades de ese objeto
+ if (typeof prop == 'object' && prop !== null && !Object.isFrozen(prop))
+ deepFreeze(prop);
+ });
+
+ // congelamos a obj
+ return Object.freeze(obj);
+}
+
+obj2 = {
+ internal: {}
+};
+
+deepFreeze(obj2);
+obj2.internal.a = 'anotherValue';
+obj2.internal.a; // undefined
+```
+
+## Notas
+
+En ES5, si el argumento pasado a este método no es un objeto (un primitivo), entonces causará un {{jsxref("TypeError")}}. En ES6, un argumento no-objeto será tratado como si fuera un objeto _congelado_ cualquiera, simplemente lo regresa.
+
+```js
+> Object.freeze(1)
+TypeError: 1 is not an object // Código ES5
+
+> Object.freeze(1)
+1 // Código ES6
+```
+
+## Especificaciones
+
+| Specification | Status | Comment |
+| ------------------------------------------------------------------------------------ | ---------------------------- | ----------------------------------------------------- |
+| {{SpecName('ES5.1', '#sec-15.2.3.9', 'Object.freeze')}} | {{Spec2('ES5.1')}} | Definición inicial. Implementado en JavaScript 1.8.5. |
+| {{SpecName('ES6', '#sec-object.freeze', 'Object.freeze')}} | {{Spec2('ES6')}} | |
+| {{SpecName('ESDraft', '#sec-object.freeze', 'Object.freeze')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad de navegadores
+
+{{Compat("javascript.builtins.Object.freeze")}}
+
+## Mira también
+
+- {{jsxref("Object.isFrozen()")}}
+- {{jsxref("Object.preventExtensions()")}}
+- {{jsxref("Object.isExtensible()")}}
+- {{jsxref("Object.seal()")}}
+- {{jsxref("Object.isSealed()")}}
diff --git a/files/es/web/javascript/reference/global_objects/promise/reject/index.html b/files/es/web/javascript/reference/global_objects/promise/reject/index.html
deleted file mode 100644
index f68c55ee0982c4..00000000000000
--- a/files/es/web/javascript/reference/global_objects/promise/reject/index.html
+++ /dev/null
@@ -1,81 +0,0 @@
----
-title: Promise.reject()
-slug: Web/JavaScript/Reference/Global_Objects/Promise/reject
-translation_of: Web/JavaScript/Reference/Global_Objects/Promise/reject
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Promise/reject
----
-{{JSRef}}
-
-El método Promise.reject(reason)
retorna un objeto Promise
que es rechazado por la razón específicada.
-
-{{EmbedInteractiveExample("pages/js/promise-reject.html")}}
-
-La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si desea contribuir al proyecto de ejemplos interactivos, clone https://github.com/mdn/interactive-examples y envíenos una solicitud de extracción.
-
-La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si desea contribuir al proyecto de ejemplos interactivos, clone https://github.com/mdn/interactive-examples y envíenos una solicitud de extracción.
-
-La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si desea contribuir al proyecto de ejemplos interactivos, clone https://github.com/mdn/interactive-examples y envíenos una solicitud de extracción.
-
-Sintaxis
-
-Promise.reject(reason) ;
-
-Parámetros
-
-
- reason
- Razón por la cual esta {jsxref("Promise")}} fue rechazada.
-
-
-Return value
-
-Un objeto {{jsxref("Promise")}} que es rechazado por la razón específicada.
-
-Descripción
-
-La función estática Promise.reject
retorna un objecto {{jsxref("Promise")}} que es rechazado. Para fines de depuración y captura selectiva de error, se suele pasar por el parámetro reason
un instanceof
{{jsxref("Error")}}.
-
-Ejemplos
-
-Usando el método estático Promise.reject()
-
-Promise.reject(new Error('fail')).then(function() {
- // no entra en esta función
-}, function(error) {
- console.log(error); // Stacktrace
-});
-
-Especificaciones
-
-
-
-
- Specification
- Status
- Comment
-
-
- {{SpecName('ES2015', '#sec-promise.reject', 'Promise.reject')}}
- {{Spec2('ES2015')}}
- Initial definition in an ECMA standard.
-
-
- {{SpecName('ESDraft', '#sec-promise.reject', 'Promise.reject')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Browser compatibility
-
-
-
-{{Compat("javascript.builtins.Promise.reject")}}
-
-Ver también
-
-
diff --git a/files/es/web/javascript/reference/global_objects/promise/reject/index.md b/files/es/web/javascript/reference/global_objects/promise/reject/index.md
new file mode 100644
index 00000000000000..3db2404444cfdb
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/promise/reject/index.md
@@ -0,0 +1,59 @@
+---
+title: Promise.reject()
+slug: Web/JavaScript/Reference/Global_Objects/Promise/reject
+translation_of: Web/JavaScript/Reference/Global_Objects/Promise/reject
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Promise/reject
+---
+{{JSRef}}
+
+El método **`Promise.reject(reason)`** retorna un objeto `Promise` que es rechazado por la razón específicada.
+
+{{EmbedInteractiveExample("pages/js/promise-reject.html")}}
+
+
+## Sintaxis
+
+```
+Promise.reject(reason);
+```
+
+### Parámetros
+
+- reason
+ - : Razón por la cual esta {jsxref("Promise")}} fue rechazada.
+
+### Return value
+
+Un objeto {{jsxref("Promise")}} que es rechazado por la razón específicada.
+
+## Descripción
+
+La función estática `Promise.reject` retorna un objecto {{jsxref("Promise")}} que es rechazado. Para fines de depuración y captura selectiva de error, se suele pasar por el parámetro `reason` un `instanceof` {{jsxref("Error")}}.
+
+## Ejemplos
+
+### Usando el método estático Promise.reject()
+
+```js
+Promise.reject(new Error('fail')).then(function() {
+ // no entra en esta función
+}, function(error) {
+ console.log(error); // Stacktrace
+});
+```
+
+## Especificaciones
+
+| Specification | Status | Comment |
+| ------------------------------------------------------------------------------------ | ---------------------------- | --------------------------------------- |
+| {{SpecName('ES2015', '#sec-promise.reject', 'Promise.reject')}} | {{Spec2('ES2015')}} | Initial definition in an ECMA standard. |
+| {{SpecName('ESDraft', '#sec-promise.reject', 'Promise.reject')}} | {{Spec2('ESDraft')}} | |
+
+## Browser compatibility
+
+{{Compat("javascript.builtins.Promise.reject")}}
+
+## Ver también
+
+- {{jsxref("Promise")}}
+- [Selective error catching using the BlueBird Promise library](https://github.com/petkaantonov/bluebird#error-handling)
diff --git a/files/es/web/javascript/reference/global_objects/promise/resolve/index.html b/files/es/web/javascript/reference/global_objects/promise/resolve/index.html
deleted file mode 100644
index 12a09567903a44..00000000000000
--- a/files/es/web/javascript/reference/global_objects/promise/resolve/index.html
+++ /dev/null
@@ -1,151 +0,0 @@
----
-title: Promise.resolve()
-slug: Web/JavaScript/Reference/Global_Objects/Promise/resolve
-tags:
- - ECMAScript 2015
- - JavaScript
- - Promise
- - metodo
-translation_of: Web/JavaScript/Reference/Global_Objects/Promise/resolve
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Promise/resolve
----
-{{JSRef}}
-
-El método Promise.resolve(value)
retorna un objeto {{jsxref("Promise")}} que es resuelto con el valor dado. Si el valor es una promise , esa promise es devuelta; si el valor es un thenable (si tiene un {{jsxref("Promise.then", "método \"then\"")}}), el valor devuelto le seguirá a ese thenable , adoptando su estado; de otro modo la promise devuelta estará completada con el valor.
-
-{{EmbedInteractiveExample("pages/js/promise-resolve.html")}}
-
-La fuente para esta demostración interactiva se encuentra en un repositorio de GitHub. Si te gustaría contribuir al proyecto de la demostración interactiva, por favor clona https://github.com/mdn/interactive-examples y envíanos una pull request .
-
-Sintáxis
-
-Promise.resolve(value);
-Promise.resolve(promise);
-Promise.resolve(thenable);
-
-
-Parámetros
-
-
- value
- Argumento por resolver por esta Promise
. También puede ser una Promise
o un thenable por resolver.
-
-
-Valor retornado
-
-Una {{jsxref("Promise")}} que es resuelta con el valor dado, o con la promise pasada como valor, si el valor era un objeto promise .
-
-Descripción
-
-La función estática Promise.resolve
retorna una Promise
que es resuelta.
-
-Ejemplos
-
-Utilizando el método estático Promise.resolve
-
-Promise.resolve('Éxito').then(function(value) {
- console.log(value); // "Éxito"
-}, function(value) {
- // no es llamada
-});
-
-
-Resolviendo un arreglo
-
-var p = Promise.resolve([1,2,3]);
-p.then(function(v) {
- console.log(v[0]); // 1
-});
-
-Resolviendo otra Promise
-
-var original = Promise.resolve(33);
-var cast = Promise.resolve(original);
-cast.then(function(value) {
- console.log('valor: ' + value);
-});
-console.log('original === cast ? ' + (original === cast));
-
-// registros, en orden:
-// original === cast ? true
-// valor: 33
-
-
-El orden invertido de los registros se debe al hecho de que los handler then
sean llamados asíncronamente. Vea cómo funciona then
aquí .
-
-Resolviendo thenables y arrojando Errores
-
-// Resolviendo un objeto thenable
-var p1 = Promise.resolve({
- then: function(onFulfill, onReject) { onFulfill('¡Completada!'); }
-});
-console.log(p1 instanceof Promise) // true, objeto convertido en una Promise
-j
-p1.then(function(v) {
- console.log(v); // "¡Completada!"
- }, function(e) {
- // no es llamada
-});
-
-// Thenable arroja antes del callback
-// Rechaza la Promise
-var thenable = { then: function(resolve) {
- throw new TypeError('Arrojando');
- resolve('Resolviendo');
-}};
-
-var p2 = Promise.resolve(thenable);
-p2.then(function(v) {
- // no es llamada
-}, function(e) {
- console.log(e); // TypeError: Arrojando
-});
-
-// Thenable arroja después del callback
-// Resuelve la Promise
-var thenable = { then: function(resolve) {
- resolve('Resolviendo');
- throw new TypeError('Arrojando');
-}};
-
-var p3 = Promise.resolve(thenable);
-p3.then(function(v) {
- console.log(v); // "Resolviendo"
-}, function(e) {
- // no es llamada
-});
-
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES2015', '#sec-promise.resolve', 'Promise.resolve')}}
- {{Spec2('ES2015')}}
- Definición inicial en un estándar de ECMA.
-
-
- {{SpecName('ESDraft', '#sec-promise.resolve', 'Promise.resolve')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad con navegadores
-
-
-
-{{Compat("javascript.builtins.Promise.resolve")}}
-
-Véase también
-
-
- {{jsxref("Promise")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/promise/resolve/index.md b/files/es/web/javascript/reference/global_objects/promise/resolve/index.md
new file mode 100644
index 00000000000000..83802228fd19ea
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/promise/resolve/index.md
@@ -0,0 +1,136 @@
+---
+title: Promise.resolve()
+slug: Web/JavaScript/Reference/Global_Objects/Promise/resolve
+tags:
+ - ECMAScript 2015
+ - JavaScript
+ - Promise
+ - metodo
+translation_of: Web/JavaScript/Reference/Global_Objects/Promise/resolve
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Promise/resolve
+---
+{{JSRef}}
+
+El método **`Promise.resolve(value)`** retorna un objeto {{jsxref("Promise")}} que es resuelto con el valor dado. Si el valor es una _promise_, esa _promise_ es devuelta; si el valor es un _thenable_ (si tiene un {{jsxref("Promise.then", "método \"then\"")}}), el valor devuelto le seguirá a ese _thenable_, adoptando su estado; de otro modo la _promise_ devuelta estará completada con el valor.
+
+{{EmbedInteractiveExample("pages/js/promise-resolve.html")}}
+
+La fuente para esta demostración interactiva se encuentra en un repositorio de GitHub. Si te gustaría contribuir al proyecto de la demostración interactiva, por favor clona y envíanos una _pull request_.
+
+## Sintáxis
+
+```js
+Promise.resolve(value);
+Promise.resolve(promise);
+Promise.resolve(thenable);
+```
+
+### Parámetros
+
+- value
+ - : Argumento por resolver por esta `Promise`. También puede ser una `Promise` o un _thenable_ por resolver.
+
+### Valor retornado
+
+Una {{jsxref("Promise")}} que es resuelta con el valor dado, o con la _promise_ pasada como valor, si el valor era un objeto _promise_.
+
+## Descripción
+
+La función estática `Promise.resolve` retorna una `Promise` que es resuelta.
+
+## Ejemplos
+
+### Utilizando el método estático `Promise.resolve`
+
+```js
+Promise.resolve('Éxito').then(function(value) {
+ console.log(value); // "Éxito"
+}, function(value) {
+ // no es llamada
+});
+```
+
+### Resolviendo un arreglo
+
+```js
+var p = Promise.resolve([1,2,3]);
+p.then(function(v) {
+ console.log(v[0]); // 1
+});
+```
+
+### Resolviendo otra `Promise`
+
+```js
+var original = Promise.resolve(33);
+var cast = Promise.resolve(original);
+cast.then(function(value) {
+ console.log('valor: ' + value);
+});
+console.log('original === cast ? ' + (original === cast));
+
+// registros, en orden:
+// original === cast ? true
+// valor: 33
+```
+
+El orden invertido de los registros se debe al hecho de que los _handler_ `then` sean llamados asíncronamente. Vea cómo funciona `then` [aquí](/es/docs/Web/JavaScript/Reference/Global_Objects/Promise/then#Return_value).
+
+### Resolviendo thenables y arrojando Errores
+
+```js
+// Resolviendo un objeto thenable
+var p1 = Promise.resolve({
+ then: function(onFulfill, onReject) { onFulfill('¡Completada!'); }
+});
+console.log(p1 instanceof Promise) // true, objeto convertido en una Promise
+j
+p1.then(function(v) {
+ console.log(v); // "¡Completada!"
+ }, function(e) {
+ // no es llamada
+});
+
+// Thenable arroja antes del callback
+// Rechaza la Promise
+var thenable = { then: function(resolve) {
+ throw new TypeError('Arrojando');
+ resolve('Resolviendo');
+}};
+
+var p2 = Promise.resolve(thenable);
+p2.then(function(v) {
+ // no es llamada
+}, function(e) {
+ console.log(e); // TypeError: Arrojando
+});
+
+// Thenable arroja después del callback
+// Resuelve la Promise
+var thenable = { then: function(resolve) {
+ resolve('Resolviendo');
+ throw new TypeError('Arrojando');
+}};
+
+var p3 = Promise.resolve(thenable);
+p3.then(function(v) {
+ console.log(v); // "Resolviendo"
+}, function(e) {
+ // no es llamada
+});
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| ---------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------ |
+| {{SpecName('ES2015', '#sec-promise.resolve', 'Promise.resolve')}} | {{Spec2('ES2015')}} | Definición inicial en un estándar de ECMA. |
+| {{SpecName('ESDraft', '#sec-promise.resolve', 'Promise.resolve')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad con navegadores
+
+{{Compat("javascript.builtins.Promise.resolve")}}
+
+## Véase también
+
+- {{jsxref("Promise")}}
diff --git a/files/es/web/javascript/reference/global_objects/proxy/proxy/set/index.html b/files/es/web/javascript/reference/global_objects/proxy/proxy/set/index.html
deleted file mode 100644
index 442ce4d7a03754..00000000000000
--- a/files/es/web/javascript/reference/global_objects/proxy/proxy/set/index.html
+++ /dev/null
@@ -1,123 +0,0 @@
----
-title: handler.set()
-slug: Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/set
-tags:
- - ECMAScript 2015
- - JavaScript
- - Proxy
- - metodo
-translation_of: Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/set
-original_slug: Web/JavaScript/Reference/Global_Objects/Proxy/handler/set
----
-{{JSRef}}
-
-El método handler.set()
captura las asignaciones de un valor a una determinada propiedad.
-
-Sintaxis
-
-var p = new Proxy(target, {
- set: function(target, property, value, receiver) {
- }
-});
-
-
-Parámetros
-
-El método set
recibe los siguientes parámetros.this
se asocia al handler.
-
-
- target
- El objeto objetivo.
- property
- El nombre de la propiedad a la que se le asignará el valor.
- value
- El nuevo valor asignado a la propiedad.
- receiver
- El objeto al que originalmente iba dirigida la asignación. Normalmente es el proxy. Sin embargo el manejador o set
handler puede ser llamado de forma indirecta a través de un prototipo entre otros.
- Por ejemplo, suponga que un escript ejecuta la sentencia obj.name = "jen"
, y obj
no es un proxy, y no posee la propiedad .name
, pero tiene un proxy en su cadena de prototipos. El manejador set
de este proxy será llamado y obj será pasado como el receiver.
-
-
-Valor Devuelto
-
-El método set
debe devolver un valor booleano. Devolverá true
para indicar que la asignación se ha llevado a cabo con éxito. Si devuelve false
, y la asignación tiene lugar en modo estricto, se lanzará un error de tipo TypeError
.
-
-Descripción
-
-El método handler.set
captura la asignación de un valor a una propiedad.
-
-Qué intercepta
-
-Las siguientes operaciones son capturadas:
-
-
- Asignación a propiedades: proxy[foo] = bar
y proxy.foo = bar
- Asignación a propiedades heredadas: Object.create(proxy)[foo] = bar
- {{jsxref("Reflect.set()")}}
-
-
-Invariantes
-
-Si los siguientes invariantes son violados, el proxy lanzará un {{jsxref("TypeError")}}:
-
-
- El valor de la propiedad no puede ser diferente al de la correspondiente propiedad del objeto, si esta es una propiedad no configurable, o sin permisos de escritura.
- No se puede asignar un valor a una propiedad si la correspondiente propiedad en el objeto objetivo es no configurable y tiene undefined
como su atributo [[Set]].
- En modo estricto, la devolución de false
pro parte del manejador set
lanzará una excepción del tipo {{jsxref("TypeError")}}.
-
-
-Ejemplos
-
-El siguiente código captura la asignación de un valor a una propiedad.
-
-var p = new Proxy({}, {
- set: function(target, prop, value, receiver) {
- target[prop] = value
- console.log('property set: ' + prop + ' = ' + value)
- return true
- }
-})
-
-console.log('a' in p) // false
-
-p.a = 10 // "propiedad asignada: a = 10"
-console.log('a' in p) // true
-console.log(p.a) // 10
-
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES2015', '#sec-proxy-object-internal-methods-and-internal-slots-set-p-v-receiver', '[[Set]]')}}
- {{Spec2('ES2015')}}
- Definición inicial.
-
-
- {{SpecName('ESDraft', '#sec-proxy-object-internal-methods-and-internal-slots-set-p-v-receiver', '[[Set]]')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad con los buscadores
-
-
-
-
-
{{Compat("javascript.builtins.Proxy.handler.set")}}
-
-
-Ver también
-
-
- {{jsxref("Proxy")}}
- {{jsxref("Proxy.handler", "handler")}}
- {{jsxref("Reflect.set()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/proxy/proxy/set/index.md b/files/es/web/javascript/reference/global_objects/proxy/proxy/set/index.md
new file mode 100644
index 00000000000000..b361eaf6d108f3
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/proxy/proxy/set/index.md
@@ -0,0 +1,99 @@
+---
+title: handler.set()
+slug: Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/set
+tags:
+ - ECMAScript 2015
+ - JavaScript
+ - Proxy
+ - metodo
+translation_of: Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/set
+original_slug: Web/JavaScript/Reference/Global_Objects/Proxy/handler/set
+---
+{{JSRef}}
+
+El método **`handler.set()`** captura las asignaciones de un valor a una determinada propiedad.
+
+## Sintaxis
+
+```js
+var p = new Proxy(target, {
+ set: function(target, property, value, receiver) {
+ }
+});
+```
+
+### Parámetros
+
+El método `set` recibe los siguientes parámetros.`this` se asocia al handler.
+
+- `target`
+ - : El objeto objetivo.
+- `property`
+ - : El nombre de la propiedad a la que se le asignará el valor.
+- `value`
+ - : El nuevo valor asignado a la propiedad.
+- `receiver`
+ - : El objeto al que originalmente iba dirigida la asignación. Normalmente es el proxy. Sin embargo el manejador o `set` handler puede ser llamado de forma indirecta a través de un prototipo entre otros.
+
+ Por ejemplo, suponga que un escript ejecuta la sentencia `obj.name = "jen"`, y `obj` no es un proxy, y no posee la propiedad `.name`, pero tiene un proxy en su cadena de prototipos. El manejador `set` de este proxy será llamado y obj será pasado como el receiver.
+
+### Valor Devuelto
+
+El método `set` debe devolver un valor booleano. Devolverá `true` para indicar que la asignación se ha llevado a cabo con éxito. Si devuelve `false`, y la asignación tiene lugar en modo estricto, se lanzará un error de tipo `TypeError`.
+
+## Descripción
+
+El método **`handler.set`** captura la asignación de un valor a una propiedad.
+
+### Qué intercepta
+
+Las siguientes operaciones son capturadas:
+
+- Asignación a propiedades: `proxy[foo] = bar` y `proxy.foo = bar`
+- Asignación a propiedades heredadas: `Object.create(proxy)[foo] = bar`
+- {{jsxref("Reflect.set()")}}
+
+### Invariantes
+
+Si los siguientes invariantes son violados, el proxy lanzará un {{jsxref("TypeError")}}:
+
+- El valor de la propiedad no puede ser diferente al de la correspondiente propiedad del objeto, si esta es una propiedad no configurable, o sin permisos de escritura.
+- No se puede asignar un valor a una propiedad si la correspondiente propiedad en el objeto objetivo es no configurable y tiene `undefined` como su atributo \[\[Set]].
+- En modo estricto, la devolución de `false` pro parte del manejador `set` lanzará una excepción del tipo {{jsxref("TypeError")}}.
+
+## Ejemplos
+
+El siguiente código captura la asignación de un valor a una propiedad.
+
+```js
+var p = new Proxy({}, {
+ set: function(target, prop, value, receiver) {
+ target[prop] = value
+ console.log('property set: ' + prop + ' = ' + value)
+ return true
+ }
+})
+
+console.log('a' in p) // false
+
+p.a = 10 // "propiedad asignada: a = 10"
+console.log('a' in p) // true
+console.log(p.a) // 10
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| ------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------- | ------------------- |
+| {{SpecName('ES2015', '#sec-proxy-object-internal-methods-and-internal-slots-set-p-v-receiver', '[[Set]]')}} | {{Spec2('ES2015')}} | Definición inicial. |
+| {{SpecName('ESDraft', '#sec-proxy-object-internal-methods-and-internal-slots-set-p-v-receiver', '[[Set]]')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad con los buscadores
+
+{{Compat("javascript.builtins.Proxy.handler.set")}}
+
+## Ver también
+
+- {{jsxref("Proxy")}}
+- {{jsxref("Proxy.handler", "handler")}}
+- {{jsxref("Reflect.set()")}}
diff --git a/files/es/web/javascript/reference/global_objects/regexp/regexp/index.html b/files/es/web/javascript/reference/global_objects/regexp/regexp/index.html
deleted file mode 100644
index 06b9a965469040..00000000000000
--- a/files/es/web/javascript/reference/global_objects/regexp/regexp/index.html
+++ /dev/null
@@ -1,115 +0,0 @@
----
-title: Constructor RegExp()
-slug: Web/JavaScript/Reference/Global_Objects/RegExp/RegExp
-tags:
- - Constructor
- - JavaScript
- - Referencia
- - RegExp
-translation_of: Web/JavaScript/Reference/Global_Objects/RegExp/RegExp
-original_slug: Web/JavaScript/Referencia/Objetos_globales/RegExp/RegExp
----
-{{JSRef}}
-
-El constructor RegExp
crea un objeto de expresión regular para hacer coincidir el texto con un patrón.
-
-Para ver la introducción a las expresiones regulares, lee el {{JSxRef("../Guide/Regular_Expressions", "capítulo sobre expresiones regulares")}} en la {{JSxRef("../Guide", "Guía de JavaScript")}}.
-
-{{EmbedInteractiveExample("pages/js/regexp-constructor.html")}}
-
-La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si deseas contribuir al proyecto de ejemplos interactivos, clona https://github.com/mdn/interactive-examples y envíanos una solicitud de extracción.
-
-Sintaxis
-
-Son posibles las notaciones literal, constructor y de fábrica:
-
-/patrón /banderas
-new RegExp(patrón [, banderas ])
-RegExp(patrón [, banderas ])
-
-
-Parámetros
-
-
- patrón
- El texto de la expresión regular.
- A partir de ES5, también puede ser otro objeto o RegExp
literal (solo para las dos notaciones del constructor RegExp). Los patrones pueden incluir {{JSxRef("../Guide/Regular_Expressions", "caracteres especiales", "#Usar_caracteres_especiales")}} para que coincidan con un rango de valores más amplio que el de una cadena literal.
- banderas
-
- Si se especifica, banderas
es una cadena que contiene las banderas para agregar.
-
- Alternativamente, si se proporciona un objeto para el patrón, la cadena banderas
reemplazará cualquiera de las banderas de ese objeto (y lastIndex
se restablecerá a 0
) (a partir de ES2015).
-
- Si no se especifica banderas
y se proporciona un objeto de expresiones regulares, las banderas de ese objeto (y el valor de lastIndex
) se copiarán.
-
- banderas
puede contener cualquier combinación de los siguientes caracteres:
-
-
- g
(coincidencia global)
- Encuentra todas las coincidencias en lugar de detenerse después de la primera.
- i
(ignorar mayúsculas y minúsculas)
- Si el indicador u
también está habilitado, utiliza el plegado de mayúsculas y minúsculas Unicode.
- m
(multilínea)
- Trata los caracteres iniciales y finales (^
y $
) como si estuvieran trabajando en varias líneas. En otras palabras, hace coincidir el principio o el final de cada línea (delimitada por \n
o \r
), no solo al principio o final de toda la cadena de entrada.
- s
(«dotAll » o punto para todo)
- Permite que el punto (.
coincida con nuevas líneas o no.
- u
(unicode)
- Trata el patrón
como una secuencia de puntos de código Unicode. (Consulta también Cadenas binarias ).
- y
(sticky)
- Coincide solo con el índice indicado por la propiedad lastIndex
de esta expresión regular en la cadena destino. No intenta coincidir con índices posteriores.
-
-
-
-
-Ejemplos
-
-Notación literal y constructor
-
-Hay dos formas de crear un objeto RegExp
: una notación literal y un constructor .
-
-
- Los parámetros de la notación literal se encierran entre barras y no utilizan comillas.
- Los parámetros de la función constructora no se encierran entre barras, pero utilizan comillas.
-
-
-Las siguientes tres expresiones crean la misma expresión regular:
-
-/ab+c/i
-new RegExp(/ab+c/, 'i') // notación literal
-new RegExp('ab+c', 'i') // constructor
-
-
-La notación literal da como resultado la compilación de la expresión regular cuando se evalúa la expresión. Utiliza la notación literal cuando la expresión regular permanecerá constante. Por ejemplo, si usas notación literal para construir una expresión regular usada en un bucle, la expresión regular no se volverá a compilar en cada iteración.
-
-El constructor del objeto de expresión regular, por ejemplo, new RegExp('ab+c')
, da como resultado la compilación en tiempo de ejecución de la expresión regular. Usa la función constructora cuando sepas que el patrón de la expresión regular cambiará, o no conoces el patrón y lo obtienes de otra fuente, como la entrada del usuario.
-
-Especificaciones
-
-
-
-
- Especificación
-
-
-
-
- {{SpecName('ESDraft', '#sec-regexp-constructor', 'RegExp constructor')}}
-
-
-
-
-Compatibilidad del navegador
-
-
-
-
-
{{Compat("javascript.builtins.RegExp.RegExp")}}
-
-
-Ve también
-
-
- El capítulo de {{JSxRef("../Guide/Regular_Expressions", "Expresiones regulares")}} en la {{JSxRef("../Guide", "Guía de JavaScript")}}
- {{JSxRef("String.prototype.match()")}}
- {{JSxRef("String.prototype.replace()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/regexp/regexp/index.md b/files/es/web/javascript/reference/global_objects/regexp/regexp/index.md
new file mode 100644
index 00000000000000..7df4d7812deecb
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/regexp/regexp/index.md
@@ -0,0 +1,96 @@
+---
+title: Constructor RegExp()
+slug: Web/JavaScript/Reference/Global_Objects/RegExp/RegExp
+tags:
+ - Constructor
+ - JavaScript
+ - Referencia
+ - RegExp
+translation_of: Web/JavaScript/Reference/Global_Objects/RegExp/RegExp
+original_slug: Web/JavaScript/Referencia/Objetos_globales/RegExp/RegExp
+---
+{{JSRef}}
+
+El constructor **`RegExp`** crea un objeto de expresión regular para hacer coincidir el texto con un patrón.
+
+Para ver la introducción a las expresiones regulares, lee el {{JSxRef("../Guide/Regular_Expressions", "capítulo sobre expresiones regulares")}} en la {{JSxRef("../Guide", "Guía de JavaScript")}}.
+
+{{EmbedInteractiveExample("pages/js/regexp-constructor.html")}}
+
+La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si deseas contribuir al proyecto de ejemplos interactivos, clona y envíanos una solicitud de extracción.
+
+## Sintaxis
+
+Son posibles las notaciones literal, constructor y de fábrica:
+
+```
+/patrón/banderas
+new RegExp(patrón[, banderas])
+RegExp(patrón[, banderas])
+```
+
+### Parámetros
+
+- `patrón`
+ - : El texto de la expresión regular.
+
+ A partir de ES5, también puede ser otro objeto o `RegExp` literal (solo para las dos notaciones del constructor RegExp). Los patrones pueden incluir {{JSxRef("../Guide/Regular_Expressions", "caracteres especiales", "#Usar_caracteres_especiales")}} para que coincidan con un rango de valores más amplio que el de una cadena literal.
+- `banderas`
+
+ - : Si se especifica, `banderas` es una cadena que contiene las banderas para agregar.
+
+ Alternativamente, si se proporciona un objeto para el patrón, la cadena `banderas` reemplazará cualquiera de las banderas de ese objeto (y `lastIndex` se restablecerá a `0`) (a partir de ES2015).
+
+ Si no se especifica `banderas` y se proporciona un objeto de expresiones regulares, las banderas de ese objeto (y el valor de `lastIndex`) se copiarán.
+
+ `banderas` puede contener cualquier combinación de los siguientes caracteres:
+
+ - `g` (coincidencia global)
+ - : Encuentra todas las coincidencias en lugar de detenerse después de la primera.
+ - `i` (ignorar mayúsculas y minúsculas)
+ - : Si el indicador `u` también está habilitado, utiliza el plegado de mayúsculas y minúsculas Unicode.
+ - `m` (multilínea)
+ - : Trata los caracteres iniciales y finales (`^` y `$`) como si estuvieran trabajando en varias líneas. En otras palabras, hace coincidir el principio o el final de _cada_ línea (delimitada por `\n` o `\r`), no solo al principio o final de toda la cadena de entrada.
+ - `s` («_dotAll_» o punto para todo)
+ - : Permite que el punto (`.` coincida con nuevas líneas o no.
+ - `u` (unicode)
+ - : Trata el `patrón` como una secuencia de puntos de código Unicode. (Consulta también [Cadenas binarias](/es/docs/Web/API/DOMString/Binary)).
+ - `y` (sticky)
+ - : Coincide solo con el índice indicado por la propiedad `lastIndex` de esta expresión regular en la cadena destino. No intenta coincidir con índices posteriores.
+
+## Ejemplos
+
+### Notación literal y constructor
+
+Hay dos formas de crear un objeto `RegExp`: una _notación literal_ y un _constructor_.
+
+- Los parámetros de **la notación literal** se encierran entre barras y no utilizan comillas.
+- Los parámetros de **la función constructora** no se encierran entre barras, pero utilizan comillas.
+
+Las siguientes tres expresiones crean la misma expresión regular:
+
+```js
+/ab+c/i
+new RegExp(/ab+c/, 'i') // notación literal
+new RegExp('ab+c', 'i') // constructor
+```
+
+La notación literal da como resultado la compilación de la expresión regular cuando se evalúa la expresión. Utiliza la notación literal cuando la expresión regular permanecerá constante. Por ejemplo, si usas notación literal para construir una expresión regular usada en un bucle, la expresión regular no se volverá a compilar en cada iteración.
+
+El constructor del objeto de expresión regular, por ejemplo, `new RegExp('ab+c')`, da como resultado la compilación en tiempo de ejecución de la expresión regular. Usa la función constructora cuando sepas que el patrón de la expresión regular cambiará, o no conoces el patrón y lo obtienes de otra fuente, como la entrada del usuario.
+
+## Especificaciones
+
+| Especificación |
+| ------------------------------------------------------------------------------------------------ |
+| {{SpecName('ESDraft', '#sec-regexp-constructor', 'RegExp constructor')}} |
+
+## Compatibilidad del navegador
+
+{{Compat("javascript.builtins.RegExp.RegExp")}}
+
+## Ve también
+
+- El capítulo de {{JSxRef("../Guide/Regular_Expressions", "Expresiones regulares")}} en la {{JSxRef("../Guide", "Guía de JavaScript")}}
+- {{JSxRef("String.prototype.match()")}}
+- {{JSxRef("String.prototype.replace()")}}
diff --git a/files/es/web/javascript/reference/global_objects/set/@@iterator/index.html b/files/es/web/javascript/reference/global_objects/set/@@iterator/index.html
deleted file mode 100644
index 402925504a8351..00000000000000
--- a/files/es/web/javascript/reference/global_objects/set/@@iterator/index.html
+++ /dev/null
@@ -1,87 +0,0 @@
----
-title: Set.prototype[@@iterator]()
-slug: Web/JavaScript/Reference/Global_Objects/Set/@@iterator
-tags:
- - Iteradores
-translation_of: Web/JavaScript/Reference/Global_Objects/Set/@@iterator
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Set/@@iterator
----
-{{JSRef}}
-
-El valor inicial de la propiedad @@iterator
, es la misma función objeto que el valor inicial de la propiedad {{jsxref("Set.prototype.values()", "values")}}.
-
-{{EmbedInteractiveExample("pages/js/set-prototype-@@iterator.html")}}
-
-El código fuente de este ejemplo interactivo lo puedes encontrar en el repositorio de Github. Si quieres contribuir con más ejemplos interactivos, por favor clona https://github.com/mdn/interactive-examples y envíanos una pull request.
-
-Sintaxis
-
-mySet [Symbol.iterator]
-
- Valor retornado
-
-La función iteradora Set
, la cuál es {{jsxref("Set.prototype.values()", "values()")}} por defecto.
-
-Ejemplos
-
-Usando [@@iterator]()
-
-const mySet = new Set();
-mySet.add('0');
-mySet.add(1);
-mySet.add({});
-
-const setIter = mySet[Symbol.iterator]();
-
-console.log(setIter.next().value); // "0"
-console.log(setIter.next().value); // 1
-console.log(setIter.next().value); // Object
-
-
-Usando [@@iterator]()
con for..of
-
-const mySet = new Set();
-mySet.add('0');
-mySet.add(1);
-mySet.add({});
-
-for (const v of mySet) {
- console.log(v);
-}
-
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES2015', '#sec-set.prototype-@@iterator', 'Set.prototype[@@iterator]')}}
- {{Spec2('ES2015')}}
- Definición inicial.
-
-
- {{SpecName('ESDraft', '#sec-set.prototype-@@iterator', 'Set.prototype[@@iterator]')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad en navegadores
-
-
-
-{{Compat("javascript.builtins.Set.@@iterator")}}
-
-Vea también
-
-
- {{jsxref("Set.prototype.entries()")}}
- {{jsxref("Set.prototype.keys()")}}
- {{jsxref("Set.prototype.values()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/set/@@iterator/index.md b/files/es/web/javascript/reference/global_objects/set/@@iterator/index.md
new file mode 100644
index 00000000000000..aeb75454b17428
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/set/@@iterator/index.md
@@ -0,0 +1,72 @@
+---
+title: Set.prototype[@@iterator]()
+slug: Web/JavaScript/Reference/Global_Objects/Set/@@iterator
+tags:
+ - Iteradores
+translation_of: Web/JavaScript/Reference/Global_Objects/Set/@@iterator
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Set/@@iterator
+---
+{{JSRef}}
+
+El valor inicial de la propiedad **`@@iterator`**, es la misma función objeto que el valor inicial de la propiedad {{jsxref("Set.prototype.values()", "values")}}.
+
+{{EmbedInteractiveExample("pages/js/set-prototype-@@iterator.html")}}
+
+El código fuente de este ejemplo interactivo lo puedes encontrar en el repositorio de Github. Si quieres contribuir con más ejemplos interactivos, por favor clona y envíanos una pull request.
+
+## Sintaxis
+
+```
+mySet[Symbol.iterator]
+```
+
+### Valor retornado
+
+La función **iteradora** `Set` , la cuál es {{jsxref("Set.prototype.values()", "values()")}} por defecto.
+
+## Ejemplos
+
+### Usando `[@@iterator]()`
+
+```js
+const mySet = new Set();
+mySet.add('0');
+mySet.add(1);
+mySet.add({});
+
+const setIter = mySet[Symbol.iterator]();
+
+console.log(setIter.next().value); // "0"
+console.log(setIter.next().value); // 1
+console.log(setIter.next().value); // Object
+```
+
+### Usando `[@@iterator]()` con `for..of`
+
+```js
+const mySet = new Set();
+mySet.add('0');
+mySet.add(1);
+mySet.add({});
+
+for (const v of mySet) {
+ console.log(v);
+}
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| ---------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------- |
+| {{SpecName('ES2015', '#sec-set.prototype-@@iterator', 'Set.prototype[@@iterator]')}} | {{Spec2('ES2015')}} | Definición inicial. |
+| {{SpecName('ESDraft', '#sec-set.prototype-@@iterator', 'Set.prototype[@@iterator]')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad en navegadores
+
+{{Compat("javascript.builtins.Set.@@iterator")}}
+
+## Vea también
+
+- {{jsxref("Set.prototype.entries()")}}
+- {{jsxref("Set.prototype.keys()")}}
+- {{jsxref("Set.prototype.values()")}}
diff --git a/files/es/web/javascript/reference/global_objects/set/entries/index.html b/files/es/web/javascript/reference/global_objects/set/entries/index.html
deleted file mode 100644
index f46ed584b753dd..00000000000000
--- a/files/es/web/javascript/reference/global_objects/set/entries/index.html
+++ /dev/null
@@ -1,72 +0,0 @@
----
-title: Set.prototype.entries()
-slug: Web/JavaScript/Reference/Global_Objects/Set/entries
-translation_of: Web/JavaScript/Reference/Global_Objects/Set/entries
-original_slug: Web/JavaScript/Referencia/Objetos_globales/Set/entries
----
-{{JSRef}}
-
-El método entries()
devuelve un nuevo objeto de tipo Iterator
que contiene un array de tuplas [value, value]
por cada elemento en el Set
original, manteniendo el orden de inserción. En los objetos de tipo Set
no existe una clave key como ocurre en los objetos de tipo Map
. Sin embargo, para mantener una API similar a la de los objetos de tipo Map
, cada entry contiene el mismo valor para su clave y valor, devolviendo por tanto un array de tuplas [value, value]
.
-
-{{EmbedInteractiveExample("pages/js/set-prototype-entries.html")}}
-
-El código de este ejemplo interactivo esta almacenado en un repositorio de GitHub. Si quieres contribuir al proyecto de ejemplos interativos, simplemente clona https://github.com/mdn/interactive-examples y envíanos una pull request.
-
-Sintaxis
-
-mySet .entries()
-
-Valor de retorno
-
-Un nuevo objeto de tipo Iterator
que contiene un array de tuplas [value, value]
por cada elemento en el Set
original, en orden de inserción.
-
-Ejemplos
-
-Usando el método entries
-
-var mySet = new Set();
-mySet.add('foobar');
-mySet.add(1);
-mySet.add('baz');
-
-var setIter = mySet.entries();
-
-console.log(setIter.next().value); // ["foobar", "foobar"]
-console.log(setIter.next().value); // [1, 1]
-console.log(setIter.next().value); // ["baz", "baz"]
-
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Commentario
-
-
- {{SpecName('ES2015', '#sec-set.prototype.entries', 'Set.prototype.entries')}}
- {{Spec2('ES2015')}}
- Definición inicial.
-
-
- {{SpecName('ESDraft', '#sec-set.prototype.entries', 'Set.prototype.entries')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad de navegadores
-
-
-
-{{Compat("javascript.builtins.Set.entries")}}
-
-Ver también
-
-
- {{jsxref("Set.prototype.keys()")}}
- {{jsxref("Set.prototype.values()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/set/entries/index.md b/files/es/web/javascript/reference/global_objects/set/entries/index.md
new file mode 100644
index 00000000000000..e39e0bb97b83c5
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/set/entries/index.md
@@ -0,0 +1,56 @@
+---
+title: Set.prototype.entries()
+slug: Web/JavaScript/Reference/Global_Objects/Set/entries
+translation_of: Web/JavaScript/Reference/Global_Objects/Set/entries
+original_slug: Web/JavaScript/Referencia/Objetos_globales/Set/entries
+---
+{{JSRef}}
+
+El método **`entries()`** devuelve un nuevo objeto de tipo `Iterator` que contiene **un array de tuplas `[value, value]`** por cada elemento en el `Set` original, manteniendo el orden de inserción. En los objetos de tipo `Set` no existe una clave key como ocurre en los objetos de tipo `Map`. Sin embargo, para mantener una API similar a la de los objetos de tipo `Map`, cada _entry_ contiene el mismo valor para su clave y valor, devolviendo por tanto un array de tuplas `[value, value]`.
+
+{{EmbedInteractiveExample("pages/js/set-prototype-entries.html")}}
+
+El código de este ejemplo interactivo esta almacenado en un repositorio de GitHub. Si quieres contribuir al proyecto de ejemplos interativos, simplemente clona y envíanos una pull request.
+
+## Sintaxis
+
+```
+mySet.entries()
+```
+
+### Valor de retorno
+
+Un nuevo objeto de tipo `Iterator` que contiene un array de tuplas `[value, value]` por cada elemento en el `Set` original, en orden de inserción.
+
+## Ejemplos
+
+### Usando el método `entries`
+
+```js
+var mySet = new Set();
+mySet.add('foobar');
+mySet.add(1);
+mySet.add('baz');
+
+var setIter = mySet.entries();
+
+console.log(setIter.next().value); // ["foobar", "foobar"]
+console.log(setIter.next().value); // [1, 1]
+console.log(setIter.next().value); // ["baz", "baz"]
+```
+
+## Especificaciones
+
+| Especificación | Estado | Commentario |
+| -------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------- |
+| {{SpecName('ES2015', '#sec-set.prototype.entries', 'Set.prototype.entries')}} | {{Spec2('ES2015')}} | Definición inicial. |
+| {{SpecName('ESDraft', '#sec-set.prototype.entries', 'Set.prototype.entries')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad de navegadores
+
+{{Compat("javascript.builtins.Set.entries")}}
+
+## Ver también
+
+- {{jsxref("Set.prototype.keys()")}}
+- {{jsxref("Set.prototype.values()")}}
diff --git a/files/es/web/javascript/reference/global_objects/string/replace/index.html b/files/es/web/javascript/reference/global_objects/string/replace/index.html
deleted file mode 100644
index ea77a33c135cdf..00000000000000
--- a/files/es/web/javascript/reference/global_objects/string/replace/index.html
+++ /dev/null
@@ -1,203 +0,0 @@
----
-title: String.prototype.replace()
-slug: Web/JavaScript/Reference/Global_Objects/String/replace
-tags:
- - JavaScript
- - Method
- - Prototype
- - Regular Expressions
- - String
-translation_of: Web/JavaScript/Reference/Global_Objects/String/replace
-original_slug: Web/JavaScript/Referencia/Objetos_globales/String/replace
----
-{{JSRef("Objetos_globales", "String")}}
-
-Resumen
-
-El método replace()
devuelve una nueva cadena con algunas o todas las coincidencias de un patrón
, siendo cada una de estas coincidencias reemplazadas por remplazo
. El patrón
puede ser una cadena o una {{jsxref("RegExp")}}, y el reemplazo
puede ser una cadena o una función que será llamada para cada coincidencia. Si el patrón
es una cadena, sólo la primera coincidencia será reemplazada.
-
-La cadena original permanecerá inalterada.
-
-{{EmbedInteractiveExample("pages/js/string-replace.html")}}
-
-Sintaxis
-
-cadena .replace(regexp|substr, newSubStr|function[,
{{ Non-standard_inline() }} flags]);
-
-
-Parámetros
-
-
- expresionregular
- Un objeto {{jsxref("RegExp")}} o literal. Las coincidencias son reemplazadas por ewSubSt
o el valor devuelto por la función especificada.
-
-
-
- subcadena
- Un objeto {{jsxref("String")}} que será reemplazado por nuevaSubcadena
.
-
-
-
- nuevaSubcadena
- El objeto {{jsxref("String")}} que reemplaza la subcadena que recibida desde el primer parámetro.
-
-
-
- funcion
- Una función que será invocada para crear la nueva subcadena (para ponerla en lugar de la subcadena recibida por el primer parámetro).
-
-
-
- flags
{{ non-standard_inline() }}
- Un objeto {{jsxref("String")}} que contiene cualquier combinación de flags de la clase RegExp: g
- emparejamiento global, i
- ignorar mayúsculas, m
- emparejar multiples líneas. Este parámetro se usa sólo si el primer parámetro es una cadena.
-
-
-Descripción
-
-Este método no cambia el objeto String
sobre el que se realiza la llamada. Simplemente devuelve una nueva cadena.
-
-Para realizar una búsqueda global y reemplazarla, o se incluye el flag g
en la expresión regular o si el primer parámetro es una cadena, se incluye g
en el parámetro flags
.
-
-Especificando una cadena como un parámetro
-
-La cadena de reemplazo puede incluir los siguientes patrones de reemplazo especiales:
-
-
-
-
-
-
-
-
- $$
- Inserta una "$".
-
-
- $&
- Inserta la subcadena emparejada.
-
-
- $`
- Inserta la sección de cadena que precede a la subcadena emparejada.
-
-
- $'
- Inserta la porción de subcadena que sigue a la subcadena emparejada.
-
-
- $n
o $nn
- Donde n
o nn
son dígitos decimales positivos menores a 100, inserta la subcadena emparejada de orden n del paréntesis, proporcionado por el primer argumento del objeto RegExp
.
-
-
-
-
-Especificando una función con un parámetro
-
-Cuando se especifica una función en el segundo parámetro, la función es invocada después de que el emparejamiento se haya realizado. (El uso de una función de este modo se llama expresión lambda.)
-
-En la función, puedes generar dinámicamente la cadena que reemplaza la subcadena emparejada. El resultado de la llamada de la función se usa como valor de reemplazo.
-
-The nested function can use the matched substrings to determine the new string (newSubStr
) that replaces the found substring. You get the matched substrings through the parameters of your function. The first parameter of your function holds the complete matched substring. If the first argument was a RegExp
object, then the followingn parameters can be used for parenthetical matches, remembered submatch strings, wheren is the number of submatch strings in the regular expression. Finally, the last two parameters are the offset within the string where the match occurred and the string itself. For example, the following replace
method returns XXzzzz - XX , zzzz.
-
-function replacer(str, p1, p2, offset, s)
-{
- return str + " - " + p1 + " , " + p2;
-}
-var newString = "XXzzzz".replace(/(X*)(z*)/, replacer);
-console.log(newString); // XXzzzz - XX , zzzz
-
-
-Ejemplos
-
-Ejemplo: Usando global
e ignore
con replace
-
-En el siguiente ejemplo, la expresión regular incluye las banderas "global" e "ignore case", las cuales permiten al método replace
reemplazar cada aparición de la cadena 'apples' por la cadena 'oranges'.
-
-var re = /apples/gi;
-var str = "Apples are round, and apples are juicy.";
-var newstr = str.replace(re, "oranges");
-print(newstr);
-
-
-In this version, a string is used as the first parameter and the global and ignore case flags are specified in the flags
parameter.
-
-var str = "Apples are round, and apples are juicy.";
-var newstr = str.replace("apples", "oranges", "gi");
-print(newstr);
-
-
-Both of these examples print "oranges are round, and oranges are juicy."
-
-Ejemplo: Definiendo la expresión regular en replace
-
-En el siguiente ejemplo, se define la expresión regular en replace
e incluye el flag de ignorar mayúsculas.
-
-var cadena = "Twas the night before Xmas...";
-var nuevaCadena = cadena.replace(/xmas/i, "Christmas");
-print(nuevaCadena);
-
-
-Esto muestra "Twas the night before Christmas..."
-
-Ejemplo: Conectando palabras en una cadena
-
-El siguiente código conecta las palabras dentro de la cadena. Para reemplazar el texto, el código usa $1
y $2
como patrones de reemplazo.
-
-var expresion = /(\w+)\s(\w+)/;
-var cadena = "John Smith";
-var nuevaCadena = cadena.replace(expresion, "$2, $1");
-print(nuevaCadena);
-
-
-Esto muestra "Smith, John".
-
-Ejemplo: Using an inline function that modifies the matched characters
-
-In this example, all occurrences of capital letters in the string are converted to lower case, and a hyphen is inserted just before the match location. The important thing here is that additional operations are needed on the matched item before it is given back as a replacement.
-
-The replacement function accepts the matched snippet as its parameter, and uses it to transform the case and concatenate the hyphen before returning.
-
-function styleHyphenFormat(propertyName)
-{
- function upperToHyphenLower(match)
- {
- return '-' + match.toLowerCase();
- }
- return propertyName.replace(/[A-Z]/, upperToHyphenLower);
-}
-
-
-Given styleHyphenFormat('borderTop')
, this returns 'border-top'.
-
-Because we want to further transform theresult of the match before the final substitution is made, we must use a function. This forces the evaluation of the match prior to the toLowerCase()
method. If we had tried to do this using the match without a function, the toLowerCase() would have no effect.
-
-var newString = propertyName.replace(/[A-Z]/, '-' + '$&'.toLowerCase()); // won't work
-
-
-This is because '$&'.toLowerCase()
would be evaluated first as a string literal (resulting in the same '$&'
) before using the characters as a pattern.
-
-Ejemplo: Reemplazando grados Fahrenheit con su equivalente Celsius
-
-El siguiente ejemplo reemplaza los grados Fahrenheit con su enquivalente en grados Celsius. Los grados Fahrenheit deberían ser un número acabado en F. La función devuelve el número Celsius acabado en C. Por ejemplo, si el número de entrada es 212F, la función devuelve 100C. Si el número es 0F, la función devuelve -17.77777777777778C.
-
-La expresión regular test
revisa si para un número termina en F. El número de grados Fahrenheit es accesible a la función a través de su segundo parámetro, p1
. La función establece el número Celsius basado en los grados Fahrenheit pasados en una cadena a la función f2c
. Entonces f2c
devuelve el número Celsius. Esta función aproxima al flag de Perl s///e.
-
-function f2c(x)
-{
- function convert(str, p1, offset, s)
- {
- return ((p1-32) * 5/9) + "C";
- }
- var s = String(x);
- var test = /(\d+(?:\.\d*)?)F\b/g;
- return s.replace(test, convert);
-}
-
-
-Vea También
-
-
- {{jsxref("String.prototype.match()")}}
- {{jsxref("RegExp.prototype.exec()")}}
- {{jsxref("RegExp.prototype.test()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/string/replace/index.md b/files/es/web/javascript/reference/global_objects/string/replace/index.md
new file mode 100644
index 00000000000000..111ac52fd14c6e
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/string/replace/index.md
@@ -0,0 +1,187 @@
+---
+title: String.prototype.replace()
+slug: Web/JavaScript/Reference/Global_Objects/String/replace
+tags:
+ - JavaScript
+ - Method
+ - Prototype
+ - Regular Expressions
+ - String
+translation_of: Web/JavaScript/Reference/Global_Objects/String/replace
+original_slug: Web/JavaScript/Referencia/Objetos_globales/String/replace
+---
+{{JSRef("Objetos_globales", "String")}}
+
+## Resumen
+
+El método **`replace()`** devuelve una nueva cadena con algunas o todas las coincidencias de un `patrón`, siendo cada una de estas coincidencias reemplazadas por `remplazo`. El `patrón` puede ser una cadena o una {{jsxref("RegExp")}}, y el `reemplazo` puede ser una cadena o una función que será llamada para cada coincidencia. Si el `patrón` es una cadena, sólo la primera coincidencia será reemplazada.
+
+La cadena original permanecerá inalterada.
+
+{{EmbedInteractiveExample("pages/js/string-replace.html")}}
+
+## Sintaxis
+
+```html
+cadena.replace(regexp|substr, newSubStr|function[, {{ Non-standard_inline() }} flags]);
+```
+
+### Parámetros
+
+- `expresionregular`
+ - : Un objeto {{jsxref("RegExp")}} o literal. Las coincidencias son reemplazadas por `ewSubSt` o el valor devuelto por la función especificada.
+
+
+
+- `subcadena`
+ - : Un objeto {{jsxref("String")}} que será reemplazado por `nuevaSubcadena`.
+
+
+
+- `nuevaSubcadena`
+ - : El objeto {{jsxref("String")}} que reemplaza la subcadena que recibida desde el primer parámetro.
+
+
+
+- `funcion`
+ - : Una función que será invocada para crear la nueva subcadena (para ponerla en lugar de la subcadena recibida por el primer parámetro).
+
+
+
+- `flags` {{ non-standard_inline() }}
+ - : Un objeto {{jsxref("String")}} que contiene cualquier combinación de flags de la clase RegExp: `g` - emparejamiento global, `i` - ignorar mayúsculas, `m` - emparejar multiples líneas. Este parámetro se usa sólo si el primer parámetro es una cadena.
+
+## Descripción
+
+Este método no cambia el objeto `String` sobre el que se realiza la llamada. Simplemente devuelve una nueva cadena.
+
+Para realizar una búsqueda global y reemplazarla, o se incluye el flag `g` en la expresión regular o si el primer parámetro es una cadena, se incluye `g` en el parámetro `flags`.
+
+#### Especificando una cadena como un parámetro
+
+La cadena de reemplazo puede incluir los siguientes patrones de reemplazo especiales:
+
+| Patrón | Inserta |
+| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `$$` | Inserta una "$". |
+| `$&` | Inserta la subcadena emparejada. |
+| `` $` `` | Inserta la sección de cadena que precede a la subcadena emparejada. |
+| `$'` | Inserta la porción de subcadena que sigue a la subcadena emparejada. |
+| `$n`o `$nn` | Donde `n`o `nn`son dígitos decimales positivos menores a 100, inserta la subcadena emparejada de orden _n_ del paréntesis, proporcionado por el primer argumento del objeto `RegExp`. |
+
+### Especificando una función con un parámetro
+
+Cuando se especifica una función en el segundo parámetro, la función es invocada después de que el emparejamiento se haya realizado. (El uso de una función de este modo se llama expresión lambda.)
+
+En la función, puedes generar dinámicamente la cadena que reemplaza la subcadena emparejada. El resultado de la llamada de la función se usa como valor de reemplazo.
+
+The nested function can use the matched substrings to determine the new string (`newSubStr`) that replaces the found substring. You get the matched substrings through the parameters of your function. The first parameter of your function holds the complete matched substring. If the first argument was a `RegExp` object, then the following*n* parameters can be used for parenthetical matches, remembered submatch strings, where*n* is the number of submatch strings in the regular expression. Finally, the last two parameters are the offset within the string where the match occurred and the string itself. For example, the following `replace` method returns XXzzzz - XX , zzzz.
+
+```js
+function replacer(str, p1, p2, offset, s)
+{
+ return str + " - " + p1 + " , " + p2;
+}
+var newString = "XXzzzz".replace(/(X*)(z*)/, replacer);
+console.log(newString); // XXzzzz - XX , zzzz
+```
+
+## Ejemplos
+
+### Ejemplo: Usando `global` e `ignore` con `replace`
+
+En el siguiente ejemplo, la expresión regular incluye las banderas "global" e "ignore case", las cuales permiten al método `replace` reemplazar cada aparición de la cadena 'apples' por la cadena 'oranges'.
+
+```
+var re = /apples/gi;
+var str = "Apples are round, and apples are juicy.";
+var newstr = str.replace(re, "oranges");
+print(newstr);
+```
+
+In this version, a string is used as the first parameter and the global and ignore case flags are specified in the `flags` parameter.
+
+```
+var str = "Apples are round, and apples are juicy.";
+var newstr = str.replace("apples", "oranges", "gi");
+print(newstr);
+```
+
+Both of these examples print "oranges are round, and oranges are juicy."
+
+### Ejemplo: Definiendo la expresión regular en `replace`
+
+En el siguiente ejemplo, se define la expresión regular en `replace` e incluye el flag de ignorar mayúsculas.
+
+```
+var cadena = "Twas the night before Xmas...";
+var nuevaCadena = cadena.replace(/xmas/i, "Christmas");
+print(nuevaCadena);
+```
+
+Esto muestra "Twas the night before Christmas..."
+
+### Ejemplo: Conectando palabras en una cadena
+
+El siguiente código conecta las palabras dentro de la cadena. Para reemplazar el texto, el código usa `$1` y `$2` como patrones de reemplazo.
+
+```
+var expresion = /(\w+)\s(\w+)/;
+var cadena = "John Smith";
+var nuevaCadena = cadena.replace(expresion, "$2, $1");
+print(nuevaCadena);
+```
+
+Esto muestra "Smith, John".
+
+### Ejemplo: Using an inline function that modifies the matched characters
+
+In this example, all occurrences of capital letters in the string are converted to lower case, and a hyphen is inserted just before the match location. The important thing here is that additional operations are needed on the matched item before it is given back as a replacement.
+
+The replacement function accepts the matched snippet as its parameter, and uses it to transform the case and concatenate the hyphen before returning.
+
+```js
+function styleHyphenFormat(propertyName)
+{
+ function upperToHyphenLower(match)
+ {
+ return '-' + match.toLowerCase();
+ }
+ return propertyName.replace(/[A-Z]/, upperToHyphenLower);
+}
+```
+
+Given `styleHyphenFormat('borderTop')`, this returns 'border-top'.
+
+Because we want to further transform the*result* of the match before the final substitution is made, we must use a function. This forces the evaluation of the match prior to the `toLowerCase()` method. If we had tried to do this using the match without a function, the toLowerCase() would have no effect.
+
+```js
+var newString = propertyName.replace(/[A-Z]/, '-' + '$&'.toLowerCase()); // won't work
+```
+
+This is because `'$&'.toLowerCase()` would be evaluated first as a string literal (resulting in the same `'$&'`) before using the characters as a pattern.
+
+### Ejemplo: Reemplazando grados Fahrenheit con su equivalente Celsius
+
+El siguiente ejemplo reemplaza los grados Fahrenheit con su enquivalente en grados Celsius. Los grados Fahrenheit deberían ser un número acabado en F. La función devuelve el número Celsius acabado en C. Por ejemplo, si el número de entrada es 212F, la función devuelve 100C. Si el número es 0F, la función devuelve -17.77777777777778C.
+
+La expresión regular `test` revisa si para un número termina en F. El número de grados Fahrenheit es accesible a la función a través de su segundo parámetro, `p1`. La función establece el número Celsius basado en los grados Fahrenheit pasados en una cadena a la función `f2c`. Entonces `f2c` devuelve el número Celsius. Esta función aproxima al flag de Perl s///e.
+
+```js
+function f2c(x)
+{
+ function convert(str, p1, offset, s)
+ {
+ return ((p1-32) * 5/9) + "C";
+ }
+ var s = String(x);
+ var test = /(\d+(?:\.\d*)?)F\b/g;
+ return s.replace(test, convert);
+}
+```
+
+## Vea También
+
+- {{jsxref("String.prototype.match()")}}
+- {{jsxref("RegExp.prototype.exec()")}}
+- {{jsxref("RegExp.prototype.test()")}}
diff --git a/files/es/web/javascript/reference/global_objects/string/split/index.html b/files/es/web/javascript/reference/global_objects/string/split/index.html
deleted file mode 100644
index f78208df20b1fd..00000000000000
--- a/files/es/web/javascript/reference/global_objects/string/split/index.html
+++ /dev/null
@@ -1,193 +0,0 @@
----
-title: String.prototype.split()
-slug: Web/JavaScript/Reference/Global_Objects/String/split
-tags:
- - JavaScript
- - Method
- - Prototype
- - Regular Expressions
- - String
-translation_of: Web/JavaScript/Reference/Global_Objects/String/split
-original_slug: Web/JavaScript/Referencia/Objetos_globales/String/split
----
-{{JSRef("Objetos_globales", "String")}}
-
-El método split()
divide un objeto de tipo String
en un array (vector) de cadenas mediante la separación de la cadena en subcadenas.
-
-Sintaxis
-
-cadena .split([separador ][,limite ])
-
-Parámetros
-
-
- separador
- Especifica el carácter a usar para la separación de la cadena. El separador
es tratado como una cadena o como una {{jsxref("Objetos_globales/RegExp", "expresión regular", "", 1)}}. Si se omite el separador
, el array devuelto contendrá un sólo elemento con la cadena completa.
-
-
-
- limite
- Opcional. Entero que especifica un límite sobre el número de divisiones a realizar. El método split()
todavía se divide en todas las concordancias del separador
, pero divide la matriz devuelta en la cantidad de elementos impuesta por el limite
.
-
-
-Descripción
-
-El método split()
devuelve el nuevo array.
-
-Cuando se encuentra, el separador
es eliminado de la cadena y las subcadenas obtenidas se devuelven en un array. Si el separador
no es encontrado o se omite, el array contendrá un único elemento con la cadena original completa. Si el separador
es una cadena vacía la cadena es convertida en un array de carácteres.
-
-Si el separador
es una expresión regular que contiene paréntesis de captura, entonces cada vez que el separador
concuerda, los resultados (incluído cualquier resultado indefinido) de los paréntesis de captura son divididos en el array resultante. Sin embargo no todos los navegadores soportan esta característica.
-
-{{Note("Cuando la cadena está vacía, split()
devuelve un array que contiene una cadena vacía, en lugar de un array vacío.")}}
-
-Ejemplos
-
-Usando split()
-
-El siguiente ejemplo define una función que divide una cadena en un array de cadenas usando el separador especificado. Después de la división de la cadena, la función muestra mensajes indicando la cadena original (antes de la división), el separador usado, el número de elementos del array y los elementos individuales del array.
-
-function dividirCadena(cadenaADividir,separador) {
- var arrayDeCadenas = cadenaADividir.split(separador);
- document.write('<p>La cadena original es: "' + cadenaADividir + '"');
- document.write('<br>El separador es: "' + separador + '"');
- document.write("<br>El array tiene " + arrayDeCadenas.length + " elementos: ");
-
- for (var i=0; i < arrayDeCadenas.length; i++) {
- document.write(arrayDeCadenas[i] + " / ");
- }
-}
-
-var cadenaVerso = "Oh brave new world that has such people in it.";
-var cadenaMeses = "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec";
-
-var espacio = " ";
-var coma = ",";
-
-dividirCadena(cadenaVerso, espacio);
-dividirCadena(cadenaVerso);
-dividirCadena(cadenaMeses, coma);
-
-
-Este ejemplo produce el siguiente resultado:
-
-La cadena original es: "Oh brave new world that has such people in it."
-El separador es: " "
-El array tiene 10 elementos: Oh / brave / new / world / that / has / such / people / in / it. /
-
-La cadena original es: "Oh brave new world that has such people in it."
-El separador es: "undefined"
-El array tiene 1 elementos: Oh brave new world that has such people in it. /
-
-La cadena original es: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec"
-El separador es: ","
-El array tiene 12 elementos: Jan / Feb / Mar / Apr / May / Jun / Jul / Aug / Sep / Oct / Nov / Dec /
-
-
-Eliminar espacios de una cadena
-
-En el siguiente ejemplo, split
busca 0 o más espacios seguidos de un punto y coma seguido por 0 o más espacios y, cuando los halla, elimina los espacios de la cadena. listaNombres
es el array devuelto como resultado de la llamada a split
.
-
-var nombres = "Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand ";
-document.write(nombres + "<br>" + "<br>");
-var expresionRegular = /\s*;\s*/;
-var listaNombres = nombres.split(expresionRegular);
-document.write(listaNombres);
-
-
-Esto imprime dos líneas; la primera línea imprime la cadena original, y la segunda línea imprime el array resultante.
-
-Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand
-Harry Trump,Fred Barney,Helen Rigby,Bill Abel,Chris Hand
-
-
-Devolviendo un número limitado de divisiones
-
-El el siguiente ejemplo, split
busca 0 o más espacios en una cadena y devuelve las tres primeras divisiones que encuentra.
-
-var miCadena = "Hola Mundo. Cómo estás hoy?";
-var divisiones = miCadena.split(" ", 3);
-
-print(divisiones);
-
-
-Este script muestra lo siguiente:
-
-Hola,Mundo.,Cómo
-
-
-Paréntesis de captura
-
-Si el separador contiene paréntesis de capturaI los resultados que concuerden son devueltos en el array.
-
-var miCadena = 'Hola 1 mundo. Oración número 2.' ;
-var division = miCadena. split( /(\d)/ ) ;
-
-console. log( division) ;
-
-
-
-
-
-
-
-
-
-Este script muestra lo siguiente:
-
-Hola ,1, mundo. Oración número ,2,.
-
-
-
-Dar la vuelta a una cadena usando split()
-
-var str = 'asdfghjkl' ;
-var strReverse = str. split( '' ) . reverse( ) . join( '' ) ;
-
-
-
-
-
-
-
-Extra: usar el operador === para verificar si la cadena anterior era un palíndromo.
-
-Specifications
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- ECMAScript 3rd Edition.
- Estándar
- Definición inicial. Implementado en JavaScript 1.1.
-
-
- {{SpecName('ES5.1', '#sec-15.5.4.14', 'String.prototype.split')}}
- {{Spec2('ES5.1')}}
-
-
-
- {{SpecName('ES6', '#sec-string.prototype.split', 'String.prototype.split')}}
- {{Spec2('ES6')}}
-
-
-
-
-
-Compatibilidad con los navegadores
-
-{{Compat("javascript.builtins.String.split")}}
-
-Ver también
-
-
- {{jsxref("String.prototype.charAt()")}}
- {{jsxref("String.prototype.indexOf()")}}
- {{jsxref("String.prototype.lastIndexOf()")}}
- {{jsxref("Array.prototype.join()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/string/split/index.md b/files/es/web/javascript/reference/global_objects/string/split/index.md
new file mode 100644
index 00000000000000..618f5c75cd6557
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/string/split/index.md
@@ -0,0 +1,168 @@
+---
+title: String.prototype.split()
+slug: Web/JavaScript/Reference/Global_Objects/String/split
+tags:
+ - JavaScript
+ - Method
+ - Prototype
+ - Regular Expressions
+ - String
+translation_of: Web/JavaScript/Reference/Global_Objects/String/split
+original_slug: Web/JavaScript/Referencia/Objetos_globales/String/split
+---
+{{JSRef("Objetos_globales", "String")}}
+
+El método **`split()`** divide un objeto de tipo `String` en un array (vector) de cadenas mediante la separación de la cadena en subcadenas.
+
+## Sintaxis
+
+```
+cadena.split([separador][,limite])
+```
+
+### Parámetros
+
+- `separador`
+ - : Especifica el carácter a usar para la separación de la cadena. El `separador` es tratado como una cadena o como una [](/es/docs/Web/JavaScript/Referencia/Objetos_globales/RegExp){{jsxref("Objetos_globales/RegExp", "expresión regular", "", 1)}}. Si se omite el `separador`, el array devuelto contendrá un sólo elemento con la cadena completa.
+
+
+
+- `limite`
+ - : Opcional. Entero que especifica un límite sobre el número de divisiones a realizar. El método `split()` todavía se divide en todas las concordancias del `separador`, pero divide la matriz devuelta en la cantidad de elementos impuesta por el `limite`.
+
+## Descripción
+
+El método `split()` devuelve el nuevo array.
+
+Cuando se encuentra, el `separador` es eliminado de la cadena y las subcadenas obtenidas se devuelven en un array. Si el `separador` no es encontrado o se omite, el array contendrá un único elemento con la cadena original completa. Si el `separador` es una cadena vacía la cadena es convertida en un array de carácteres.
+
+Si el `separador` es una expresión regular que contiene paréntesis de captura, entonces cada vez que el `separador` concuerda, los resultados (incluído cualquier resultado indefinido) de los paréntesis de captura son divididos en el array resultante. Sin embargo no todos los navegadores soportan esta característica.
+
+{{Note("Cuando la cadena está vacía, split()
devuelve un array que contiene una cadena vacía, en lugar de un array vacío.")}}
+
+## Ejemplos
+
+### Usando `split()`
+
+El siguiente ejemplo define una función que divide una cadena en un array de cadenas usando el separador especificado. Después de la división de la cadena, la función muestra mensajes indicando la cadena original (antes de la división), el separador usado, el número de elementos del array y los elementos individuales del array.
+
+```js
+function dividirCadena(cadenaADividir,separador) {
+ var arrayDeCadenas = cadenaADividir.split(separador);
+ document.write('La cadena original es: "' + cadenaADividir + '"');
+ document.write(' El separador es: "' + separador + '"');
+ document.write(" El array tiene " + arrayDeCadenas.length + " elementos: ");
+
+ for (var i=0; i < arrayDeCadenas.length; i++) {
+ document.write(arrayDeCadenas[i] + " / ");
+ }
+}
+
+var cadenaVerso = "Oh brave new world that has such people in it.";
+var cadenaMeses = "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec";
+
+var espacio = " ";
+var coma = ",";
+
+dividirCadena(cadenaVerso, espacio);
+dividirCadena(cadenaVerso);
+dividirCadena(cadenaMeses, coma);
+```
+
+Este ejemplo produce el siguiente resultado:
+
+```
+La cadena original es: "Oh brave new world that has such people in it."
+El separador es: " "
+El array tiene 10 elementos: Oh / brave / new / world / that / has / such / people / in / it. /
+
+La cadena original es: "Oh brave new world that has such people in it."
+El separador es: "undefined"
+El array tiene 1 elementos: Oh brave new world that has such people in it. /
+
+La cadena original es: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec"
+El separador es: ","
+El array tiene 12 elementos: Jan / Feb / Mar / Apr / May / Jun / Jul / Aug / Sep / Oct / Nov / Dec /
+```
+
+### Eliminar espacios de una cadena
+
+En el siguiente ejemplo, `split` busca 0 o más espacios seguidos de un punto y coma seguido por 0 o más espacios y, cuando los halla, elimina los espacios de la cadena. `listaNombres` es el array devuelto como resultado de la llamada a `split`.
+
+```js
+var nombres = "Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand ";
+document.write(nombres + " " + " ");
+var expresionRegular = /\s*;\s*/;
+var listaNombres = nombres.split(expresionRegular);
+document.write(listaNombres);
+```
+
+Esto imprime dos líneas; la primera línea imprime la cadena original, y la segunda línea imprime el array resultante.
+
+```
+Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand
+Harry Trump,Fred Barney,Helen Rigby,Bill Abel,Chris Hand
+```
+
+### Devolviendo un número limitado de divisiones
+
+El el siguiente ejemplo, `split` busca 0 o más espacios en una cadena y devuelve las tres primeras divisiones que encuentra.
+
+```js
+var miCadena = "Hola Mundo. Cómo estás hoy?";
+var divisiones = miCadena.split(" ", 3);
+
+print(divisiones);
+```
+
+Este script muestra lo siguiente:
+
+```
+Hola,Mundo.,Cómo
+```
+
+### Paréntesis de captura
+
+Si el separador contiene paréntesis de capturaI los resultados que concuerden son devueltos en el array.
+
+```js
+var miCadena = 'Hola 1 mundo. Oración número 2.';
+var division = miCadena.split(/(\d)/);
+
+console.log(division);
+```
+
+Este script muestra lo siguiente:
+
+```html
+Hola ,1, mundo. Oración número ,2,.
+```
+
+### Dar la vuelta a una cadena usando `split()`
+
+```js
+var str = 'asdfghjkl';
+var strReverse = str.split('').reverse().join(''); // 'lkjhgfdsa'
+// split() retorna un array en el cual reverse() y join() pueden ser aplicados
+```
+
+**Extra:** usar el operador [===]() para verificar si la cadena anterior era un palíndromo.
+
+## Specifications
+
+| Especificación | Estado | Comentario |
+| ---------------------------------------------------------------------------------------------------- | ------------------------ | --------------------------------------------------- |
+| ECMAScript 3rd Edition. | Estándar | Definición inicial. Implementado en JavaScript 1.1. |
+| {{SpecName('ES5.1', '#sec-15.5.4.14', 'String.prototype.split')}} | {{Spec2('ES5.1')}} | |
+| {{SpecName('ES6', '#sec-string.prototype.split', 'String.prototype.split')}} | {{Spec2('ES6')}} | |
+
+## Compatibilidad con los navegadores
+
+{{Compat("javascript.builtins.String.split")}}
+
+## Ver también
+
+- {{jsxref("String.prototype.charAt()")}}
+- {{jsxref("String.prototype.indexOf()")}}
+- {{jsxref("String.prototype.lastIndexOf()")}}
+- {{jsxref("Array.prototype.join()")}}
diff --git a/files/es/web/javascript/reference/global_objects/string/tolocalelowercase/index.html b/files/es/web/javascript/reference/global_objects/string/tolocalelowercase/index.html
deleted file mode 100644
index a6f9631409fb19..00000000000000
--- a/files/es/web/javascript/reference/global_objects/string/tolocalelowercase/index.html
+++ /dev/null
@@ -1,114 +0,0 @@
----
-title: String.prototype.toLocaleLowerCase()
-slug: Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase
-tags:
- - Cadena
- - Internacionalizacion
- - Prototipo
- - Referencia
- - metodo
-translation_of: Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase
-original_slug: Web/JavaScript/Referencia/Objetos_globales/String/toLocaleLowerCase
----
-
{{JSRef}}
-
-El método toLocaleLowerCase()
retorna la cadena de texto desde la que se llama convertida en minúsculas, de acuerdo con cualquier localización específica de correspondencia de mayúsculas y minúsculas.
-
-
-
-{{EmbedInteractiveExample("pages/js/string-tolocalelowercase.html")}}
-
-Los fuentes para este ejemplo interactivo están almacenados en un repositorio GitHub. Si quieres contribuir en el proyecto de ejemplos interactivos, por favor clona https://github.com/mdn/interactive-examples y envíanos un pull request.
-
-Sintaxis
-
-str .toLocaleLowerCase()
-str .toLocaleLowerCase(locale)
-str .toLocaleLowerCase([locale, locale, ...])
-
-
-Parámetros
-
-
- locale
{{optional_inline}}
- El parámetro locale
indica la localización que se utilizará para convertir a minúsculas de acuerdo con culalquier correspondencia de mayúsculas y minúsculas. Si se proporcionan múltiples locales en un {{jsxref("Array")}}, se utiliza el mejor local disponible . La localización por defecto es la localización actual configurada en el host .
-
-
-Valor retornado
-
-Una nueva cadena que representa la cadena desde la que se llama convertida a minúsculas, de acuerdo con cualquier localización específica de correspondencia de mayúsculas y minúsculas.
-
-Excepciones
-
-
- Una excepción de tipo {{jsxref("RangeError")}} ("invalid language tag: xx_yy") se lanzará si el argumento locale
no es una etiqueta válida de lenguaje.
- Una excepción de tipo {{jsxref("TypeError")}} ("invalid element in locales argument") se lanzará si un elemento del arreglo no es del tipo cadena.
-
-
-Descripción
-
-El método toLocaleLowerCase()
retorna la cadena de texto desde la que se llama convertida en minúsculas, de acuerdo con cualquier localización específica de correspondencia de mayúsculas y minúsculas. toLocaleLowerCase()
no afecta el valor de la cadena desde la que se llama. En la mayoría de los casos, producirá el mismo resultado que {{jsxref("String.prototype.toLowerCase()", "toLowerCase()")}}, pero para algunos locales, como el turco, cuyas correspondencias de mayúsculas y minúsculas no siguen las correpsondencias por defecto de Unicode, podría producir de un resultado diferente.
-
-Ejemplos
-
-Utilizando toLocaleLowerCase()
-
-'ALPHABET'.toLocaleLowerCase(); // 'alphabet'
-
-'\u0130'.toLocaleLowerCase('tr') === 'i'; // true
-'\u0130'.toLocaleLowerCase('en-US') === 'i'; // false
-
-let locales = ['tr', 'TR', 'tr-TR', 'tr-u-co-search', 'tr-x-turkish'];
-'\u0130'.toLocaleLowerCase(locales) === 'i'; // true
-
-
-Especificaciones
-
-
-
-
- Especificación
- Estatus
- Comentario
-
-
- {{SpecName('ES3')}}
- {{Spec2('ES3')}}
- Initial definition. Implemented in JavaScript 1.2.
-
-
- {{SpecName('ES5.1', '#sec-15.5.4.17', 'String.prototype.toLocaleLowerCase')}}
- {{Spec2('ES5.1')}}
-
-
-
- {{SpecName('ES6', '#sec-string.prototype.tolocalelowercase', 'String.prototype.toLocaleLowerCase')}}
- {{Spec2('ES6')}}
-
-
-
- {{SpecName('ESDraft', '#sec-string.prototype.tolocalelowercase', 'String.prototype.toLocaleLowerCase')}}
- {{Spec2('ESDraft')}}
-
-
-
- {{SpecName('ES Int Draft', '#sup-string.prototype.tolocalelowercase', 'String.prototype.toLocaleLowerCase')}}
- {{Spec2('ES Int Draft')}}
- ES Intl 2017 added the locale
parameter.
-
-
-
-
-Compatibilidad entre navegadores
-
-
-
-{{Compat("javascript.builtins.String.toLocaleLowerCase")}}
-
-Vea también
-
-
- {{jsxref("String.prototype.toLocaleUpperCase()")}}
- {{jsxref("String.prototype.toLowerCase()")}}
- {{jsxref("String.prototype.toUpperCase()")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/string/tolocalelowercase/index.md b/files/es/web/javascript/reference/global_objects/string/tolocalelowercase/index.md
new file mode 100644
index 00000000000000..9646cb4fe10bdf
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/string/tolocalelowercase/index.md
@@ -0,0 +1,75 @@
+---
+title: String.prototype.toLocaleLowerCase()
+slug: Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase
+tags:
+ - Cadena
+ - Internacionalizacion
+ - Prototipo
+ - Referencia
+ - metodo
+translation_of: Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase
+original_slug: Web/JavaScript/Referencia/Objetos_globales/String/toLocaleLowerCase
+---
+{{JSRef}}El método **`toLocaleLowerCase()`** retorna la cadena de texto desde la que se llama convertida en minúsculas, de acuerdo con cualquier localización específica de correspondencia de mayúsculas y minúsculas.{{EmbedInteractiveExample("pages/js/string-tolocalelowercase.html")}}
+
+Los fuentes para este ejemplo interactivo están almacenados en un repositorio GitHub. Si quieres contribuir en el proyecto de ejemplos interactivos, por favor clona https\://github.com/mdn/interactive-examples y envíanos un pull request.
+
+## Sintaxis
+
+```
+str.toLocaleLowerCase()
+str.toLocaleLowerCase(locale)
+str.toLocaleLowerCase([locale, locale, ...])
+```
+
+### Parámetros
+
+- `locale` {{optional_inline}}
+ - : El parámetro `locale` indica la localización que se utilizará para convertir a minúsculas de acuerdo con culalquier correspondencia de mayúsculas y minúsculas. Si se proporcionan múltiples locales en un {{jsxref("Array")}}, se utiliza [el mejor local disponible](https://tc39.github.io/ecma402/#sec-bestavailablelocale). La localización por defecto es la localización actual configurada en el _host_.
+
+### Valor retornado
+
+Una nueva cadena que representa la cadena desde la que se llama convertida a minúsculas, de acuerdo con cualquier localización específica de correspondencia de mayúsculas y minúsculas.
+
+### Excepciones
+
+- Una excepción de tipo {{jsxref("RangeError")}} ("invalid language tag: xx_yy") se lanzará si el argumento `locale` no es una etiqueta válida de lenguaje.
+- Una excepción de tipo {{jsxref("TypeError")}} ("invalid element in locales argument") se lanzará si un elemento del arreglo no es del tipo cadena.
+
+## Descripción
+
+El método `toLocaleLowerCase()` retorna la cadena de texto desde la que se llama convertida en minúsculas, de acuerdo con cualquier localización específica de correspondencia de mayúsculas y minúsculas. `toLocaleLowerCase()` no afecta el valor de la cadena desde la que se llama. En la mayoría de los casos, producirá el mismo resultado que {{jsxref("String.prototype.toLowerCase()", "toLowerCase()")}}, pero para algunos locales, como el turco, cuyas correspondencias de mayúsculas y minúsculas no siguen las correpsondencias por defecto de Unicode, podría producir de un resultado diferente.
+
+## Ejemplos
+
+### Utilizando `toLocaleLowerCase()`
+
+```js
+'ALPHABET'.toLocaleLowerCase(); // 'alphabet'
+
+'\u0130'.toLocaleLowerCase('tr') === 'i'; // true
+'\u0130'.toLocaleLowerCase('en-US') === 'i'; // false
+
+let locales = ['tr', 'TR', 'tr-TR', 'tr-u-co-search', 'tr-x-turkish'];
+'\u0130'.toLocaleLowerCase(locales) === 'i'; // true
+```
+
+## Especificaciones
+
+| Especificación | Estatus | Comentario |
+| ------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------- | -------------------------------------------------- |
+| {{SpecName('ES3')}} | {{Spec2('ES3')}} | Initial definition. Implemented in JavaScript 1.2. |
+| {{SpecName('ES5.1', '#sec-15.5.4.17', 'String.prototype.toLocaleLowerCase')}} | {{Spec2('ES5.1')}} | |
+| {{SpecName('ES6', '#sec-string.prototype.tolocalelowercase', 'String.prototype.toLocaleLowerCase')}} | {{Spec2('ES6')}} | |
+| {{SpecName('ESDraft', '#sec-string.prototype.tolocalelowercase', 'String.prototype.toLocaleLowerCase')}} | {{Spec2('ESDraft')}} | |
+| {{SpecName('ES Int Draft', '#sup-string.prototype.tolocalelowercase', 'String.prototype.toLocaleLowerCase')}} | {{Spec2('ES Int Draft')}} | ES Intl 2017 added the `locale` parameter. |
+
+## Compatibilidad entre navegadores
+
+{{Compat("javascript.builtins.String.toLocaleLowerCase")}}
+
+## Vea también
+
+- {{jsxref("String.prototype.toLocaleUpperCase()")}}
+- {{jsxref("String.prototype.toLowerCase()")}}
+- {{jsxref("String.prototype.toUpperCase()")}}
diff --git a/files/es/web/javascript/reference/global_objects/typedarray/index.html b/files/es/web/javascript/reference/global_objects/typedarray/index.html
deleted file mode 100644
index 9107d1e61e2010..00000000000000
--- a/files/es/web/javascript/reference/global_objects/typedarray/index.html
+++ /dev/null
@@ -1,318 +0,0 @@
----
-title: TypedArray
-slug: Web/JavaScript/Reference/Global_Objects/TypedArray
-tags:
- - Clase
- - Class
- - JavaScript
- - TypedArray
- - TypedArrays
-translation_of: Web/JavaScript/Reference/Global_Objects/TypedArray
-original_slug: Web/JavaScript/Referencia/Objetos_globales/TypedArray
----
-{{JSRef}}
-
-Un objeto TypedArray describe una vista similar a un arreglo de un búfer de datos binarios subyacente . No existe una propiedad global denominada TypedArray
, ni existe un constructor TypedArray
directamente visible. En cambio, hay una serie de diferentes propiedades globales, cuyos valores son constructores de arreglos tipados para tipos de elementos específicos, que se enumeran a continuación. En las siguientes páginas, encontrarás propiedades y métodos comunes que se pueden utilizar con cualquier arreglo tipado que contenga elementos de cualquier tipo.
-
-{{EmbedInteractiveExample("pages/js/typedarray-constructor.html")}}
-
-La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si deseas contribuir al proyecto de ejemplos interactivos, clona https://github.com/mdn/interactive-examples y envíanos una solicitud de extracción.
-
-
-
-
-Descripción
-
-ECMAScript 2015 define un constructor TypedArray
que sirve como [[Prototype]]
de todos los constructores TypedArray
. Este constructor no está expuesto directamente: no existe una propiedad global %TypedArray%
o TypedArray
. Solo es accesible directamente a través de Object.getPrototypeOf(Int8Array)
y similares. Todos los constructores de TypedArray
heredan propiedades comunes de la función constructora %TypedArray%
. Además, todos los prototipos de arreglos con tipo (TypedArray.
prototype
) tienen %TypedArray%.prototype
como su [[Prototype]]
.
-
-El constructor %TypedArray%
por sí solo no es particularmente útil. Llamarlo o usarlo en una expresión new
arrojará un {{jsxref("TypeError")}}, excepto cuando se usa durante la creación de objetos en motores JS que admiten subclases. Actualmente no existen tales motores, por lo que %TypedArray%
solo es útil para rellenar funciones o propiedades en todos los constructores TypedArray
.
-
-Al crear una instancia de TypedArray
(p. ej., Int8Array
), se crea un arreglo de búfer internamente en la memoria o, si se proporciona un objeto ArrayBuffer
como argumento del constructor, entonces se usa en su lugar. La dirección del búfer se guarda como una propiedad interna de la instancia y todos los métodos de %TypedArray %.prototype
, es decir, establecer el valor y obtener valor, etc.., operan en esa dirección del arreglo de búfer.
-
-Objetos TypedArray
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{jsxref("Int8Array")}}
- -128
a 127
- 1
- Dos enteros complementarios de 8 bits con signo
- byte
- int8_t
-
-
- {{jsxref("Uint8Array")}}
- 0
a 255
- 1
- Entero de 8-bit sin signo
- octet
- uint8_t
-
-
- {{jsxref("Uint8ClampedArray")}}
- 0
a 255
- 1
- Entero de 8 bits sin signo (sujeto)
- octet
- uint8_t
-
-
- {{jsxref("Int16Array")}}
- -32768
a 32767
- 2
- Dos enteros complementarios de 16 bits con signo
- short
- int16_t
-
-
- {{jsxref("Uint16Array")}}
- 0
a 65535
- 2
- Entero de 16 bits sin signo
- Short sin signo
- uint16_t
-
-
- {{jsxref("Int32Array")}}
- -2147483648
a 2147483647
- 4
- dos enteros complementarios de 32 bits con signo
- long
- int32_t
-
-
- {{jsxref("Uint32Array")}}
- 0
a 4294967295
- 4
- Enteros de 32 bits sin signo
- long sin signo
- uint32_t
-
-
- {{jsxref("Float32Array")}}
- 1.2
× 10-38
a 3.4
× 1038
- 4
- Número de coma flotante IEEE de 32 bits (7 dígitos significativos, p. ej., 1.1234567
)
- float sin restricciones
- float
-
-
- {{jsxref("Float64Array")}}
- 5.0
× 10-324
a 1.8
× 10308
- 8
- Número de coma flotante IEEE de 64 bits (16 dígitos significativos, p. Ej., 1.123...15
)
- doble sin restricciones
- double
-
-
- {{jsxref("BigInt64Array")}}
- -263
a 263 -1
- 8
- Dos enteros complementarios de 64 bits con signo
- bigint
- int64_t (long long con signo)
-
-
- {{jsxref("BigUint64Array")}}
- 0
a 264 -1
- 8
- Entero de 64 bits sin signo
- bigint
- uint64_t (long long sin signo)
-
-
-
-
-Constructor
-
-No se puede crear una instancia de este objeto directamente. En su lugar, crea una instancia de un arreglo de un tipo particular, tal como {{jsxref("Int8Array")}} o {{jsxref("BigInt64Array")}}. Todos estos objetos tienen una sintaxis común para sus constructores:
-
-new TypedArray ();
-new TypedArray (length );
-new TypedArray (typedArray );
-new TypedArray (object );
-new TypedArray (buffer [, byteOffset [, length ]]);
-
-
-Donde TypedArray es un constructor para uno de los tipos concretos.
-
-Parámetros
-
-
- length
- Cuando se llama con un argumento length
, se crea un búfer de arreglo interno en la memoria, de tamaño length
multiplicado por BYTES_PER_ELEMENT
bytes, que contienen ceros.
- typedArray
- Cuando se llama con un argumento typedArray
, que puede ser un objeto de cualquiera de los tipos de arreglo con tipo (como Int32Array
), el typedArray
se copia en un nuevo arreglo tipado. Cada valor en typedArray
se convierte al tipo correspondiente del constructor antes de ser copiado en el nuevo arreglo. La longitud del nuevo arreglo tipado será la misma que la longitud del argumento typedArray
.
- object
- Cuando se llama con un argumento object
, se crea un nuevo arreglo tipado como si fuera el método TypedArray .from()
.
- buffer
, byteOffset
, length
- Cuando se llama con un buffer
y, opcionalmente, un byteOffset
y un length
, se crea una nueva vista del arreglo tipado que visualiza el {{jsxref("ArrayBuffer")}} especificado. Los parámetros byteOffset
y length
especifican el rango de memoria que será expuesto por la vista del arreglo tipado. Si se omiten ambos, se visualiza todo el buffer
; si solo se omite length
, se visualiza el resto de buffer
.
-
-
-Propiedades estáticas
-
-
- {{jsxref("TypedArray.BYTES_PER_ELEMENT")}}
- Devuelve un valor numérico del tamaño del elemento para los diferentes objetos TypedArray
.
- {{jsxref("TypedArray.name")}}
- Devuelve el valor de cadena del nombre del constructor (por ejemplo, "Int8Array"
).
- {{jsxref("TypedArray.@@species", "get TypedArray[@@species]")}}
- La función constructora utilizada para crear objetos derivados.
- {{jsxref("TypedArray.prototype")}}
- Prototipo para objetos TypedArray
.
-
-
-Métodos estáticos
-
-
- {{jsxref("TypedArray.from()")}}
- Crea un nuevo TypedArray
a partir de un objeto iterable o similar a un arreglo. Consulta también {{jsxref("Array.from()")}}.
- {{jsxref("TypedArray.of()")}}
- Crea un nuevo TypedArray
con un número variable de argumentos. Consulta también {{jsxref("Array.of()")}}.
-
-
-Propiedades de la instancia
-
-
- {{jsxref("TypedArray.prototype.buffer")}}
- Devuelve el {{jsxref("ArrayBuffer")}} al que hace referencia el arreglo tipado. Corregido en el momento de la construcción y, por lo tanto, de solo lectura .
- {{jsxref("TypedArray.prototype.byteLength")}}
- Devuelve la longitud (en bytes) del arreglo tipado. Corregido en el momento de la construcción y, por lo tanto, de solo lectura.
- {{jsxref("TypedArray.prototype.byteOffset")}}
- Devuelve el desplazamiento (en bytes) del arreglo tipado desde el inicio de su {{jsxref("ArrayBuffer")}}. Corregido en el momento de la construcción y, por lo tanto, de solo lectura.
- {{jsxref("TypedArray.prototype.length")}}
- Devuelve el número de elementos contenidos en el arreglo tipado. Corregido en el momento de la construcción y, por lo tanto, de solo lectura.
-
-
-Métodos de instancia
-
-
- {{jsxref("TypedArray.prototype.copyWithin()")}}
- Copia una secuencia de elementos de arreglo dentro del arreglo. Consulta también {{jsxref("Array.prototype.copyWithin()")}}.
- {{jsxref("TypedArray.prototype.entries()")}}
- Devuelve un nuevo objeto Array Iterator
que contiene los pares clave/valor para cada índice del arreglo. Consulta también {{jsxref("Array.prototype.entries()")}}.
- {{jsxref("TypedArray.prototype.every()")}}
- Comprueba si todos los elementos del arreglo pasan la prueba proporcionada por una función. Consulta también {{jsxref("Array.prototype.every()")}}.
- {{jsxref("TypedArray.prototype.fill()")}}
- Rellena todos los elementos de un arreglo desde un índice inicial hasta un índice final con un valor estático. Consulta también {{jsxref("Array.prototype.fill()")}}.
- {{jsxref("TypedArray.prototype.filter()")}}
- Crea un nuevo arreglo con todos los elementos de este arreglo para la cual la función de filtrado proporcionada devuelve true
. Consulta también {{jsxref("Array.prototype.filter()")}}.
- {{jsxref("TypedArray.prototype.find()")}}
- Devuelve el valor encontrado en el arreglo, si un elemento del arreglo satisface la función de prueba proporcionada, o undefined
si no se encuentra. Consulta también {{jsxref("Array.prototype.find()")}}.
- {{jsxref("TypedArray.prototype.findIndex()")}}
- Devuelve el índice encontrado en el arreglo, si un elemento del arreglo satisface la función de prueba proporcionada o -1
si no se encuentra. Consulta también {{jsxref("Array.prototype.findIndex()")}}.
- {{jsxref("TypedArray.prototype.forEach()")}}
- Llama a una función para cada elemento del arreglo. Consulta también {{jsxref("Array.prototype.forEach()")}}.
- {{jsxref("TypedArray.prototype.includes()")}}
- Determina si un arreglo tipado incluye un determinado elemento, devolviendo true
o false
según corresponda. Consulta también {{jsxref("Array.prototype.includes()")}}.
- {{jsxref("TypedArray.prototype.indexOf()")}}
- Devuelve el primer (mínimo) índice de un elemento dentro del arreglo igual al valor especificado, o -1
si no se encuentra ninguno. Consulta también {{jsxref("Array.prototype.indexOf()")}}.
- {{jsxref("TypedArray.prototype.join()")}}
- Une todos los elementos de un arreglo en una cadena. Consulta también {{jsxref("Array.prototype.join()")}}.
- {{jsxref("TypedArray.prototype.keys()")}}
- Devuelve un nuevo Array Iterator
que contiene las claves para cada índice del arreglo. Consulta también {{jsxref("Array.prototype.keys()")}}.
- {{jsxref("TypedArray.prototype.lastIndexOf()")}}
- Devuelve el último (mayor) índice de un elemento dentro del arreglo igual al valor especificado, o -1
si no se encuentra ninguno. Consulta también {{jsxref("Array.prototype.lastIndexOf()")}}.
- {{jsxref("TypedArray.prototype.map()")}}
- Crea un nuevo arreglo con los resultados de llamar a una función proporcionada en cada elemento de este arreglo. Consulta también {{jsxref("Array.prototype.map()")}}.
- {{jsxref("TypedArray.prototype.reduce()")}}
- Aplica una función contra un acumulador y cada valor del arreglo (de izquierda a derecha) para reducirlo a un solo valor. Consulta también {{jsxref("Array.prototype.reduce()")}}.
- {{jsxref("TypedArray.prototype.reduceRight()")}}
- Aplica una función contra un acumulador y cada valor del arreglo (de derecha a izquierda) para reducirlo a un solo valor. Consulta también {{jsxref("Array.prototype.reduceRight()")}}.
- {{jsxref("TypedArray.prototype.reverse()")}}
- Invierte el orden de los elementos de un arreglo: el primero se convierte en el último y el último en el primero. Consulta también {{jsxref("Array.prototype.reverse()")}}.
- {{jsxref("TypedArray.prototype.set()")}}
- Almacena múltiples valores en el arreglo tipado, leyendo valores de entrada de un arreglo especificado.
- {{jsxref("TypedArray.prototype.slice()")}}
- Extrae una sección de un arreglo y devuelve un nuevo arreglo. Consulta también {{jsxref("Array.prototype.slice()")}}.
- {{jsxref("TypedArray.prototype.some()")}}
- Devuelve true
si al menos un elemento de este arreglo satisface la función de prueba proporcionada. Consulta también {{jsxref("Array.prototype.some()")}}.
- {{jsxref("TypedArray.prototype.sort()")}}
- Ordena los elementos de un arreglo en su lugar y devuelve el arreglo. Consulta también {{jsxref("Array.prototype.sort()")}}.
- {{jsxref("TypedArray.prototype.subarray()")}}
- Devuelve un nuevo TypedArray
del índice del elemento inicial y final dado.
- {{jsxref("TypedArray.prototype.values()")}}
- Devuelve un nuevo objeto Array Iterator
que contiene los valores de cada índice del arreglo. Consulta también {{jsxref("Array.prototype.values()")}}.
- {{jsxref("TypedArray.prototype.toLocaleString()")}}
- Devuelve una cadena localizada que representa el arreglo y sus elementos. Consulta también {{jsxref("Array.prototype.toLocaleString()")}}.
- {{jsxref("TypedArray.prototype.toString()")}}
- Devuelve una cadena que representa el arreglo y sus elementos. Consulta también {{jsxref("Array.prototype.toString()")}}.
- {{jsxref("TypedArray.prototype.@@iterator()", "TypedArray.prototype[@@iterator]()")}}
- Devuelve un nuevo objeto Array Iterator
que contiene los valores de cada índice del arreglo.
-
-
-Ejemplos
-
-Se requiere new
-
-A partir de ECMAScript 2015, los constructores TypedArray
se deben construir con el operador {{jsxref("Operators/new", "new")}}. Llamar a un constructor TypedArray
como una función sin new
arrojará un {{jsxref("TypeError")}}.
-
-var dv = Int8Array([1, 2, 3]);
-// TypeError: llamar a un constructor Int8Array incorporado
-// sin new está prohibido
-
-var dv = new Int8Array([1, 2, 3]);
-
-Acceso a la propiedad
-
-Puedes hacer referencia a elementos en el arreglo utilizando la sintaxis de índice de arreglo estándar (es decir, utilizando la notación entre corchetes). Sin embargo, obtener o establecer propiedades indexadas en arreglos tipados no buscará esta propiedad en la cadena de prototipos, incluso cuando los índices estén fuera de límites. Las propiedades indexadas consultarán el {{jsxref("ArrayBuffer")}} y nunca mirarán las propiedades del objeto. Aún puedes usar propiedades con nombre, al igual que con todos los objetos.
-
-// Configuración y obtención usando la sintaxis de arreglo estándar
-var int16 = new Int16Array(2);
-int16[0] = 42;
-[parcial]console.log(0);
-
-// No se consultan las propiedades indexadas en los prototipos (Fx 25)
-Int8Array.prototype[20] = 'foo';
-(new Int8Array(32))[20]; // 0
-// incluso cuando está fuera del límite
-Int8Array.prototype[20] = 'foo';
-(new Int8Array(8))[20]; // undefined
-// o con enteros negativos
-Int8Array.prototype[-1] = 'foo';
-(new Int8Array(8))[-1]; // undefined
-
-// Sin embargo, se permiten propiedades con nombre (Fx 30)
-Int8Array.prototype.foo = 'bar';
-(new Int8Array(32)).foo; // "bar"
-
-Especificaciones
-
-
-
-
- Especificación
-
-
-
-
- {{SpecName('ESDraft', '#sec-typedarray-objects', 'TypedArray Objects')}}
-
-
-
-
-Compatibilidad del navegador
-
-
-
-{{Compat("javascript.builtins.TypedArray")}}
-
-Ve también
-
-
diff --git a/files/es/web/javascript/reference/global_objects/typedarray/index.md b/files/es/web/javascript/reference/global_objects/typedarray/index.md
new file mode 100644
index 00000000000000..29b0fa189fd930
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/typedarray/index.md
@@ -0,0 +1,210 @@
+---
+title: TypedArray
+slug: Web/JavaScript/Reference/Global_Objects/TypedArray
+tags:
+ - Clase
+ - Class
+ - JavaScript
+ - TypedArray
+ - TypedArrays
+translation_of: Web/JavaScript/Reference/Global_Objects/TypedArray
+original_slug: Web/JavaScript/Referencia/Objetos_globales/TypedArray
+---
+{{JSRef}}
+
+Un objeto **_TypedArray_** describe una vista similar a un arreglo de un [búfer de datos binarios subyacente](/es/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer). No existe una propiedad global denominada `TypedArray`, ni existe un constructor `TypedArray` directamente visible. En cambio, hay una serie de diferentes propiedades globales, cuyos valores son constructores de arreglos tipados para tipos de elementos específicos, que se enumeran a continuación. En las siguientes páginas, encontrarás propiedades y métodos comunes que se pueden utilizar con cualquier arreglo tipado que contenga elementos de cualquier tipo.
+
+{{EmbedInteractiveExample("pages/js/typedarray-constructor.html")}}
+
+La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si deseas contribuir al proyecto de ejemplos interactivos, clona y envíanos una solicitud de extracción.
+
+## Descripción
+
+ECMAScript 2015 define un constructor `TypedArray` que sirve como `[[Prototype]]` de todos los constructores `TypedArray`. Este constructor no está expuesto directamente: no existe una propiedad global `%TypedArray%` o `TypedArray`. Solo es accesible directamente a través de `Object.getPrototypeOf(Int8Array)` y similares. Todos los constructores de `TypedArray` heredan propiedades comunes de la función constructora `%TypedArray%`. Además, todos los prototipos de arreglos con tipo (` TypedArray.``prototype `) tienen `%TypedArray%.prototype` como su `[[Prototype]]`.
+
+El constructor `%TypedArray%` por sí solo no es particularmente útil. Llamarlo o usarlo en una expresión `new` arrojará un {{jsxref("TypeError")}}, excepto cuando se usa durante la creación de objetos en motores JS que admiten subclases. Actualmente no existen tales motores, por lo que `%TypedArray%` solo es útil para rellenar funciones o propiedades en todos los constructores `TypedArray`.
+
+Al crear una instancia de `TypedArray` (p. ej., `Int8Array`), se crea un arreglo de búfer internamente en la memoria o, si se proporciona un objeto `ArrayBuffer` como argumento del constructor, entonces se usa en su lugar. La dirección del búfer se guarda como una propiedad interna de la instancia y todos los métodos de `%TypedArray%.prototype`, es decir, establecer el valor y obtener valor, etc.., operan en esa dirección del arreglo de búfer.
+
+### Objetos TypedArray
+
+| Tipo | Intervalo de valores | Tamaño en bytes | Descripción | Tipo de IDL web | Tipo C equivalente |
+| ---------------------------------------- | ------------------------------ | --------------- | ----------------------------------------------------------------------------------------- | ------------------------- | -------------------------------- |
+| {{jsxref("Int8Array")}} | `-128` a `127` | 1 | Dos enteros complementarios de 8 bits con signo | `byte` | `int8_t` |
+| {{jsxref("Uint8Array")}} | `0` a `255` | 1 | Entero de 8-bit sin signo | `octet` | `uint8_t` |
+| {{jsxref("Uint8ClampedArray")}} | `0` a `255` | 1 | Entero de 8 bits sin signo (sujeto) | `octet` | `uint8_t` |
+| {{jsxref("Int16Array")}} | `-32768` a `32767` | 2 | Dos enteros complementarios de 16 bits con signo | `short` | `int16_t` |
+| {{jsxref("Uint16Array")}} | `0` a `65535` | 2 | Entero de 16 bits sin signo | `Short sin signo` | `uint16_t` |
+| {{jsxref("Int32Array")}} | `-2147483648` a `2147483647` | 4 | dos enteros complementarios de 32 bits con signo | `long` | `int32_t` |
+| {{jsxref("Uint32Array")}} | `0` a `4294967295` | 4 | Enteros de 32 bits sin signo | `long sin signo` | `uint32_t` |
+| {{jsxref("Float32Array")}} | `1.2`×`10-38` a `3.4`×`1038` | 4 | Número de coma flotante IEEE de 32 bits (7 dígitos significativos, p. ej., `1.1234567`) | `float sin restricciones` | `float` |
+| {{jsxref("Float64Array")}} | `5.0`×`10-324` a `1.8`×`10308` | 8 | Número de coma flotante IEEE de 64 bits (16 dígitos significativos, p. Ej., `1.123...15`) | `doble sin restricciones` | `double` |
+| {{jsxref("BigInt64Array")}} | `-263` a `263-1` | 8 | Dos enteros complementarios de 64 bits con signo | `bigint` | `int64_t (long long con signo)` |
+| {{jsxref("BigUint64Array")}} | `0` a `264-1` | 8 | Entero de 64 bits sin signo | `bigint` | `uint64_t (long long sin signo)` |
+
+## Constructor
+
+No se puede crear una instancia de este objeto directamente. En su lugar, crea una instancia de un arreglo de un tipo particular, tal como {{jsxref("Int8Array")}} o {{jsxref("BigInt64Array")}}. Todos estos objetos tienen una sintaxis común para sus constructores:
+
+```
+new TypedArray();
+new TypedArray(length);
+new TypedArray(typedArray);
+new TypedArray(object);
+new TypedArray(buffer [, byteOffset [, length]]);
+```
+
+Donde _TypedArray_ es un constructor para uno de los tipos concretos.
+
+### Parámetros
+
+- `length`
+ - : Cuando se llama con un argumento `length`, se crea un búfer de arreglo interno en la memoria, de tamaño `length` _multiplicado por `BYTES_PER_ELEMENT`_ bytes, que contienen ceros.
+- `typedArray`
+ - : Cuando se llama con un argumento `typedArray`, que puede ser un objeto de cualquiera de los tipos de arreglo con tipo (como `Int32Array`), el `typedArray` se copia en un nuevo arreglo tipado. Cada valor en `typedArray` se convierte al tipo correspondiente del constructor antes de ser copiado en el nuevo arreglo. La longitud del nuevo arreglo tipado será la misma que la longitud del argumento `typedArray`.
+- `object`
+ - : Cuando se llama con un argumento `object`, se crea un nuevo arreglo tipado como si fuera el método `TypedArray.from()`.
+- `buffer`, `byteOffset`, `length`
+ - : Cuando se llama con un `buffer` y, opcionalmente, un `byteOffset` y un `length`, se crea una nueva vista del arreglo tipado que visualiza el {{jsxref("ArrayBuffer")}} especificado. Los parámetros `byteOffset` y `length` especifican el rango de memoria que será expuesto por la vista del arreglo tipado. Si se omiten ambos, se visualiza todo el `buffer`; si solo se omite `length`, se visualiza el resto de `buffer`.
+
+## Propiedades estáticas
+
+- {{jsxref("TypedArray.BYTES_PER_ELEMENT")}}
+ - : Devuelve un valor numérico del tamaño del elemento para los diferentes objetos `TypedArray`.
+- {{jsxref("TypedArray.name")}}
+ - : Devuelve el valor de cadena del nombre del constructor (por ejemplo, `"Int8Array"`).
+- {{jsxref("TypedArray.@@species", "get TypedArray[@@species]")}}
+ - : La función constructora utilizada para crear objetos derivados.
+- {{jsxref("TypedArray.prototype")}}
+ - : Prototipo para objetos `TypedArray`.
+
+## Métodos estáticos
+
+- {{jsxref("TypedArray.from()")}}
+ - : Crea un nuevo `TypedArray` a partir de un objeto iterable o similar a un arreglo. Consulta también {{jsxref("Array.from()")}}.
+- {{jsxref("TypedArray.of()")}}
+ - : Crea un nuevo `TypedArray` con un número variable de argumentos. Consulta también {{jsxref("Array.of()")}}.
+
+## Propiedades de la instancia
+
+- {{jsxref("TypedArray.prototype.buffer")}}
+ - : Devuelve el {{jsxref("ArrayBuffer")}} al que hace referencia el arreglo tipado. Corregido en el momento de la construcción y, por lo tanto, de **solo lectura**.
+- {{jsxref("TypedArray.prototype.byteLength")}}
+ - : Devuelve la longitud (en bytes) del arreglo tipado. Corregido en el momento de la construcción y, por lo tanto, de **solo lectura.**
+- {{jsxref("TypedArray.prototype.byteOffset")}}
+ - : Devuelve el desplazamiento (en bytes) del arreglo tipado desde el inicio de su {{jsxref("ArrayBuffer")}}. Corregido en el momento de la construcción y, por lo tanto, de **solo lectura.**
+- {{jsxref("TypedArray.prototype.length")}}
+ - : Devuelve el número de elementos contenidos en el arreglo tipado. Corregido en el momento de la construcción y, por lo tanto, de **solo lectura.**
+
+## Métodos de instancia
+
+- {{jsxref("TypedArray.prototype.copyWithin()")}}
+ - : Copia una secuencia de elementos de arreglo dentro del arreglo. Consulta también {{jsxref("Array.prototype.copyWithin()")}}.
+- {{jsxref("TypedArray.prototype.entries()")}}
+ - : Devuelve un nuevo objeto `Array Iterator` que contiene los pares clave/valor para cada índice del arreglo. Consulta también {{jsxref("Array.prototype.entries()")}}.
+- {{jsxref("TypedArray.prototype.every()")}}
+ - : Comprueba si todos los elementos del arreglo pasan la prueba proporcionada por una función. Consulta también {{jsxref("Array.prototype.every()")}}.
+- {{jsxref("TypedArray.prototype.fill()")}}
+ - : Rellena todos los elementos de un arreglo desde un índice inicial hasta un índice final con un valor estático. Consulta también {{jsxref("Array.prototype.fill()")}}.
+- {{jsxref("TypedArray.prototype.filter()")}}
+ - : Crea un nuevo arreglo con todos los elementos de este arreglo para la cual la función de filtrado proporcionada devuelve `true`. Consulta también {{jsxref("Array.prototype.filter()")}}.
+- {{jsxref("TypedArray.prototype.find()")}}
+ - : Devuelve el valor encontrado en el arreglo, si un elemento del arreglo satisface la función de prueba proporcionada, o `undefined` si no se encuentra. Consulta también {{jsxref("Array.prototype.find()")}}.
+- {{jsxref("TypedArray.prototype.findIndex()")}}
+ - : Devuelve el índice encontrado en el arreglo, si un elemento del arreglo satisface la función de prueba proporcionada o `-1` si no se encuentra. Consulta también {{jsxref("Array.prototype.findIndex()")}}.
+- {{jsxref("TypedArray.prototype.forEach()")}}
+ - : Llama a una función para cada elemento del arreglo. Consulta también {{jsxref("Array.prototype.forEach()")}}.
+- {{jsxref("TypedArray.prototype.includes()")}}
+ - : Determina si un arreglo tipado incluye un determinado elemento, devolviendo `true` o `false` según corresponda. Consulta también {{jsxref("Array.prototype.includes()")}}.
+- {{jsxref("TypedArray.prototype.indexOf()")}}
+ - : Devuelve el primer (mínimo) índice de un elemento dentro del arreglo igual al valor especificado, o `-1` si no se encuentra ninguno. Consulta también {{jsxref("Array.prototype.indexOf()")}}.
+- {{jsxref("TypedArray.prototype.join()")}}
+ - : Une todos los elementos de un arreglo en una cadena. Consulta también {{jsxref("Array.prototype.join()")}}.
+- {{jsxref("TypedArray.prototype.keys()")}}
+ - : Devuelve un nuevo `Array Iterator` que contiene las claves para cada índice del arreglo. Consulta también {{jsxref("Array.prototype.keys()")}}.
+- {{jsxref("TypedArray.prototype.lastIndexOf()")}}
+ - : Devuelve el último (mayor) índice de un elemento dentro del arreglo igual al valor especificado, o `-1` si no se encuentra ninguno. Consulta también {{jsxref("Array.prototype.lastIndexOf()")}}.
+- {{jsxref("TypedArray.prototype.map()")}}
+ - : Crea un nuevo arreglo con los resultados de llamar a una función proporcionada en cada elemento de este arreglo. Consulta también {{jsxref("Array.prototype.map()")}}.
+- {{jsxref("TypedArray.prototype.reduce()")}}
+ - : Aplica una función contra un acumulador y cada valor del arreglo (de izquierda a derecha) para reducirlo a un solo valor. Consulta también {{jsxref("Array.prototype.reduce()")}}.
+- {{jsxref("TypedArray.prototype.reduceRight()")}}
+ - : Aplica una función contra un acumulador y cada valor del arreglo (de derecha a izquierda) para reducirlo a un solo valor. Consulta también {{jsxref("Array.prototype.reduceRight()")}}.
+- {{jsxref("TypedArray.prototype.reverse()")}}
+ - : Invierte el orden de los elementos de un arreglo: el primero se convierte en el último y el último en el primero. Consulta también {{jsxref("Array.prototype.reverse()")}}.
+- {{jsxref("TypedArray.prototype.set()")}}
+ - : Almacena múltiples valores en el arreglo tipado, leyendo valores de entrada de un arreglo especificado.
+- {{jsxref("TypedArray.prototype.slice()")}}
+ - : Extrae una sección de un arreglo y devuelve un nuevo arreglo. Consulta también {{jsxref("Array.prototype.slice()")}}.
+- {{jsxref("TypedArray.prototype.some()")}}
+ - : Devuelve `true` si al menos un elemento de este arreglo satisface la función de prueba proporcionada. Consulta también {{jsxref("Array.prototype.some()")}}.
+- {{jsxref("TypedArray.prototype.sort()")}}
+ - : Ordena los elementos de un arreglo en su lugar y devuelve el arreglo. Consulta también {{jsxref("Array.prototype.sort()")}}.
+- {{jsxref("TypedArray.prototype.subarray()")}}
+ - : Devuelve un nuevo `TypedArray` del índice del elemento inicial y final dado.
+- {{jsxref("TypedArray.prototype.values()")}}
+ - : Devuelve un nuevo objeto `Array Iterator` que contiene los valores de cada índice del arreglo. Consulta también {{jsxref("Array.prototype.values()")}}.
+- {{jsxref("TypedArray.prototype.toLocaleString()")}}
+ - : Devuelve una cadena localizada que representa el arreglo y sus elementos. Consulta también {{jsxref("Array.prototype.toLocaleString()")}}.
+- {{jsxref("TypedArray.prototype.toString()")}}
+ - : Devuelve una cadena que representa el arreglo y sus elementos. Consulta también {{jsxref("Array.prototype.toString()")}}.
+- {{jsxref("TypedArray.prototype.@@iterator()", "TypedArray.prototype[@@iterator]()")}}
+ - : Devuelve un nuevo objeto `Array Iterator` que contiene los valores de cada índice del arreglo.
+
+## Ejemplos
+
+### Se requiere `new`
+
+A partir de ECMAScript 2015, los constructores `TypedArray` se deben construir con el operador {{jsxref("Operators/new", "new")}}. Llamar a un constructor `TypedArray` como una función sin `new` arrojará un {{jsxref("TypeError")}}.
+
+```js example-bad
+var dv = Int8Array([1, 2, 3]);
+// TypeError: llamar a un constructor Int8Array incorporado
+// sin new está prohibido
+```
+
+```js example-good
+var dv = new Int8Array([1, 2, 3]);
+```
+
+### Acceso a la propiedad
+
+Puedes hacer referencia a elementos en el arreglo utilizando la sintaxis de índice de arreglo estándar (es decir, utilizando la notación entre corchetes). Sin embargo, obtener o establecer propiedades indexadas en arreglos tipados no buscará esta propiedad en la cadena de prototipos, incluso cuando los índices estén fuera de límites. Las propiedades indexadas consultarán el {{jsxref("ArrayBuffer")}} y nunca mirarán las propiedades del objeto. Aún puedes usar propiedades con nombre, al igual que con todos los objetos.
+
+```js
+// Configuración y obtención usando la sintaxis de arreglo estándar
+var int16 = new Int16Array(2);
+int16[0] = 42;
+[parcial]console.log(0);
+
+// No se consultan las propiedades indexadas en los prototipos (Fx 25)
+Int8Array.prototype[20] = 'foo';
+(new Int8Array(32))[20]; // 0
+// incluso cuando está fuera del límite
+Int8Array.prototype[20] = 'foo';
+(new Int8Array(8))[20]; // undefined
+// o con enteros negativos
+Int8Array.prototype[-1] = 'foo';
+(new Int8Array(8))[-1]; // undefined
+
+// Sin embargo, se permiten propiedades con nombre (Fx 30)
+Int8Array.prototype.foo = 'bar';
+(new Int8Array(32)).foo; // "bar"
+```
+
+## Especificaciones
+
+| Especificación |
+| ------------------------------------------------------------------------------------------------ |
+| {{SpecName('ESDraft', '#sec-typedarray-objects', 'TypedArray Objects')}} |
+
+## Compatibilidad del navegador
+
+{{Compat("javascript.builtins.TypedArray")}}
+
+## Ve también
+
+- [Arreglos tipados JavaScript](/es/docs/Web/JavaScript/Typed_arrays)
+- {{jsxref("ArrayBuffer")}}
+- {{jsxref("DataView")}}
+- [TextDecoder](/es/docs/Web/API/TextDecoder) — Ayuda que decodifica cadenas a partir de datos numéricos
diff --git a/files/es/web/javascript/reference/global_objects/weakmap/delete/index.html b/files/es/web/javascript/reference/global_objects/weakmap/delete/index.html
deleted file mode 100644
index b304587ee71148..00000000000000
--- a/files/es/web/javascript/reference/global_objects/weakmap/delete/index.html
+++ /dev/null
@@ -1,79 +0,0 @@
----
-title: WeakMap.prototype.delete()
-slug: Web/JavaScript/Reference/Global_Objects/WeakMap/delete
-tags:
- - ECMAScript6
- - JavaScript
- - Prototype
- - WeakMap
-translation_of: Web/JavaScript/Reference/Global_Objects/WeakMap/delete
-original_slug: Web/JavaScript/Referencia/Objetos_globales/WeakMap/delete
----
-{{JSRef}}
-
-El método delete()
elimina un elemento específico del objeto WeakMap
.
-
-Sintaxis
-
-wm .delete(key);
-
-Parámetros
-
-
- identificador (key)
- Requerido. El identificador del elemento a eliminar en el objeto WeakMap
.
-
-
-Valor de retorno
-
-true
si el elemento del objeto WeakMap
ha sido eliminado correctamente. Y false
si la llave a eliminar no fue encontrada en el objeto WeakMap
o bien, si la llave no es un objeto.
-
-Ejemplos
-
-Utilización del método delete
-
-var wm = new WeakMap();
-wm.set(window, "foo");
-
-wm.delete(window); // Devuelve true. Eliminado correctamente.
-
-wm.has(window); // Devuelve false. El elemento window ya no es parte de WeakMap.
-
-
-Especificaciones
-
-
-
-
- Specification
- Status
- Comment
-
-
- {{SpecName('ES6', '#sec-weakmap.prototype.delete', 'WeakMap.prototype.delete')}}
- {{Spec2('ES6')}}
- Definición inicial.
-
-
- {{SpecName('ESDraft', '#sec-weakmap.prototype.delete', 'WeakMap.prototype.delete')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad con navegadores
-
-{{Compat("javascript.builtins.WeakMap.delete")}}
-
-Notas especificas de Firefox
-
-
- Anterior a SpiderMonkey 38 {{geckoRelease(38)}}, este método lanzaba {{jsxref("TypeError")}} cuando el parámetro key
no era un objeto. Esto ha sido corregido en la versión 38 y posteriormente devuelve false
como parte del estándar de ES6 ({{bug(1127827)}}).
-
-
-Vea también
-
-
- {{jsxref("WeakMap")}}
-
diff --git a/files/es/web/javascript/reference/global_objects/weakmap/delete/index.md b/files/es/web/javascript/reference/global_objects/weakmap/delete/index.md
new file mode 100644
index 00000000000000..196697b6e3823f
--- /dev/null
+++ b/files/es/web/javascript/reference/global_objects/weakmap/delete/index.md
@@ -0,0 +1,61 @@
+---
+title: WeakMap.prototype.delete()
+slug: Web/JavaScript/Reference/Global_Objects/WeakMap/delete
+tags:
+ - ECMAScript6
+ - JavaScript
+ - Prototype
+ - WeakMap
+translation_of: Web/JavaScript/Reference/Global_Objects/WeakMap/delete
+original_slug: Web/JavaScript/Referencia/Objetos_globales/WeakMap/delete
+---
+{{JSRef}}
+
+El método **`delete()`** elimina un elemento específico del objeto `WeakMap` .
+
+## Sintaxis
+
+```
+wm.delete(key);
+```
+
+### Parámetros
+
+- identificador (key)
+ - : Requerido. El identificador del elemento a eliminar en el objeto `WeakMap`.
+
+### Valor de retorno
+
+`true` si el elemento del objeto `WeakMap` ha sido eliminado correctamente. Y `false` si la llave a eliminar no fue encontrada en el objeto `WeakMap` o bien, si la llave no es un objeto.
+
+## Ejemplos
+
+### Utilización del método `delete`
+
+```
+var wm = new WeakMap();
+wm.set(window, "foo");
+
+wm.delete(window); // Devuelve true. Eliminado correctamente.
+
+wm.has(window); // Devuelve false. El elemento window ya no es parte de WeakMap.
+```
+
+## Especificaciones
+
+| Specification | Status | Comment |
+| ---------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------- |
+| {{SpecName('ES6', '#sec-weakmap.prototype.delete', 'WeakMap.prototype.delete')}} | {{Spec2('ES6')}} | Definición inicial. |
+| {{SpecName('ESDraft', '#sec-weakmap.prototype.delete', 'WeakMap.prototype.delete')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad con navegadores
+
+{{Compat("javascript.builtins.WeakMap.delete")}}
+
+## Notas especificas de Firefox
+
+- Anterior a SpiderMonkey 38 {{geckoRelease(38)}}, este método lanzaba {{jsxref("TypeError")}} cuando el parámetro `key` no era un objeto. Esto ha sido corregido en la versión 38 y posteriormente devuelve `false` como parte del estándar de ES6 ({{bug(1127827)}}).
+
+## Vea también
+
+- {{jsxref("WeakMap")}}
diff --git a/files/es/web/javascript/reference/iteration_protocols/index.html b/files/es/web/javascript/reference/iteration_protocols/index.html
deleted file mode 100644
index 5080ed8a7533c2..00000000000000
--- a/files/es/web/javascript/reference/iteration_protocols/index.html
+++ /dev/null
@@ -1,321 +0,0 @@
----
-title: Protocolos de Iteración
-slug: Web/JavaScript/Reference/Iteration_protocols
-tags:
- - ECMAScript6
- - Experimental
- - Intermedio
- - Iterable
- - Iterador
- - JavaScript
-translation_of: Web/JavaScript/Reference/Iteration_protocols
-original_slug: Web/JavaScript/Referencia/Iteration_protocols
----
-{{jsSidebar("More")}}
-
-Las nuevas características de ECMAScript 6 no solo están asociadas a cambios y adiciones de sintaxis o a nuevos objetos nativos, sino también a protocolos. Dichos protocolos puede ser implementados por cualquier objeto en relación a algunas convenciones.
-
-
-
-
-
-
-
-El protocolo iterable
-
-El protocolo iterable le permite a los objetos en JavaScript definir o personalizar su comportamiento de iteración, como por ejemplo qué valores son iterados dentro de una sentencia {{jsxref("Statements/for...of", "for..of")}}. Algunos objetos nativos, como {{jsxref("Array")}} o {{jsxref("Map")}}, tienen un comportamiento de iteración por defecto, mientras otros objetos (como por ejemplo {{jsxref("Object")}}) no.
-
-Para ser iterable, un objeto debe implementar el método @@iterator , lo cual significa que el objeto (o uno de los objetos dentro de su cadena de prototipos ) debe tener una propiedad con un identificador {{jsxref("Symbol")}}.iterator
:
-
-
-
-
- Propiedad
- Valor
-
-
-
-
- [Symbol.iterator]
- Una función sin argumentos que retorna un objeto, de acuerdo al protocolo iterador .
-
-
-
-
-Siempre que un objeto necesite ser iterado (como al comienzo de un for..of
loop), su método @@iterator
es llamado sin argumentos, y el iterador retornado es usado para obtener los valores a ser iterados.
-
-El protocolo iterador
-
-El protocolo iterador define una forma estándar que permite producir una secuencia de valores (sean estos finitos o infinitos).
-
-Un objeto es un iterador cuando este implementa un método next()
con la siguiente semántica:
-
-
-
-
- Propiedad
- Valor
-
-
- next
-
- Una función sin argumentos que retorna un objeto con dos propiedades:
-
-
- done
(boleano)
-
-
- Su valor es true
si el iterador está más allá del final de la secuencia iterada. En este caso value
opcionalmente especifica el valor retornado por el iterador. Los valores retornados son explicados aquí .
- Su valor es false
si el iterador pudo producir el siguiente valor en la secuencia. Esto es equivalente a no especificar la propiedad done
en su totalidad.
-
-
- value
- cualquier valor de JavaScript retornado por el iterador. Puede ser omitido cuando el valor de done
es true
.
-
-
-
-
-
-
-Algunos iteradores son a su vez iterables:
-
-var someArray = [1, 5, 7];
-var someArrayEntries = someArray.entries();
-
-someArrayEntries.toString(); // "[object Array Iterator]"
-someArrayEntries === someArrayEntries[Symbol.iterator](); // true
-
-
-Ejemplos de protocolos de iteración
-
-Un {{jsxref("String")}} es un ejemplo de un objeto iterable nativo:
-
-var someString = "hi";
-typeof someString[Symbol.iterator]; // "function"
-
-
-Para objetos String
su iterador por defecto retorna cada uno de sus caracteres, uno a la vez:
-
-var iterator = someString[Symbol.iterator]();
-iterator + ""; // "[object String Iterator]"
-
-iterator.next(); // { value: "h", done: false }
-iterator.next(); // { value: "i", done: false }
-iterator.next(); // { value: undefined, done: true }
-
-En algunas estructuras nativas del lenguaje como en el caso del operador de propagación spread operator , el mismo protocolo de iteración está presente en su parte interna:
-
-[...someString] // ["h", "i"]
-
-Podemos redefinir el comportamiento de iteración creando nuestro propio @@iterator
:
-
-// es necesario el uso de un objeto creado a partir de la función constructora String,
-// ya que al usar un string primitivo el auto-boxing generaría una referencia temporal
-// a un iterador que luego es descartado en el unbox
-
-var someString = new String("hi");
-
-someString[Symbol.iterator] = function() {
- return { // este es el objeto iterador que retorna un único elemento, la cadena string "bye"
- next: function() {
- if (this._first) {
- this._first = false;
- return { value: "bye", done: false };
- } else {
- return { done: true };
- }
- },
- _first: true
- };
-};
-
-
-Nótese que al redefinir un @@iterator
se puede afectar el comportamiento de construcciones nativas que usan el protocolo de iteración:
-
-[...someString]; // ["bye"]
-someString + ""; // "hi"
-
-
-Ejemplos de iterables
-
-Iterables nativos
-
-{{jsxref("String")}}, {{jsxref("Array")}}, {{jsxref("TypedArray")}}, {{jsxref("Map")}} y {{jsxref("Set")}} son objetos iterables nativos, ya que en su objeto prototipo existe un método @@
iterator.
-
-Iterables personalizados
-
-Podemos crear nuestros propios iterables de la siguiente manera:
-
-var myIterable = {};
-myIterable[Symbol.iterator] = function* () {
- yield 1;
- yield 2;
- yield 3;
-};
-[...myIterable]; // [1, 2, 3]
-
-
-APIs nativas que aceptan iterables
-
-Existen varios APIs que aceptan iterables, como en el caso de: {{jsxref("Map", "Map([iterable])")}}, {{jsxref("WeakMap", "WeakMap([iterable])")}}, {{jsxref("Set", "Set([iterable])")}} y {{jsxref("WeakSet", "WeakSet([iterable])")}}:
-
-var myObj = {};
-new Map([[1,"a"],[2,"b"],[3,"c"]]).get(2); // "b"
-new WeakMap([[{},"a"],[myObj,"b"],[{},"c"]]).get(myObj); // "b"
-new Set([1, 2, 3]).has(3); // true
-new Set("123").has("2"); // true
-new WeakSet(function*() {
- yield {};
- yield myObj;
- yield {};
-}()).has(myObj); // true
-
-
-De igual manera {{jsxref("Promise.all", "Promise.all(iterable)")}}, {{jsxref("Promise.race", "Promise.race(iterable)")}}, y {{jsxref("Array.from", "Array.from()")}}.
-
-Sintaxis que espera un iterable
-
-Algunas declaraciones y expresiones esperan iterables, por ejemplo el bucle for-of
, el operador de propagación spread operator , la expresión Yield*
, y la asignación desestructurada destructuring assignment .
-
-for(let value of ["a", "b", "c"]){
- console.log(value);
-}
-// "a"
-// "b"
-// "c"
-
-[..."abc"]; // ["a", "b", "c"]
-
-function* gen(){
- yield* ["a", "b", "c"];
-}
-
-gen().next(); // { value:"a", done:false }
-
-[a, b, c] = new Set(["a", "b", "c"]);
-a // "a"
-
-
-
-Iterables mal definidos
-
-Un método @@iterator
iterable que no retorne un objeto iterador no está correctamente definido, por lo tanto al ejecutarlo de esta manera podría resultar en excepciones en tiempo de ejecución y otros errores:
-
-var nonWellFormedIterable = {}
-nonWellFormedIterable[Symbol.iterator] = () => 1
-[...nonWellFormedIterable] // TypeError: [] is not a function
-
-
-Ejemplos de iteradores
-
-Iterador simple
-
-function makeIterator(array){
- var nextIndex = 0;
-
- return {
- next: function(){
- return nextIndex < array.length ?
- {value: array[nextIndex++], done: false} :
- {done: true};
- }
- };
-}
-
-var it = makeIterator(['yo', 'ya']);
-
-console.log(it.next().value); // 'yo'
-console.log(it.next().value); // 'ya'
-console.log(it.next().done); // true
-
-
-Iterador infinito
-
-function idMaker(){
- var index = 0;
-
- return {
- next: function(){
- return {value: index++, done: false};
- }
- };
-}
-
-var it = idMaker();
-
-console.log(it.next().value); // '0'
-console.log(it.next().value); // '1'
-console.log(it.next().value); // '2'
-// ...
-
-
-Con un generador
-
-function* makeSimpleGenerator(array){
- var nextIndex = 0;
-
- while(nextIndex < array.length){
- yield array[nextIndex++];
- }
-}
-
-var gen = makeSimpleGenerator(['yo', 'ya']);
-
-console.log(gen.next().value); // 'yo'
-console.log(gen.next().value); // 'ya'
-console.log(gen.next().done); // true
-
-
-
-function* idMaker(){
- var index = 0;
- while(true)
- yield index++;
-}
-
-var gen = idMaker();
-
-console.log(gen.next().value); // '0'
-console.log(gen.next().value); // '1'
-console.log(gen.next().value); // '2'
-// ...
-
-
-¿Un objeto generador es un iterador o un iterable?
-
-Un objeto iterador es tanto un iterador como un iterable:
-
-var aGeneratorObject = function*(){
- yield 1;
- yield 2;
- yield 3;
-}();
-typeof aGeneratorObject.next;
-// "function", ya que tiene un método next, por lo tanto es un iterador
-typeof aGeneratorObject[Symbol.iterator];
-// "function", ya que tiene un método @@iterator, por lo tanto es un iterable
-aGeneratorObject[Symbol.iterator]() === aGeneratorObject;
-// true, ya que su método @@iterator retorna a sí mismo (un iterador), por lo tanto es un iterable bien formado
-[...aGeneratorObject];
-// [1, 2, 3]
-
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES6', '#sec-iteration', 'Iteration')}}
- {{Spec2('ES6')}}
- Definición inicial.
-
-
-
-
-Temas relacionados
-
-Para información adicional acerca de generadores generators en ES6, puede visitar la página específica sobre este tema.
diff --git a/files/es/web/javascript/reference/iteration_protocols/index.md b/files/es/web/javascript/reference/iteration_protocols/index.md
new file mode 100644
index 00000000000000..2f6ebc3adfff13
--- /dev/null
+++ b/files/es/web/javascript/reference/iteration_protocols/index.md
@@ -0,0 +1,294 @@
+---
+title: Protocolos de Iteración
+slug: Web/JavaScript/Reference/Iteration_protocols
+tags:
+ - ECMAScript6
+ - Experimental
+ - Intermedio
+ - Iterable
+ - Iterador
+ - JavaScript
+translation_of: Web/JavaScript/Reference/Iteration_protocols
+original_slug: Web/JavaScript/Referencia/Iteration_protocols
+---
+{{jsSidebar("More")}}Las nuevas características de ECMAScript 6 no solo están asociadas a cambios y adiciones de sintaxis o a nuevos objetos nativos, sino también a protocolos. Dichos protocolos puede ser implementados por cualquier objeto en relación a algunas convenciones.Existen dos protocolos: El[protocolo iterable](#The_.22iterable.22_protocol) y el[protocolo iterador](#The_.22iterator.22_protocol).
+
+## El protocolo iterable
+
+El protocolo **iterable** le permite a los objetos en JavaScript definir o personalizar su comportamiento de iteración, como por ejemplo qué valores son iterados dentro de una sentencia {{jsxref("Statements/for...of", "for..of")}}. Algunos objetos nativos, como {{jsxref("Array")}} o {{jsxref("Map")}}, tienen un comportamiento de iteración por defecto, mientras otros objetos (como por ejemplo {{jsxref("Object")}}) no.
+
+Para ser iterable, un objeto debe implementar el método **@@iterator**, lo cual significa que el objeto (o uno de los objetos dentro de su [cadena de prototipos](/es/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain)) debe tener una propiedad con un identificador {{jsxref("Symbol")}}`.iterator`:
+
+- Propiedad
+ - : `[Symbol.iterator]`
+- Valor
+ - : Una función sin argumentos que retorna un objeto, de acuerdo al [protocolo iterador](#The_.22iterator.22_protocol).
+
+Siempre que un objeto necesite ser iterado (como al comienzo de un `for..of` loop), su método `@@iterator` es llamado sin argumentos, y el **iterador** retornado es usado para obtener los valores a ser iterados.
+
+## El protocolo iterador
+
+El protocolo **iterador** define una forma estándar que permite producir una secuencia de valores (sean estos finitos o infinitos).
+
+Un objeto es un iterador cuando este implementa un método **`next()`** con la siguiente semántica:
+
+- Propiedad
+ - : `next`
+- Valor
+
+ - : Una función sin argumentos que retorna un objeto con dos propiedades:
+
+ - `done` (boleano)
+
+ - Su valor es `true` si el iterador está más allá del final de la secuencia iterada. En este caso `value` opcionalmente especifica el _valor retornado_ por el iterador. Los valores retornados son explicados [aquí](http://www.2ality.com/2013/06/iterators-generators.html#generators-as-threads).
+ - Su valor es `false` si el iterador pudo producir el siguiente valor en la secuencia. Esto es equivalente a no especificar la propiedad `done` en su totalidad.
+
+ - `value` - cualquier valor de JavaScript retornado por el iterador. Puede ser omitido cuando el valor de `done` es `true`.
+
+Algunos iteradores son a su vez iterables:
+
+```js
+var someArray = [1, 5, 7];
+var someArrayEntries = someArray.entries();
+
+someArrayEntries.toString(); // "[object Array Iterator]"
+someArrayEntries === someArrayEntries[Symbol.iterator](); // true
+```
+
+## Ejemplos de protocolos de iteración
+
+Un {{jsxref("String")}} es un ejemplo de un objeto iterable nativo:
+
+```js
+var someString = "hi";
+typeof someString[Symbol.iterator]; // "function"
+```
+
+Para objetos `String` su iterador por defecto retorna cada uno de sus caracteres, uno a la vez:
+
+```js
+var iterator = someString[Symbol.iterator]();
+iterator + ""; // "[object String Iterator]"
+
+iterator.next(); // { value: "h", done: false }
+iterator.next(); // { value: "i", done: false }
+iterator.next(); // { value: undefined, done: true }
+```
+
+En algunas estructuras nativas del lenguaje como en el caso del [operador de propagación _spread operator_](/es/docs/Web/JavaScript/Reference/Operators/Spread_operator), el mismo protocolo de iteración está presente en su parte interna:
+
+```js
+[...someString] // ["h", "i"]
+```
+
+Podemos redefinir el comportamiento de iteración creando nuestro propio `@@iterator`:
+
+```js
+// es necesario el uso de un objeto creado a partir de la función constructora String,
+// ya que al usar un string primitivo el auto-boxing generaría una referencia temporal
+// a un iterador que luego es descartado en el unbox
+
+var someString = new String("hi");
+
+someString[Symbol.iterator] = function() {
+ return { // este es el objeto iterador que retorna un único elemento, la cadena string "bye"
+ next: function() {
+ if (this._first) {
+ this._first = false;
+ return { value: "bye", done: false };
+ } else {
+ return { done: true };
+ }
+ },
+ _first: true
+ };
+};
+```
+
+Nótese que al redefinir un `@@iterator` se puede afectar el comportamiento de construcciones nativas que usan el protocolo de iteración:
+
+```js
+[...someString]; // ["bye"]
+someString + ""; // "hi"
+```
+
+## Ejemplos de iterables
+
+### Iterables nativos
+
+{{jsxref("String")}}, {{jsxref("Array")}}, {{jsxref("TypedArray")}}, {{jsxref("Map")}} y {{jsxref("Set")}} son objetos iterables nativos, ya que en su objeto prototipo existe un método ` @@``iterator. `
+
+### Iterables personalizados
+
+Podemos crear nuestros propios iterables de la siguiente manera:
+
+```js
+var myIterable = {};
+myIterable[Symbol.iterator] = function* () {
+ yield 1;
+ yield 2;
+ yield 3;
+};
+[...myIterable]; // [1, 2, 3]
+```
+
+### APIs nativas que aceptan iterables
+
+Existen varios APIs que aceptan iterables, como en el caso de: {{jsxref("Map", "Map([iterable])")}}, {{jsxref("WeakMap", "WeakMap([iterable])")}}, {{jsxref("Set", "Set([iterable])")}} y {{jsxref("WeakSet", "WeakSet([iterable])")}}:
+
+```js
+var myObj = {};
+new Map([[1,"a"],[2,"b"],[3,"c"]]).get(2); // "b"
+new WeakMap([[{},"a"],[myObj,"b"],[{},"c"]]).get(myObj); // "b"
+new Set([1, 2, 3]).has(3); // true
+new Set("123").has("2"); // true
+new WeakSet(function*() {
+ yield {};
+ yield myObj;
+ yield {};
+}()).has(myObj); // true
+```
+
+De igual manera {{jsxref("Promise.all", "Promise.all(iterable)")}}, {{jsxref("Promise.race", "Promise.race(iterable)")}}, y {{jsxref("Array.from", "Array.from()")}}.
+
+### Sintaxis que espera un iterable
+
+Algunas declaraciones y expresiones esperan iterables, por ejemplo el bucle [`for-of`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of), el[operador de propagación _spread operator_](/es/docs/Web/JavaScript/Reference/Operators/Spread_operator), la expresión [`Yield*`](/en-US/docs/Web/JavaScript/Reference/Operators/yield*), y la [asignación desestructurada _destructuring assignment_](/es/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment).
+
+```js
+for(let value of ["a", "b", "c"]){
+ console.log(value);
+}
+// "a"
+// "b"
+// "c"
+
+[..."abc"]; // ["a", "b", "c"]
+
+function* gen(){
+ yield* ["a", "b", "c"];
+}
+
+gen().next(); // { value:"a", done:false }
+
+[a, b, c] = new Set(["a", "b", "c"]);
+a // "a"
+```
+
+### Iterables mal definidos
+
+Un método `@@iterator` iterable que no retorne un objeto iterador no está correctamente definido, por lo tanto al ejecutarlo de esta manera podría resultar en excepciones en tiempo de ejecución y otros errores:
+
+```js
+var nonWellFormedIterable = {}
+nonWellFormedIterable[Symbol.iterator] = () => 1
+[...nonWellFormedIterable] // TypeError: [] is not a function
+```
+
+## Ejemplos de iteradores
+
+### Iterador simple
+
+```js
+function makeIterator(array){
+ var nextIndex = 0;
+
+ return {
+ next: function(){
+ return nextIndex < array.length ?
+ {value: array[nextIndex++], done: false} :
+ {done: true};
+ }
+ };
+}
+
+var it = makeIterator(['yo', 'ya']);
+
+console.log(it.next().value); // 'yo'
+console.log(it.next().value); // 'ya'
+console.log(it.next().done); // true
+```
+
+### Iterador infinito
+
+```js
+function idMaker(){
+ var index = 0;
+
+ return {
+ next: function(){
+ return {value: index++, done: false};
+ }
+ };
+}
+
+var it = idMaker();
+
+console.log(it.next().value); // '0'
+console.log(it.next().value); // '1'
+console.log(it.next().value); // '2'
+// ...
+```
+
+### Con un generador
+
+```js
+function* makeSimpleGenerator(array){
+ var nextIndex = 0;
+
+ while(nextIndex < array.length){
+ yield array[nextIndex++];
+ }
+}
+
+var gen = makeSimpleGenerator(['yo', 'ya']);
+
+console.log(gen.next().value); // 'yo'
+console.log(gen.next().value); // 'ya'
+console.log(gen.next().done); // true
+
+
+
+function* idMaker(){
+ var index = 0;
+ while(true)
+ yield index++;
+}
+
+var gen = idMaker();
+
+console.log(gen.next().value); // '0'
+console.log(gen.next().value); // '1'
+console.log(gen.next().value); // '2'
+// ...
+```
+
+## ¿Un objeto generador es un iterador o un iterable?
+
+Un [objeto iterador](/es/docs/Web/JavaScript/Reference/Global_Objects/Generator) es tanto un iterador como un iterable:
+
+```js
+var aGeneratorObject = function*(){
+ yield 1;
+ yield 2;
+ yield 3;
+}();
+typeof aGeneratorObject.next;
+// "function", ya que tiene un método next, por lo tanto es un iterador
+typeof aGeneratorObject[Symbol.iterator];
+// "function", ya que tiene un método @@iterator, por lo tanto es un iterable
+aGeneratorObject[Symbol.iterator]() === aGeneratorObject;
+// true, ya que su método @@iterator retorna a sí mismo (un iterador), por lo tanto es un iterable bien formado
+[...aGeneratorObject];
+// [1, 2, 3]
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| -------------------------------------------------------------------- | -------------------- | ------------------- |
+| {{SpecName('ES6', '#sec-iteration', 'Iteration')}} | {{Spec2('ES6')}} | Definición inicial. |
+
+## Temas relacionados
+
+Para información adicional acerca de generadores _generators_ en ES6, puede visitar la [página específica](/es/docs/Web/JavaScript/Reference/Statements/function*) sobre este tema.
diff --git a/files/es/web/javascript/reference/operators/addition/index.html b/files/es/web/javascript/reference/operators/addition/index.html
deleted file mode 100644
index 63fa557a4055b7..00000000000000
--- a/files/es/web/javascript/reference/operators/addition/index.html
+++ /dev/null
@@ -1,78 +0,0 @@
----
-title: Adición (+)
-slug: Web/JavaScript/Reference/Operators/Addition
-translation_of: Web/JavaScript/Reference/Operators/Addition
-original_slug: Web/JavaScript/Referencia/Operadores/Adición
----
-{{jsSidebar("Operators")}}
-
-El operador de adición (+
) produce la suma de operandos numéricos o la concatenación de (cadenas) string.
-
-{{EmbedInteractiveExample("pages/js/expressions-addition.html")}}
-
-
-
-La fuente para este ejemplo interactivo está almacenado en un repositorio Github. Si te gustaría contribuir al proyecto de ejemplos interactivos, por favor clona https://github.com/mdn/interactive-examples y envianos una pull-request.
-
-Sintaxis
-
-Operator: x + y
-
-
-Ejemplos
-
-Adición numérica
-
-// Número + Número -> adición
-1 + 2 // 3
-
-// Booleano + Número -> adición
-true + 1 // 2
-
-// Booleano + Booleano -> adición
-false + false // 0
-
-
-Concatenación de (cadenas) String
-
-// String + String -> concatenación
-'fut' + 'bol' // "futbol"
-
-// Número + String -> concatenación
-5 + 'oh' // "5oh"
-
-// String + Booleano -> concatenación
-'fut' + false // "futfalse"
-
-Especificación
-
-
-
-
- Specification
-
-
- {{SpecName('ESDraft', '#sec-addition-operator-plus', 'Addition operator')}}
-
-
-
-
-Compatibilidad de Explorador
-
-
-
-{{Compat("javascript.operators.addition")}}
-
-También revisa
-
-
diff --git a/files/es/web/javascript/reference/operators/addition/index.md b/files/es/web/javascript/reference/operators/addition/index.md
new file mode 100644
index 00000000000000..01b771fbcc6f27
--- /dev/null
+++ b/files/es/web/javascript/reference/operators/addition/index.md
@@ -0,0 +1,69 @@
+---
+title: Adición (+)
+slug: Web/JavaScript/Reference/Operators/Addition
+translation_of: Web/JavaScript/Reference/Operators/Addition
+original_slug: Web/JavaScript/Referencia/Operadores/Adición
+---
+{{jsSidebar("Operators")}}
+
+El operador de adición (`+`) produce la suma de operandos numéricos o la concatenación de (cadenas) string.
+
+{{EmbedInteractiveExample("pages/js/expressions-addition.html")}}
+
+La fuente para este ejemplo interactivo está almacenado en un repositorio Github. Si te gustaría contribuir al proyecto de ejemplos interactivos, por favor clona y envianos una pull-request.
+
+## Sintaxis
+
+```
+Operator: x + y
+```
+
+## Ejemplos
+
+### Adición numérica
+
+```js
+// Número + Número -> adición
+1 + 2 // 3
+
+// Booleano + Número -> adición
+true + 1 // 2
+
+// Booleano + Booleano -> adición
+false + false // 0
+```
+
+### Concatenación de (cadenas) String
+
+```js
+// String + String -> concatenación
+'fut' + 'bol' // "futbol"
+
+// Número + String -> concatenación
+5 + 'oh' // "5oh"
+
+// String + Booleano -> concatenación
+'fut' + false // "futfalse"
+```
+
+## Especificación
+
+| Specification |
+| ---------------------------------------------------------------------------------------------------- |
+| {{SpecName('ESDraft', '#sec-addition-operator-plus', 'Addition operator')}} |
+
+## Compatibilidad de Explorador
+
+{{Compat("javascript.operators.addition")}}
+
+## También revisa
+
+- [Subtraction operator](/es/docs/Web/JavaScript/Reference/Operators/Subtraction)
+- [Division operator](/es/docs/Web/JavaScript/Reference/Operators/Division)
+- [Multiplication operator](/es/docs/Web/JavaScript/Reference/Operators/Multiplication)
+- [Remainder operator](/es/docs/Web/JavaScript/Reference/Operators/Remainder)
+- [Exponentiation operator](/es/docs/Web/JavaScript/Reference/Operators/Exponentiation)
+- [Increment operator](/es/docs/Web/JavaScript/Reference/Operators/Increment)
+- [Decrement operator](/es/docs/Web/JavaScript/Reference/Operators/Decrement)
+- [Unary negation operator](/es/docs/Web/JavaScript/Reference/Operators/Unary_negation)
+- [Unary plus operator](/es/docs/Web/JavaScript/Reference/Operators/Unary_plus)
diff --git a/files/es/web/javascript/reference/operators/comma_operator/index.html b/files/es/web/javascript/reference/operators/comma_operator/index.html
deleted file mode 100644
index 8e57f7eb2b1702..00000000000000
--- a/files/es/web/javascript/reference/operators/comma_operator/index.html
+++ /dev/null
@@ -1,85 +0,0 @@
----
-title: Operador Coma
-slug: Web/JavaScript/Reference/Operators/Comma_Operator
-tags:
- - JavaScript
-translation_of: Web/JavaScript/Reference/Operators/Comma_Operator
-original_slug: Web/JavaScript/Referencia/Operadores/operador_coma
----
-{{jsSidebar("Operators")}}
-
-El operador coma evalua cada uno de sus operandos (de izquierda a derecha) y retorna el valor del último operando.
-
-Sintaxis
-
-expr1 , expr2, expr3...
-
-Parámetros
-
-
- expr1
, expr2, expr3...
- Cualquier expresión.
-
-
-Descripción
-
-Puede usar el operador coma cuando deseé mútiples expresiones en una localización que requiere una sola expresión. El uso más común de este operador es proveer múltiples parámetros en un búcle for
-
-Ejemplo
-
-Si a es un array de dos dimensiones con 10 elementos en un lado, el siguiente código usa el operador coma para incrementar dos variables a la vez. Note que la coma en la sentencia var no es el operador coma, porque no existe adentro de una expresión.Más bien, es un carácter especial en sentencias var para combinar a múltiples de ellas en una sola. Sin embargo, esa coma se comporta casi igual que el operador coma. El código imprime los valores de los elementos diagonales en el array:
-
-for (var i = 0, j = 9; i <= 9; i++, j--)
- document.writeln("a[" + i + "][" + j + "] = " + a[i][j]);
-
-Procesar y luego retornar:
-
-Otro ejemplo de lo que se puede hacer con el operador coma es procesar antes de retornar. Como se mencionó, solo el último elemento será retornado pero todos los otros también van a ser evaluados. Así, se puede hacer:
-
-function myFunc () {
- var x = 0;
-
- return (x += 1, x); // the same as return ++x;
-}
-
-Específicaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ESDraft', '#sec-comma-operator', 'Comma operator')}}
- {{Spec2('ESDraft')}}
-
-
-
- {{SpecName('ES6', '#sec-comma-operator', 'Comma operator')}}
- {{Spec2('ES6')}}
-
-
-
- {{SpecName('ES5.1', '#sec-11.14', 'Comma operator')}}
- {{Spec2('ES5.1')}}
-
-
-
- {{SpecName('ES1', '#sec-11.14', 'Comma operator')}}
- {{Spec2('ES1')}}
- Definición inicial
-
-
-
-
-Compatibilidad en navegadores
-
-{{Compat("javascript.operators.comma")}}
-
-Ver también
-
-
diff --git a/files/es/web/javascript/reference/operators/comma_operator/index.md b/files/es/web/javascript/reference/operators/comma_operator/index.md
new file mode 100644
index 00000000000000..fdb12144e0cab4
--- /dev/null
+++ b/files/es/web/javascript/reference/operators/comma_operator/index.md
@@ -0,0 +1,64 @@
+---
+title: Operador Coma
+slug: Web/JavaScript/Reference/Operators/Comma_Operator
+tags:
+ - JavaScript
+translation_of: Web/JavaScript/Reference/Operators/Comma_Operator
+original_slug: Web/JavaScript/Referencia/Operadores/operador_coma
+---
+{{jsSidebar("Operators")}}
+
+El operador coma evalua cada uno de sus operandos (de izquierda a derecha) y retorna el valor del último operando.
+
+## Sintaxis
+
+```
+expr1, expr2, expr3...
+```
+
+## Parámetros
+
+- `expr1`, `expr2, expr3...`
+ - : Cualquier expresión.
+
+## Descripción
+
+Puede usar el operador coma cuando deseé mútiples expresiones en una localización que requiere una sola expresión. El uso más común de este operador es proveer múltiples parámetros en un búcle for
+
+## Ejemplo
+
+Si a es un array de dos dimensiones con 10 elementos en un lado, el siguiente código usa el operador coma para incrementar dos variables a la vez. Note que la coma en la sentencia var **no** es el operador coma, porque no existe adentro de una expresión.Más bien, es un carácter especial en sentencias var para combinar a múltiples de ellas en una sola. Sin embargo, esa coma se comporta casi igual que el operador coma. El código imprime los valores de los elementos diagonales en el array:
+
+```
+for (var i = 0, j = 9; i <= 9; i++, j--)
+ document.writeln("a[" + i + "][" + j + "] = " + a[i][j]);
+```
+
+### Procesar y luego retornar:
+
+Otro ejemplo de lo que se puede hacer con el operador coma es procesar antes de retornar. Como se mencionó, solo el último elemento será retornado pero todos los otros también van a ser evaluados. Así, se puede hacer:
+
+```js
+function myFunc () {
+ var x = 0;
+
+ return (x += 1, x); // the same as return ++x;
+}
+```
+
+## Específicaciones
+
+| Especificación | Estado | Comentario |
+| ------------------------------------------------------------------------------------ | ---------------------------- | ------------------ |
+| {{SpecName('ESDraft', '#sec-comma-operator', 'Comma operator')}} | {{Spec2('ESDraft')}} | |
+| {{SpecName('ES6', '#sec-comma-operator', 'Comma operator')}} | {{Spec2('ES6')}} | |
+| {{SpecName('ES5.1', '#sec-11.14', 'Comma operator')}} | {{Spec2('ES5.1')}} | |
+| {{SpecName('ES1', '#sec-11.14', 'Comma operator')}} | {{Spec2('ES1')}} | Definición inicial |
+
+## Compatibilidad en navegadores
+
+{{Compat("javascript.operators.comma")}}
+
+## Ver también
+
+- [for loop](/es/docs/Web/JavaScript/Reference/Statements/for)
diff --git a/files/es/web/javascript/reference/operators/conditional_operator/index.html b/files/es/web/javascript/reference/operators/conditional_operator/index.html
deleted file mode 100644
index 3aee3b51a200d7..00000000000000
--- a/files/es/web/javascript/reference/operators/conditional_operator/index.html
+++ /dev/null
@@ -1,124 +0,0 @@
----
-title: Operador condicional (ternario)
-slug: Web/JavaScript/Reference/Operators/Conditional_Operator
-tags:
- - JavaScript
- - Operador
-translation_of: Web/JavaScript/Reference/Operators/Conditional_Operator
-original_slug: Web/JavaScript/Referencia/Operadores/Conditional_Operator
----
-{{jsSidebar("Operators")}}
-
-El
operador condicional (
ternario ) es el único operador en JavaScript que tiene tres operandos. Este operador se usa con frecuencia como atajo para la instrucción
if .
-
-
-
-Sintaxis
-
-condición ? expr1 : expr2
-
-Parámetros
-
-
- condición
- Una expresión que se evalúa como true o false.
-
- expr1
, expr2
-
- Expresión con valores de algún tipo.
-
- Descripción
-
-
-
-Si la condición
es true
, el operador retorna el valor de la expr1
; de lo contrario, devuelve el valor de expr2
. Por ejemplo, para mostrar un mensaje diferente en función del valor de la variable isMember,
se puede usar esta declaración:
-
-"La Cuota es de: " + (isMember ? "$2.00" : "$10.00")
-
-
-También puedes asignar variables dependiendo del resultado de la condición ternaria:
-
-var elvisLives = Math.PI > 4 ? "Sip" : "Nop";
-
-También es posible realizar evaluaciones ternarias múltiples (Nota: El operador condicional es asociativo):
-
-var firstCheck = false,
- secondCheck = false,
- access = firstCheck ? "Acceso Denegado" : secondCheck ? "Acceso Denegado" : "Acceso Permitido";
-
-console.log( access ); // muestra "Acceso Permitido"
-
-También puede usar operaciones ternarias en espacio vacío con el propósito de realizar diferentes operaciones:
-
-var stop = false, age = 16;
-
-age > 18 ? location.assign("continue.html") : stop = true;
-
-
-También puede realizar más de una operación por caso, separándolas con una coma:
-
-var stop = false, age = 23;
-
-age > 18 ? (
- alert("OK, puedes continuar."),
- location.assign("continue.html")
-) : (
- stop = true,
- alert("Disculpa, eres menor de edad!")
-);
-
-
-También puede realizar más de una operación durante la asignación de un valor. En este caso, el último valor separado por una coma del paréntesis será el valor asignado .
-
-var age = 16;
-
-var url = age > 18 ? (
- alert("OK, puedes continuar."),
- // alert devuelve "undefined", pero será ignorado porque
- // no es el último valor separado por comas del paréntesis
- "continue.html" // el valor a ser asignado si age > 18
-) : (
- alert("Eres menor de edad!"),
- alert("Disculpa :-("),
- // etc. etc.
- "stop.html" // el valor a ser asignado si !(age > 18)
-);
-
-location.assign(url); // "stop.html"
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES6', '#sec-conditional-operator', 'Conditional Operator')}}
- {{Spec2('ES6')}}
-
-
-
- {{SpecName('ES5.1', '#sec-11.12', 'The conditional operator')}}
- {{Spec2('ES5.1')}}
-
-
-
- {{SpecName('ES1', '#sec-11.12', 'The conditional operator')}}
- {{Spec2('ES1')}}
- Definición inicial implementada en JavaScript 1.0.
-
-
-
-
-Compatibilidad de navegadores
-
-{{Compat("javascript.operators.conditional")}}
-
-Véase también
-
-
diff --git a/files/es/web/javascript/reference/operators/conditional_operator/index.md b/files/es/web/javascript/reference/operators/conditional_operator/index.md
new file mode 100644
index 00000000000000..134379ec5d5400
--- /dev/null
+++ b/files/es/web/javascript/reference/operators/conditional_operator/index.md
@@ -0,0 +1,105 @@
+---
+title: Operador condicional (ternario)
+slug: Web/JavaScript/Reference/Operators/Conditional_Operator
+tags:
+ - JavaScript
+ - Operador
+translation_of: Web/JavaScript/Reference/Operators/Conditional_Operator
+original_slug: Web/JavaScript/Referencia/Operadores/Conditional_Operator
+---
+{{jsSidebar("Operators")}}El **operador condicional** (**ternario**) es el único operador en JavaScript que tiene tres operandos. Este operador se usa con frecuencia como atajo para la instrucción [if](/es/docs/Web/JavaScript/Referencia/Sentencias/if...else).
+
+## Sintaxis
+
+```
+condición ? expr1 : expr2
+```
+
+### Parámetros
+
+- `condición`
+ - : Una expresión que se evalúa como true o false.
+- `expr1`, `expr2`
+ - : Expresión con valores de algún tipo.
+
+## Descripción
+
+Si la `condición` es `true`, el operador retorna el valor de la `expr1`; de lo contrario, devuelve el valor de `expr2`. Por ejemplo, para mostrar un mensaje diferente en función del valor de la variable _`isMember,`_ se puede usar esta declaración:
+
+```js
+"La Cuota es de: " + (isMember ? "$2.00" : "$10.00")
+```
+
+También puedes asignar variables dependiendo del resultado de la condición ternaria:
+
+```js
+var elvisLives = Math.PI > 4 ? "Sip" : "Nop";
+```
+
+También es posible realizar evaluaciones ternarias múltiples (Nota: El operador condicional es asociativo):
+
+```js
+var firstCheck = false,
+ secondCheck = false,
+ access = firstCheck ? "Acceso Denegado" : secondCheck ? "Acceso Denegado" : "Acceso Permitido";
+
+console.log( access ); // muestra "Acceso Permitido"
+```
+
+También puede usar operaciones ternarias en espacio vacío con el propósito de realizar diferentes operaciones:
+
+```js
+var stop = false, age = 16;
+
+age > 18 ? location.assign("continue.html") : stop = true;
+```
+
+También puede realizar más de una operación por caso, separándolas con una coma:
+
+```js
+var stop = false, age = 23;
+
+age > 18 ? (
+ alert("OK, puedes continuar."),
+ location.assign("continue.html")
+) : (
+ stop = true,
+ alert("Disculpa, eres menor de edad!")
+);
+```
+
+También puede realizar más de una operación durante la asignación de un valor. En este caso, **_el último valor separado por una coma del paréntesis_ será el valor asignado**.
+
+```js
+var age = 16;
+
+var url = age > 18 ? (
+ alert("OK, puedes continuar."),
+ // alert devuelve "undefined", pero será ignorado porque
+ // no es el último valor separado por comas del paréntesis
+ "continue.html" // el valor a ser asignado si age > 18
+) : (
+ alert("Eres menor de edad!"),
+ alert("Disculpa :-("),
+ // etc. etc.
+ "stop.html" // el valor a ser asignado si !(age > 18)
+);
+
+location.assign(url); // "stop.html"
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| ------------------------------------------------------------------------------------------------ | ------------------------ | -------------------------------------------------- |
+| {{SpecName('ES6', '#sec-conditional-operator', 'Conditional Operator')}} | {{Spec2('ES6')}} | |
+| {{SpecName('ES5.1', '#sec-11.12', 'The conditional operator')}} | {{Spec2('ES5.1')}} | |
+| {{SpecName('ES1', '#sec-11.12', 'The conditional operator')}} | {{Spec2('ES1')}} | Definición inicial implementada en JavaScript 1.0. |
+
+## Compatibilidad de navegadores
+
+{{Compat("javascript.operators.conditional")}}
+
+## Véase también
+
+- [if statement](/es/docs/Web/JavaScript/Reference/Statements/if...else)
diff --git a/files/es/web/javascript/reference/operators/destructuring_assignment/index.html b/files/es/web/javascript/reference/operators/destructuring_assignment/index.html
deleted file mode 100644
index 6f37eab0e67a7f..00000000000000
--- a/files/es/web/javascript/reference/operators/destructuring_assignment/index.html
+++ /dev/null
@@ -1,443 +0,0 @@
----
-title: La desestructuración
-slug: Web/JavaScript/Reference/Operators/Destructuring_assignment
-tags:
- - Característica del lenguaje
- - Desestructuración
- - Desestructurar arreglos y objetos anidados
- - ECMAScript 2015
- - ES6
- - JavaScript
- - Objetos anidados y desestructuración de array
- - Operador
-translation_of: Web/JavaScript/Reference/Operators/Destructuring_assignment
-original_slug: Web/JavaScript/Referencia/Operadores/Destructuring_assignment
----
-{{jsSidebar("Operators", "Operadores")}}
-
-La sintaxis de desestructuración es una expresión de JavaScript que permite desempacar valores de arreglos o propiedades de objetos en distintas variables.
-
-{{EmbedInteractiveExample("pages/js/expressions-destructuringassignment.html", "taller")}}
-
-La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si deseas contribuir al proyecto de ejemplos interactivos, clona
https://github.com/mdn/interactive-examples y envíanos una solicitud de extracción.
-
-Sintaxis
-
-let a, b, rest;
-[a, b] = [10, 20];
-console.log(a); // 10
-console.log(b); // 20
-
-[a, b, ...rest] = [10, 20, 30, 40, 50];
-console.log(a); // 10
-console.log(b); // 20
-console.log(rest); // [30, 40, 50]
-
-({ a, b } = { a: 10, b: 20 });
-console.log(a); // 10
-console.log(b); // 20
-
-
-// Propuesta de etapa 4 (terminada)
-({a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40});
-console.log(a); // 10
-console.log(b); // 20
-console.log(rest); // {c: 30, d: 40}
-
-
-Descripción
-
-Las expresiones de objetos y arreglos literales proporcionan una manera fácil de crear paquetes de datos ad hoc .
-
-const x = [1, 2, 3, 4, 5];
-
-La desestructuración utiliza una sintaxis similar, pero en el lado izquierdo de la asignación para definir qué valores desempacar de la variable origen.
-
-const x = [1, 2, 3, 4, 5];
-const [y, z] = x;
-console.log(y); // 1
-console.log(z); // 2
-
-
-Esta capacidad es similar a las características presentes en lenguajes como Perl y Python.
-
-Ejemplos
-
-Desestructuración de arreglos
-
-Asignación básica de variables
-
-const foo = ['one', 'two', 'three'];
-
-const [red, yellow, green] = foo;
-console.log(red); // "one"
-console.log(yellow); // "two"
-console.log(green); // "three"
-
-
-Asignación separada de la declaración
-
-A una variable se le puede asignar su valor mediante una desestructuración separada de la declaración de la variable.
-
-let a, b;
-
-[a, b] = [1, 2];
-console.log(a); // 1
-console.log(b); // 2
-
-
-Valores predeterminados
-
-A una variable se le puede asignar un valor predeterminado, en el caso de que el valor desempacado del arreglo sea undefined
.
-
-let a, b;
-
-[a=5, b=7] = [1];
-console.log(a); // 1
-console.log(b); // 7
-
-
-Intercambio de variables
-
-Los valores de dos variables se pueden intercambiar en una expresión de desestructuración.
-
-Sin desestructurar la asignación, intercambiar dos valores requiere una variable temporal (o, en algunos lenguajes de bajo nivel, el algoritmo del truco XOR-swap ).
-
-let a = 1;
-let b = 3;
-
-[a, b] = [b, a];
-console.log(a); // 3
-console.log(b); // 1
-
-const arr = [1,2,3];
-[arr[2], arr[1]] = [arr[1], arr[2]];
-console.log(arr); // [1,3,2]
-
-
-
-Analizar un arreglo devuelto por una función
-
-Siempre ha sido posible devolver un arreglo desde una función. La desestructuración puede hacer que trabajar con un valor de retorno de arreglo sea más conciso.
-
-En este ejemplo, f()
devuelve los valores [1, 2]
como su salida, que se puede procesar en una sola línea con desestructuración.
-
-function f() {
- return [1, 2];
-}
-
-let a, b;
-[a, b] = f();
-console.log(a); // 1
-console.log(b); // 2
-
-
-Ignorar algunos valores devueltos
-
-Puedes ignorar los valores de retorno que no te interesan:
-
-function f() {
- return [1, 2, 3];
-}
-
-const [a, , b] = f();
-console.log(a); // 1
-console.log(b); // 3
-
-const [c] = f();
-console.log(c); // 1
-
-
-También puedes ignorar todos los valores devueltos:
-
-[,,] = f();
-
-
-Asignar el resto de un arreglo a una variable
-
-Al desestructurar un arreglo, puedes desempacar y asignar la parte restante a una variable usando el patrón rest
o:
-
-const [a, ...b] = [1, 2, 3];
-console.log(a); // 1
-console.log(b); // [2, 3]
-
-Ten en cuenta que se lanzará un {{jsxref("SyntaxError")}} si se usa una coma final en el lado derecho con un elemento rest
o:
-
-const [a, ...b,] = [1, 2, 3];
-
-// SyntaxError: el elemento rest no puede tener una coma al final
-// Siempre considera usar el operador rest como último elemento
-
-
-Desempacar valores coincidentes con una expresión regular
-
-Cuando el método de expresión regular {{jsxref("Global_Objects/RegExp/exec", "exec()", "", 1)}} encuentra una coincidencia, devuelve un arreglo que contiene primero toda la parte coincidente de la cadena y luego las partes de la cadena que coinciden con cada grupo entre paréntesis en la expresión regular. La desestructuración te permite desempacar fácilmente las partes de este arreglo, ignorando la coincidencia completa si no es necesaria.
-
-function parseProtocol(url) {
- const parsedURL = /^(\w+)\:\/\/([^\/]+)\/(.*)$/.exec(url);
- if (!parsedURL) {
- return false;
- }
- console.log(parsedURL);
- // ["https://developer.mozilla.org/es/Web/JavaScript",
- "https", "developer.mozilla.org", "es/Web/JavaScript"]
-
- const [, protocol, fullhost, fullpath] = parsedURL;
- return protocol;
-}
-
-console.log(parseProtocol('https://developer.mozilla.org/es/Web/JavaScript'));
-// "https"
-
-
-Desestructuración de objetos
-
-Asignación básica
-
-const user = {
- id: 42,
- is_verified: true
-};
-
-const {id, is_verified} = user;
-
-console.log(id); // 42
-console.log(is_verified); // true
-
-
-Asignación sin declaración
-
-A una variable se le puede asignar su valor con desestructuración separada de su declaración.
-
-let a, b;
-
-({a, b} = {a: 1, b: 2});
-
-
-
Notas : los paréntesis (...)
alrededor de la declaración de asignación son obligatorios cuando se usa la desestructuración de un objeto literal sin una declaración.
-
-
{a, b} = {a: 1, b: 2}
no es una sintaxis independiente válida, debido a que {a, b}
en el lado izquierdo se considera un bloque y no un objeto literal.
-
-
Sin embargo, ({a, b} = {a: 1, b: 2})
es válido, al igual que const {a, b} = {a: 1, b: 2}
-
-
tu expresión ( ... )
debe estar precedida por un punto y coma o se puede usar para ejecutar una función en la línea anterior.
-
-
-Asignar a nuevos nombres de variable
-
-Una propiedad se puede desempacar de un objeto y asignar a una variable con un nombre diferente al de la propiedad del objeto.
-
-const o = {p: 42, q: true};
-const {p: foo, q: bar} = o;
-
-console.log(foo); // 42
-console.log(bar); // true
-
-Aquí, por ejemplo, const {p: foo} = o
toma del objeto o
la propiedad llamada p
y la asigna a una variable local llamada foo
.
-
-Valores predeterminados
-
-A una variable se le puede asignar un valor predeterminado, en el caso de que el valor desempacado del objeto sea undefined
.
-
-const {a = 10, b = 5} = {a: 3};
-
-console.log(a); // 3
-console.log(b); // 5
-
-Asignar nombres a nuevas variables y proporcionar valores predeterminados
-
-Una propiedad puede ser ambas
-
-
- Desempacada de un objeto y asignada a una variable con un nombre diferente.
- Se le asigna un valor predeterminado en caso de que el valor desempacado sea undefined
.
-
-
-const {a: aa = 10, b: bb = 5} = {a: 3};
-
-console.log(aa); // 3
-console.log(bb); // 5
-
-
-Desempacar campos de objetos pasados como parámetro de función
-
-const user = {
- id: 42,
- displayName: 'jdoe',
- fullName: {
- firstName: 'John',
- lastName: 'Doe'
- }
-};
-
-function userId({id}) {
- return id;
-}
-
-function whois({displayName, fullName: {firstName: name}}) {
- return `${displayName} es ${name}`;
-}
-
-console.log(userId(user)); // 42
-console.log(whois(user)); // "jdoe es John"
-
-Esto desempaca el id
, displayName
y firstName
del objeto user
y los imprime.
-
-Establecer el valor predeterminado de un parámetro de función
-
-function drawChart({size = 'big', coords = {x: 0, y: 0}, radius = 25} = {}) {
- console.log(size, coords, radius);
- // haz un dibujo de gráfico
-}
-
-drawChart({
- coords: {x: 18, y: 30},
- radius: 30
-});
-
-
-
En la firma de la función para drawChart
anterior, el lado izquierdo desestructurado se asigna a un objeto literal vacío en el lado derecho: {size = 'big', coords = {x: 0, y: 0}, radius = 25} = {}
. También podrías haber escrito la función sin la asignación del lado derecho. Sin embargo, si omites la asignación del lado derecho, la función buscará al menos un argumento para ser proporcionado cuando se invoca, mientras que en su forma actual, simplemente puedes llamar a drawChart()
sin proporcionar ningún parámetro. El diseño actual es útil si deseas poder llamar a la función sin proporcionar ningún parámetro, el otro puede ser útil cuando deseas asegurarte de que se pase un objeto a la función.
-
-
-Desestructuración de arreglos y objetos anidados
-
-const metadata = {
- title: 'Scratchpad',
- translations: [
- {
- locale: 'de',
- localization_tags: [],
- last_edit: '2020-08-29T08:43:37',
- url: '/de/docs/Tools/Scratchpad',
- title: 'JavaScript-Umgebung'
- }
- ],
- url: '/es/docs/Tools/Scratchpad'
-};
-
-let {
- title: englishTitle, // renombrar
- translations: [
- {
- title: localeTitle, // renombrar
- },
- ],
-} = metadata;
-
-console.log(englishTitle); // "Scratchpad"
-console.log(localeTitle); // "JavaScript-Umgebung"
-
-Iteración "for...of
" y desestructuración
-
-const people = [
- {
- name: 'Mike Smith',
- family: {
- mother: 'Jane Smith',
- father: 'Harry Smith',
- sister: 'Samantha Smith'
- },
- age: 35
- },
- {
- name: 'Tom Jones',
- family: {
- mother: 'Norah Jones',
- father: 'Richard Jones',
- brother: 'Howard Jones'
- },
- age: 25
- }
-];
-
-for (const {name: n, family: {father: f}} of people) {
- console.log('Nombre: ' + n + ', Padre: ' + f);
-}
-
-// "Nombre: Mike Smith, Padre: Harry Smith"
-// "Nombre: Tom Jones, Padre: Richard Jones"
-
-
-Nombres de propiedades de objetos calculados y desestructuración
-
-Los nombres de propiedad calculados, como en un {{jsxref("Operators/Object_initializer", "Objeto literal", "#Computed_property_names", 1)}}, se pueden usar con la desestructuración.
-
-let key = 'z';
-let {[key]: foo} = {z: 'bar'};
-
-console.log(foo); // "bar"
-
-
-Rest
en la desestructuración de objetos
-
-La propuesta Propiedades rest
/propagación para ECMAScript (etapa 4) agrega la sintaxis {{jsxref("Functions/rest_parameters", "rest", "", 1)}} para desestructurar. Las propiedades de rest
recopilan las claves de propiedades enumerables restantes que aún no han sido seleccionadas por el patrón de desestructuración.
-
-let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40}
-a; // 10
-b; // 20
-rest; // { c: 30, d: 40 }
-
-Identificador de JavaScript no válido como nombre de propiedad
-
-La desestructuración se puede utilizar con nombres de propiedad que no son {{Glossary("Identifier", "identificadores")}} válidos en JavaScript proporcionando un identificador alternativo que sea válido.
-
-const foo = { 'fizz-buzz': true };
-const { 'fizz-buzz': fizzBuzz } = foo;
-
-console.log(fizzBuzz); // "true"
-
-
-Desestructuración combinada de arreglos y objetos
-
-La desestructuración de arreglos y objetos se puede combinar. Supongamos que deseas manipular el tercer elemento del siguiente arreglo props
, y luego deseas la propiedad name
en el objeto, puedes hacer lo siguiente:
-
-const props = [
- { id: 1, name: 'Fizz'},
- { id: 2, name: 'Buzz'},
- { id: 3, name: 'FizzBuzz'}
-];
-
-const [,, { name }] = props;
-
-console.log(name); // "FizzBuzz"
-
-
-Se busca la cadena de prototipos al desestructurar el objeto.
-
-Al deconstruir un objeto, si no se accede a una propiedad en sí misma, continuará buscando a lo largo de la cadena de prototipos.
-
-let obj = {self: '123'};
-obj.__proto__.prot = '456';
-const {self, prot} = obj;
-// self "123"
-// prot "456" (Acceso a la cadena de prototipos)
-
-Especificaciones
-
-
-
-
- Especificación
-
-
-
-
- {{SpecName('ESDraft', '#sec-destructuring-assignment', 'Desestructuración de asignación')}}
-
-
-
-
-Compatibilidad del navegador
-
-
-
-
-
{{Compat("javascript.operators.destructuring")}}
-
-
-Ve también
-
-
diff --git a/files/es/web/javascript/reference/operators/destructuring_assignment/index.md b/files/es/web/javascript/reference/operators/destructuring_assignment/index.md
new file mode 100644
index 00000000000000..a16b998f486beb
--- /dev/null
+++ b/files/es/web/javascript/reference/operators/destructuring_assignment/index.md
@@ -0,0 +1,456 @@
+---
+title: La desestructuración
+slug: Web/JavaScript/Reference/Operators/Destructuring_assignment
+tags:
+ - Característica del lenguaje
+ - Desestructuración
+ - Desestructurar arreglos y objetos anidados
+ - ECMAScript 2015
+ - ES6
+ - JavaScript
+ - Objetos anidados y desestructuración de array
+ - Operador
+translation_of: Web/JavaScript/Reference/Operators/Destructuring_assignment
+original_slug: Web/JavaScript/Referencia/Operadores/Destructuring_assignment
+---
+{{jsSidebar("Operators", "Operadores")}}
+
+La sintaxis de **desestructuración** es una expresión de JavaScript que permite desempacar valores de arreglos o propiedades de objetos en distintas variables.
+
+{{EmbedInteractiveExample("pages/js/expressions-destructuringassignment.html", "taller")}}La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si deseas contribuir al proyecto de ejemplos interactivos, clona y envíanos una solicitud de extracción.
+
+## Sintaxis
+
+```js
+let a, b, rest;
+[a, b] = [10, 20];
+console.log(a); // 10
+console.log(b); // 20
+
+[a, b, ...rest] = [10, 20, 30, 40, 50];
+console.log(a); // 10
+console.log(b); // 20
+console.log(rest); // [30, 40, 50]
+
+({ a, b } = { a: 10, b: 20 });
+console.log(a); // 10
+console.log(b); // 20
+
+
+// Propuesta de etapa 4 (terminada)
+({a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40});
+console.log(a); // 10
+console.log(b); // 20
+console.log(rest); // {c: 30, d: 40}
+```
+
+## Descripción
+
+Las expresiones de objetos y arreglos literales proporcionan una manera fácil de crear paquetes de datos _ad hoc_.
+
+```js
+const x = [1, 2, 3, 4, 5];
+```
+
+La desestructuración utiliza una sintaxis similar, pero en el lado izquierdo de la asignación para definir qué valores desempacar de la variable origen.
+
+```js
+const x = [1, 2, 3, 4, 5];
+const [y, z] = x;
+console.log(y); // 1
+console.log(z); // 2
+```
+
+Esta capacidad es similar a las características presentes en lenguajes como Perl y Python.
+
+## Ejemplos
+
+### Desestructuración de arreglos
+
+#### Asignación básica de variables
+
+```js
+const foo = ['one', 'two', 'three'];
+
+const [red, yellow, green] = foo;
+console.log(red); // "one"
+console.log(yellow); // "two"
+console.log(green); // "three"
+```
+
+#### Asignación separada de la declaración
+
+A una variable se le puede asignar su valor mediante una desestructuración separada de la declaración de la variable.
+
+```js
+let a, b;
+
+[a, b] = [1, 2];
+console.log(a); // 1
+console.log(b); // 2
+```
+
+#### Valores predeterminados
+
+A una variable se le puede asignar un valor predeterminado, en el caso de que el valor desempacado del arreglo sea `undefined`.
+
+```js
+let a, b;
+
+[a=5, b=7] = [1];
+console.log(a); // 1
+console.log(b); // 7
+```
+
+#### Intercambio de variables
+
+Los valores de dos variables se pueden intercambiar en una expresión de desestructuración.
+
+Sin desestructurar la asignación, intercambiar dos valores requiere una variable temporal (o, en algunos lenguajes de bajo nivel, el algoritmo del [truco XOR-swap](https://en.wikipedia.org/wiki/XOR_swap_algorithm)).
+
+```js
+let a = 1;
+let b = 3;
+
+[a, b] = [b, a];
+console.log(a); // 3
+console.log(b); // 1
+
+const arr = [1,2,3];
+[arr[2], arr[1]] = [arr[1], arr[2]];
+console.log(arr); // [1,3,2]
+```
+
+#### Analizar un arreglo devuelto por una función
+
+Siempre ha sido posible devolver un arreglo desde una función. La desestructuración puede hacer que trabajar con un valor de retorno de arreglo sea más conciso.
+
+En este ejemplo, `f()` devuelve los valores `[1, 2]` como su salida, que se puede procesar en una sola línea con desestructuración.
+
+```js
+function f() {
+ return [1, 2];
+}
+
+let a, b;
+[a, b] = f();
+console.log(a); // 1
+console.log(b); // 2
+```
+
+#### Ignorar algunos valores devueltos
+
+Puedes ignorar los valores de retorno que no te interesan:
+
+```js
+function f() {
+ return [1, 2, 3];
+}
+
+const [a, , b] = f();
+console.log(a); // 1
+console.log(b); // 3
+
+const [c] = f();
+console.log(c); // 1
+```
+
+También puedes ignorar todos los valores devueltos:
+
+```js
+[,,] = f();
+```
+
+#### Asignar el resto de un arreglo a una variable
+
+Al desestructurar un arreglo, puedes desempacar y asignar la parte restante a una variable usando el patrón `rest`o:
+
+```js
+const [a, ...b] = [1, 2, 3];
+console.log(a); // 1
+console.log(b); // [2, 3]
+```
+
+Ten en cuenta que se lanzará un {{jsxref("SyntaxError")}} si se usa una coma final en el lado derecho con un elemento `rest`o:
+
+```js example-bad
+const [a, ...b,] = [1, 2, 3];
+
+// SyntaxError: el elemento rest no puede tener una coma al final
+// Siempre considera usar el operador rest como último elemento
+```
+
+#### Desempacar valores coincidentes con una expresión regular
+
+Cuando el método de expresión regular {{jsxref("Global_Objects/RegExp/exec", "exec()", "", 1)}} encuentra una coincidencia, devuelve un arreglo que contiene primero toda la parte coincidente de la cadena y luego las partes de la cadena que coinciden con cada grupo entre paréntesis en la expresión regular. La desestructuración te permite desempacar fácilmente las partes de este arreglo, ignorando la coincidencia completa si no es necesaria.
+
+```js
+function parseProtocol(url) {
+ const parsedURL = /^(\w+)\:\/\/([^\/]+)\/(.*)$/.exec(url);
+ if (!parsedURL) {
+ return false;
+ }
+ console.log(parsedURL);
+ // ["https://developer.mozilla.org/es/Web/JavaScript",
+ "https", "developer.mozilla.org", "es/Web/JavaScript"]
+
+ const [, protocol, fullhost, fullpath] = parsedURL;
+ return protocol;
+}
+
+console.log(parseProtocol('https://developer.mozilla.org/es/Web/JavaScript'));
+// "https"
+```
+
+### Desestructuración de objetos
+
+#### Asignación básica
+
+```js
+const user = {
+ id: 42,
+ is_verified: true
+};
+
+const {id, is_verified} = user;
+
+console.log(id); // 42
+console.log(is_verified); // true
+```
+
+#### Asignación sin declaración
+
+A una variable se le puede asignar su valor con desestructuración separada de su declaración.
+
+```js
+let a, b;
+
+({a, b} = {a: 1, b: 2});
+```
+
+> **Nota:** Los paréntesis `(...)` alrededor de la declaración de asignación son obligatorios cuando se usa la desestructuración de un objeto literal sin una declaración.
+>
+> `{a, b} = {a: 1, b: 2}` no es una sintaxis independiente válida, debido a que `{a, b}` en el lado izquierdo se considera un bloque y no un objeto literal.
+>
+> Sin embargo, `({a, b} = {a: 1, b: 2})` es válido, al igual que `const {a, b} = {a: 1, b: 2}`
+>
+> tu expresión `( ... )` debe estar precedida por un punto y coma o se puede usar para ejecutar una función en la línea anterior.
+
+#### Asignar a nuevos nombres de variable
+
+Una propiedad se puede desempacar de un objeto y asignar a una variable con un nombre diferente al de la propiedad del objeto.
+
+```js
+const o = {p: 42, q: true};
+const {p: foo, q: bar} = o;
+
+console.log(foo); // 42
+console.log(bar); // true
+```
+
+Aquí, por ejemplo, `const {p: foo} = o` toma del objeto `o` la propiedad llamada `p` y la asigna a una variable local llamada `foo`.
+
+#### Valores predeterminados
+
+A una variable se le puede asignar un valor predeterminado, en el caso de que el valor desempacado del objeto sea `undefined`.
+
+```js
+const {a = 10, b = 5} = {a: 3};
+
+console.log(a); // 3
+console.log(b); // 5
+```
+
+#### Asignar nombres a nuevas variables y proporcionar valores predeterminados
+
+Una propiedad puede ser ambas
+
+- Desempacada de un objeto y asignada a una variable con un nombre diferente.
+- Se le asigna un valor predeterminado en caso de que el valor desempacado sea `undefined`.
+
+```js
+const {a: aa = 10, b: bb = 5} = {a: 3};
+
+console.log(aa); // 3
+console.log(bb); // 5
+```
+
+#### Desempacar campos de objetos pasados como parámetro de función
+
+```js
+const user = {
+ id: 42,
+ displayName: 'jdoe',
+ fullName: {
+ firstName: 'John',
+ lastName: 'Doe'
+ }
+};
+
+function userId({id}) {
+ return id;
+}
+
+function whois({displayName, fullName: {firstName: name}}) {
+ return `${displayName} es ${name}`;
+}
+
+console.log(userId(user)); // 42
+console.log(whois(user)); // "jdoe es John"
+```
+
+Esto desempaca el `id`, `displayName` y `firstName` del objeto `user` y los imprime.
+
+#### Establecer el valor predeterminado de un parámetro de función
+
+```js
+function drawChart({size = 'big', coords = {x: 0, y: 0}, radius = 25} = {}) {
+ console.log(size, coords, radius);
+ // haz un dibujo de gráfico
+}
+
+drawChart({
+ coords: {x: 18, y: 30},
+ radius: 30
+});
+```
+
+> **Nota:** En la firma de la función para **`drawChart`** anterior, el lado izquierdo desestructurado se asigna a un objeto literal vacío en el lado derecho: `{size = 'big', coords = {x: 0, y: 0}, radius = 25} = {}`. También podrías haber escrito la función sin la asignación del lado derecho. Sin embargo, si omites la asignación del lado derecho, la función buscará al menos un argumento para ser proporcionado cuando se invoca, mientras que en su forma actual, simplemente puedes llamar a **`drawChart()`** sin proporcionar ningún parámetro. El diseño actual es útil si deseas poder llamar a la función sin proporcionar ningún parámetro, el otro puede ser útil cuando deseas asegurarte de que se pase un objeto a la función.
+
+#### Desestructuración de arreglos y objetos anidados
+
+```js
+const metadata = {
+ title: 'Scratchpad',
+ translations: [
+ {
+ locale: 'de',
+ localization_tags: [],
+ last_edit: '2020-08-29T08:43:37',
+ url: '/de/docs/Tools/Scratchpad',
+ title: 'JavaScript-Umgebung'
+ }
+ ],
+ url: '/es/docs/Tools/Scratchpad'
+};
+
+let {
+ title: englishTitle, // renombrar
+ translations: [
+ {
+ title: localeTitle, // renombrar
+ },
+ ],
+} = metadata;
+
+console.log(englishTitle); // "Scratchpad"
+console.log(localeTitle); // "JavaScript-Umgebung"
+```
+
+#### Iteración "`for...of`" y desestructuración
+
+```js
+const people = [
+ {
+ name: 'Mike Smith',
+ family: {
+ mother: 'Jane Smith',
+ father: 'Harry Smith',
+ sister: 'Samantha Smith'
+ },
+ age: 35
+ },
+ {
+ name: 'Tom Jones',
+ family: {
+ mother: 'Norah Jones',
+ father: 'Richard Jones',
+ brother: 'Howard Jones'
+ },
+ age: 25
+ }
+];
+
+for (const {name: n, family: {father: f}} of people) {
+ console.log('Nombre: ' + n + ', Padre: ' + f);
+}
+
+// "Nombre: Mike Smith, Padre: Harry Smith"
+// "Nombre: Tom Jones, Padre: Richard Jones"
+```
+
+#### Nombres de propiedades de objetos calculados y desestructuración
+
+Los nombres de propiedad calculados, como en un {{jsxref("Operators/Object_initializer", "Objeto literal", "#Computed_property_names", 1)}}, se pueden usar con la desestructuración.
+
+```js
+let key = 'z';
+let {[key]: foo} = {z: 'bar'};
+
+console.log(foo); // "bar"
+```
+
+#### `Rest` en la desestructuración de objetos
+
+La propuesta [Propiedades `rest`/propagación para ECMAScript](https://github.com/tc39/proposal-object-rest-spread) (etapa 4) agrega la sintaxis {{jsxref("Functions/rest_parameters", "rest", "", 1)}} para desestructurar. Las propiedades de `rest` recopilan las claves de propiedades enumerables restantes que aún no han sido seleccionadas por el patrón de desestructuración.
+
+```js
+let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40}
+a; // 10
+b; // 20
+rest; // { c: 30, d: 40 }
+```
+
+#### Identificador de JavaScript no válido como nombre de propiedad
+
+La desestructuración se puede utilizar con nombres de propiedad que no son {{Glossary("Identifier", "identificadores")}} válidos en JavaScript proporcionando un identificador alternativo que sea válido.
+
+```js
+const foo = { 'fizz-buzz': true };
+const { 'fizz-buzz': fizzBuzz } = foo;
+
+console.log(fizzBuzz); // "true"
+```
+
+#### Desestructuración combinada de arreglos y objetos
+
+La desestructuración de arreglos y objetos se puede combinar. Supongamos que deseas manipular el tercer elemento del siguiente arreglo `props`, y luego deseas la propiedad `name` en el objeto, puedes hacer lo siguiente:
+
+```js
+const props = [
+ { id: 1, name: 'Fizz'},
+ { id: 2, name: 'Buzz'},
+ { id: 3, name: 'FizzBuzz'}
+];
+
+const [,, { name }] = props;
+
+console.log(name); // "FizzBuzz"
+```
+
+#### Se busca la cadena de prototipos al desestructurar el objeto.
+
+Al deconstruir un objeto, si no se accede a una propiedad en sí misma, continuará buscando a lo largo de la cadena de prototipos.
+
+```js
+let obj = {self: '123'};
+obj.__proto__.prot = '456';
+const {self, prot} = obj;
+// self "123"
+// prot "456" (Acceso a la cadena de prototipos)
+```
+
+## Especificaciones
+
+| Especificación |
+| ---------------------------------------------------------------------------------------------------------------------------- |
+| {{SpecName('ESDraft', '#sec-destructuring-assignment', 'Desestructuración de asignación')}} |
+
+## Compatibilidad del navegador
+
+{{Compat("javascript.operators.destructuring")}}
+
+## Ve también
+
+- {{jsxref("Operators/Assignment_Operators", "Operadores de asignación", "", 1)}}
+- ["ES6 en profundidad: Desestructuración" en hacks.mozilla.org](https://hacks.mozilla.org/2015/05/es6-in-depth-destructuring/)
diff --git a/files/es/web/javascript/reference/operators/equality/index.html b/files/es/web/javascript/reference/operators/equality/index.html
deleted file mode 100644
index e516eb15c9fbf3..00000000000000
--- a/files/es/web/javascript/reference/operators/equality/index.html
+++ /dev/null
@@ -1,130 +0,0 @@
----
-title: Comparación (==)
-slug: Web/JavaScript/Reference/Operators/Equality
-tags:
- - JS
- - JavaScript
- - Operador de comparacion
- - Operadores
- - Referências
-translation_of: Web/JavaScript/Reference/Operators/Equality
-original_slug: Web/JavaScript/Referencia/Operadores/Comparacion
----
-{{jsSidebar("Operators")}}
-
-El operador de comparacion (==
) comprueba si sus dos operandos son iguales y devuelve un resultado booleano. A diferencia del operador de igualdad estricta (===
), es que este convierte y compara operandos que son de diferentes tipos.
-
-{{EmbedInteractiveExample("pages/js/expressions-equality.html")}}
-
-The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone
https://github.com/mdn/interactive-examples and send us a pull request.
-
-Sintaxis
-
-x == y
-
-
-Descripción
-
-Los operadores de igualdad (==
y !=
) Utilizan el algoritmo de comparación de igualdad abstracta para comparar dos operandos. Esto se puede resumir a grandes rasgos como:
-
-
- Si los operandos ambos son objetos, devuelve true
solo si ambos operandos hacen referencia al mismo objeto.
- Si un operando es null
y el otro undefined
, devuelve verdadero(true
).
- Si los operandos son de diferente tipos, intenta convertirlos al mismo tipo antes de comparar:
-
- Al comparar un número con una cadena, convierte la cadena en un valor numérico.
- Si uno de los operandos es booleano, convierte el operando booleano en 1 si es verdadero y en 0 en el caso de falso.
- Si uno de los operandos es un objeto y el otro es un número o una cadena, convierte el objeto en una primitiva utilizando los métodos valueOf()
y toString()
del objeto.
-
-
- Si los operandos tienen el mismo tipo, se comparan de la siguiente manera:
-
- String
: devuelve verdadero solo si ambos operandos tienen los mismos caracteres y en el mismo orden.
- Number
: devuelve verdadero solo si ambos operandos tienen el mismo valor. +0
y -0
se tratan como el mismo valor. Si alguno de los operandos es NaN
, devuelve falso.
- Boolean
: retorna verdadero solo si ambos operandos son verdaderos o falsos.
-
-
-
-
-La diferencia más notable entre este operador y el operador de igualdad estricta (===
) es que el operador de igualdad estricta no realiza la conversión de tipos.
-
-Ejemplos
-
-Comparación sin conversión de tipo
-
-1 == 1; // true
-"Hola" == "Hola"; // true
-
-Comparación con conversión de tipos
-
-"1" == 1; // true
-1 == "1"; // true
-0 == false; // true
-0 == null; // false
-0 == undefined; // false
-0 == !!null; // true, Operador Logico NOT
-0 == !!undefined; // true, Operador Logico NOT
-null == undefined; // true
-
-const number1 = new Number(3);
-const number2 = new Number(3);
-number1 == 3; // true
-number1 == number2; // false
-
-Comparación de objetos
-
-const object1 = {"key": "value"}
-const object2 = {"key": "value"};
-
-object1 == object2 // false
-object2 == object2 // true
-
-Comparar String y objetos String
-
-Tenga en cuenta que las cadenas construidas con new String()
son objetos. Si compara uno de estos con un String literal, el objeto String se convertirá en un String
literal y se comparará el contenido. Sin embargo, si ambos operandos son objetos de tipo String, entonces se comparan como objetos y deben hacer referencia al mismo objeto para que la comparación sea exitosa:
-
-const string1 = "Hola";
-const string2 = String("Hola");
-const string3 = new String("Hola");
-const string4 = new String("Hola");
-
-console.log(string1 == string2); // true
-console.log(string1 == string3); // true
-console.log(string2 == string3); // true
-console.log(string3 == string4); // false
-console.log(string4 == string4); // true
-
-Comparación de fechas y cadenas
-
-const d = new Date('December 17, 1995 03:24:00');
-const s = d.toString(); // Por ejemplo: "Sun Dec 17 1995 03:24:00 GMT-0800 (Hora estándar del Pacífico)"
-console.log(d == s); //true
-
-Especificaciones
-
-
-
-
- Especificaciones
-
-
-
-
- {{SpecName('ESDraft', '#sec-equality-operators', 'Equality operators')}}
-
-
-
-
-Compatibilidad con Navegadores
-
-
-
-{{Compat("javascript.operators.equality")}}
-
-Ver también
-
-
diff --git a/files/es/web/javascript/reference/operators/equality/index.md b/files/es/web/javascript/reference/operators/equality/index.md
new file mode 100644
index 00000000000000..3ec7165a8e34bb
--- /dev/null
+++ b/files/es/web/javascript/reference/operators/equality/index.md
@@ -0,0 +1,121 @@
+---
+title: Comparación (==)
+slug: Web/JavaScript/Reference/Operators/Equality
+tags:
+ - JS
+ - JavaScript
+ - Operador de comparacion
+ - Operadores
+ - Referências
+translation_of: Web/JavaScript/Reference/Operators/Equality
+original_slug: Web/JavaScript/Referencia/Operadores/Comparacion
+---
+{{jsSidebar("Operators")}}
+
+El operador de comparacion (`==`) comprueba si sus dos operandos son iguales y devuelve un resultado booleano. A diferencia del operador de igualdad estricta (`===`), es que este convierte y compara operandos que son de diferentes tipos.
+
+{{EmbedInteractiveExample("pages/js/expressions-equality.html")}}The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone and send us a pull request.
+
+## Sintaxis
+
+```
+x == y
+```
+
+## Descripción
+
+Los operadores de igualdad (`==`y `!=`) Utilizan el algoritmo de comparación de igualdad abstracta para comparar dos operandos. Esto se puede resumir a grandes rasgos como:
+
+- Si los operandos ambos son objetos, devuelve `true`solo si ambos operandos hacen referencia al mismo objeto.
+- Si un operando es `null`y el otro `undefined`, devuelve verdadero(`true`).
+- Si los operandos son de diferente tipos, intenta convertirlos al mismo tipo antes de comparar:
+
+ - Al comparar un número con una cadena, convierte la cadena en un valor numérico.
+ - Si uno de los operandos es booleano, convierte el operando booleano en 1 si es verdadero y en 0 en el caso de falso.
+ - Si uno de los operandos es un objeto y el otro es un número o una cadena, convierte el objeto en una primitiva utilizando los métodos `valueOf()`y `toString()` del objeto.
+
+- Si los operandos tienen el mismo tipo, se comparan de la siguiente manera:
+
+ - `String`: devuelve verdadero solo si ambos operandos tienen los mismos caracteres y en el mismo orden.
+ - `Number`: devuelve verdadero solo si ambos operandos tienen el mismo valor. `+0` y `-0` se tratan como el mismo valor. Si alguno de los operandos es `NaN`, devuelve falso.
+ - `Boolean`: retorna verdadero solo si ambos operandos son verdaderos o falsos.
+
+La diferencia más notable entre este operador y el operador de igualdad estricta (`===`) es que el operador de igualdad estricta no realiza la conversión de tipos.
+
+## Ejemplos
+
+### Comparación sin conversión de tipo
+
+```js
+1 == 1; // true
+"Hola" == "Hola"; // true
+```
+
+### Comparación con conversión de tipos
+
+```js
+"1" == 1; // true
+1 == "1"; // true
+0 == false; // true
+0 == null; // false
+0 == undefined; // false
+0 == !!null; // true, Operador Logico NOT
+0 == !!undefined; // true, Operador Logico NOT
+null == undefined; // true
+
+const number1 = new Number(3);
+const number2 = new Number(3);
+number1 == 3; // true
+number1 == number2; // false
+```
+
+### Comparación de objetos
+
+```js
+const object1 = {"key": "value"}
+const object2 = {"key": "value"};
+
+object1 == object2 // false
+object2 == object2 // true
+```
+
+### Comparar String y objetos String
+
+Tenga en cuenta que las cadenas construidas con `new String()`son objetos. Si compara uno de estos con un String literal, el objeto String se convertirá en un `String` literal y se comparará el contenido. Sin embargo, si ambos operandos son objetos de tipo String, entonces se comparan como objetos y deben hacer referencia al mismo objeto para que la comparación sea exitosa:
+
+```js
+const string1 = "Hola";
+const string2 = String("Hola");
+const string3 = new String("Hola");
+const string4 = new String("Hola");
+
+console.log(string1 == string2); // true
+console.log(string1 == string3); // true
+console.log(string2 == string3); // true
+console.log(string3 == string4); // false
+console.log(string4 == string4); // true
+```
+
+### Comparación de fechas y cadenas
+
+```js
+const d = new Date('December 17, 1995 03:24:00');
+const s = d.toString(); // Por ejemplo: "Sun Dec 17 1995 03:24:00 GMT-0800 (Hora estándar del Pacífico)"
+console.log(d == s); //true
+```
+
+## Especificaciones
+
+| Especificaciones |
+| ------------------------------------------------------------------------------------------------ |
+| {{SpecName('ESDraft', '#sec-equality-operators', 'Equality operators')}} |
+
+## Compatibilidad con Navegadores
+
+{{Compat("javascript.operators.equality")}}
+
+## Ver también
+
+- [Inequality operator](/es/docs/Web/JavaScript/Reference/Operators/Inequality)
+- [Strict equality operator](/es/docs/Web/JavaScript/Reference/Operators/Strict_equality)
+- [Strict inequality operator](/es/docs/Web/JavaScript/Reference/Operators/Strict_inequality)
diff --git a/files/es/web/javascript/reference/operators/function_star_/index.html b/files/es/web/javascript/reference/operators/function_star_/index.html
deleted file mode 100644
index 9c0429d22e539f..00000000000000
--- a/files/es/web/javascript/reference/operators/function_star_/index.html
+++ /dev/null
@@ -1,92 +0,0 @@
----
-title: expresión function*
-slug: Web/JavaScript/Reference/Operators/function*
-tags:
- - ECMAScript 2015
- - Expresión Primaria
- - Function
- - Iterator
- - JavaScript
- - Operator
-translation_of: Web/JavaScript/Reference/Operators/function*
-original_slug: Web/JavaScript/Referencia/Operadores/function*
----
-{{jsSidebar("Operators")}}
-
-La palabra clave function*
puede ser utilizada para definir una función generadora en una expresión.
-
-{{EmbedInteractiveExample("pages/js/expressions-functionasteriskexpression.html")}}
-
-El código fuente de este ejemplo interactivo se encuentra almacenado en un repositorio GitHub. Si le gustaría contribuir al proyecto de ejemplos interactivos, por favor clone https://github.com/mdn/interactive-examples y envíenos un pull request.
-
-Sintaxis
-
-function* [nombre ]([param1 [, param2[ , ..., paramN ]]]) {
- sentencias
-}
-
-Parámetros
-
-
- nombre
- Nombre de la función. Puede ser omitido, en cuyo caso la función es anínima . El nombre sólo es local al cuerpo de la función.
- paramN
- Nombre de un parámetro a ser pasado a la función. Una función puede tener hasta 255 argumentos.
- sentencias
- Sentencias que componen el cuerpo de la función.
-
-
-Descripción
-
-Una expresión function*
es muy similar y tiene casi la misma sintaxis que una {{jsxref('Statements/function*', 'function* statement')}}. La principal diferencia entre una expresión function*
y una sentencia function*
es el nombre de la función , que en expresiones function*
puede ser omitido para creaar funciones generadoras anónimas . Para más información vea también el capítulo acerca de funciones .
-
-Ejemplos
-
-El siguiente ejemplo define una función generadora sin nombre y la asigna a x
. La función produce el cuadrado de su argumento:
-
-var x = function*(y) {
- yield y * y;
-};
-
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES2015', '#', 'function*')}}
- {{Spec2('ES2015')}}
- Definición Inicial.
-
-
- {{SpecName('ESDraft', '#', 'function*')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad con navegadores
-
-
-
-{{Compat("javascript.operators.function_star")}}
-
-Vea también
-
-
- {{jsxref("Statements/function*", "Sentencia function*")}}
- Objeto {{jsxref("GeneratorFunction")}}
- El protocolo iterable
- {{jsxref("Operators/yield", "yield")}}
- {{jsxref("Operators/yield*", "yield*")}}
- Objeto {{jsxref("Function")}}
- {{jsxref("Statements/function", "Sentencia function")}}
- {{jsxref("Operators/function", "Expresión function")}}
- {{jsxref("Functions_and_function_scope", "Funciones y alcance de funciones")}}
-
diff --git a/files/es/web/javascript/reference/operators/function_star_/index.md b/files/es/web/javascript/reference/operators/function_star_/index.md
new file mode 100644
index 00000000000000..954ba1de3f6435
--- /dev/null
+++ b/files/es/web/javascript/reference/operators/function_star_/index.md
@@ -0,0 +1,74 @@
+---
+title: expresión function*
+slug: Web/JavaScript/Reference/Operators/function*
+tags:
+ - ECMAScript 2015
+ - Expresión Primaria
+ - Function
+ - Iterator
+ - JavaScript
+ - Operator
+translation_of: Web/JavaScript/Reference/Operators/function*
+original_slug: Web/JavaScript/Referencia/Operadores/function*
+---
+{{jsSidebar("Operators")}}
+
+La palabra clave **`function*`** puede ser utilizada para definir una función generadora en una expresión.
+
+{{EmbedInteractiveExample("pages/js/expressions-functionasteriskexpression.html")}}
+
+El código fuente de este ejemplo interactivo se encuentra almacenado en un repositorio GitHub. Si le gustaría contribuir al proyecto de ejemplos interactivos, por favor clone y envíenos un pull request.
+
+## Sintaxis
+
+```
+function* [nombre]([param1[, param2[, ..., paramN]]]) {
+ sentencias
+}
+```
+
+### Parámetros
+
+- `nombre`
+ - : Nombre de la función. Puede ser omitido, en cuyo caso la función es _anínima_. El nombre sólo es local al cuerpo de la función.
+- `paramN`
+ - : Nombre de un parámetro a ser pasado a la función. Una función puede tener hasta 255 argumentos.
+- `sentencias`
+ - : Sentencias que componen el cuerpo de la función.
+
+## Descripción
+
+Una expresión `function*` es muy similar y tiene casi la misma sintaxis que una {{jsxref('Statements/function*', 'function* statement')}}. La principal diferencia entre una expresión `function*` y una sentencia `function*` es el _nombre de la función_, que en expresiones `function*` puede ser omitido para creaar funciones generadoras _anónimas_. Para más información vea también el capítulo acerca de [funciones](/es/docs/Web/JavaScript/Reference/Functions).
+
+## Ejemplos
+
+El siguiente ejemplo define una función generadora sin nombre y la asigna a `x`. La función produce el cuadrado de su argumento:
+
+```js
+var x = function*(y) {
+ yield y * y;
+};
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| -------------------------------------------------------- | ---------------------------- | ------------------- |
+| {{SpecName('ES2015', '#', 'function*')}} | {{Spec2('ES2015')}} | Definición Inicial. |
+| {{SpecName('ESDraft', '#', 'function*')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad con navegadores
+
+{{Compat("javascript.operators.function_star")}}
+
+## Vea también
+
+- {{jsxref("Statements/function*", "Sentencia function*")}}
+- Objeto {{jsxref("GeneratorFunction")}}
+- [El protocolo iterable](/es/docs/Web/JavaScript/Referencia/Iteration_protocols)
+- {{jsxref("Operators/yield", "yield")}}
+- {{jsxref("Operators/yield*", "yield*")}}
+- Objeto {{jsxref("Function")}}
+- {{jsxref("Statements/function", "Sentencia function")}}
+- {{jsxref("Operators/function", "Expresión function")}}
+- {{jsxref("Functions_and_function_scope", "Funciones y alcance de funciones")}}
diff --git a/files/es/web/javascript/reference/operators/optional_chaining/index.html b/files/es/web/javascript/reference/operators/optional_chaining/index.html
deleted file mode 100644
index 223c6e0c2699a4..00000000000000
--- a/files/es/web/javascript/reference/operators/optional_chaining/index.html
+++ /dev/null
@@ -1,178 +0,0 @@
----
-title: Encadenamiento opcional
-slug: Web/JavaScript/Reference/Operators/Optional_chaining
-translation_of: Web/JavaScript/Reference/Operators/Optional_chaining
-original_slug: Web/JavaScript/Referencia/Operadores/Encadenamiento_opcional
----
-{{JSSidebar("Operators")}}
-
-El operador de encadenamiento opcional ?.
permite leer el valor de una propiedad ubicada dentro de una cadena de objetos conectados sin tener que validar expresamente que cada referencia en la cadena sea válida. El operador ?.
funciona de manera similar a el operador de encadenamiento .
, excepto que en lugar de causar un error si una referencia es casi-nula ({{JSxRef("null")}} o {{JSxRef("undefined")}}), la expresión hace una evaluación de circuito corto con un valor de retorno de undefined
. Cuando se usa con llamadas a funciones, devuelve undefined
si la función dada no existe.
-
-Esto da como resultado expresiones más cortas y simples cuando se accede a propiedades encadenadas dónde existe la posibilidad de que falte una referencia. También puede ser útil al explorar el contenido de un objeto cuando no hay una garantía conocida de qué propiedades se requieren.
-
-{{EmbedInteractiveExample("pages/js/expressions-optionalchainingoperator.html", "taller")}}
-
-The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone
https://github.com/mdn/interactive-examples and send us a pull request.
-
-Sintaxis
-
-obj ?.prop
-obj ?.[expr ]
-arr ?.[index ]
-func ?.(args )
-
-
-Descripción
-
-El operador de encadenamiento opcional proporciona una forma de simplificar el acceso a los valores a través de objetos conectados cuando es posible que una referencia o función sea undefined
o null
.
-
-Por ejemplo, considere un objeto obj
que tiene una estructura anidada. Sin encadenamiento opcional, buscar una subpropiedad profundamente anidada requiere validar las referencias intermedias, como:
-
-let nestedProp = obj.first && obj.first.second;
-
-
-Se confirma que el valor de obj.first
no es null
(y no es undefined
) antes de acceder al valor de obj.first.second
. Esto evita el error que ocurriría si simplemente accediera a obj.first.second
directamente sin probar obj.first
.
-
-Sin embargo, con el operador de encadenamiento opcional (?.
), No tiene que probar explícitamente, ni realizar una evaluación de circuito corto basada en el estado de obj.first
antes de intentar acceder a obj.first.second
:
-
-let nestedProp = obj.first?.second;
-
-
-Al usar el operador ?.
en lugar de solo el .
, JavaScript sabe verificar implícitamente para asegurarse de que obj.first
no es null
o undefined
antes de intentar acceder obj.first.second
. Si obj.first
es null
o undefined
, la expresión hace una evaluación de circuito corto automáticamente y retorna undefined
.
-
-Esto es equivalente a lo siguiente, excepto que la variable temporal es de hecho no creada:
-
-let temp = obj.first;
-let nestedProp = ((temp === null || temp === undefined) ? undefined : temp.second);
-
-
-Encadenamiento opcional con llamadas a funciones
-
-Puede usar el encadenamiento opcional cuando intente llamar a un método que puede no existir. Esto puede ser útil, por ejemplo, cuando se usa una API en la que un método podría no estar disponible, ya sea debido a la antigüedad de la implementación o debido a una característica que no está disponible en el dispositivo del usuario.
-
-El uso de encadenamiento opcional con llamadas a funciones hace que la expresión regrese automáticamente undefined
en lugar de lanzar una excepción si no se encuentra el método:
-
-let result = someInterface.customMethod?.();
-
-
-
Nota: Si hay una propiedad con ese nombre y que no es una función, usar ?.
aún levantará una excepción {{JSxRef("TypeError")}} (x.y
is not a function
).
-
-
-Manejo de callbacks opcionales o manejadores de eventos
-
-Si utiliza callbacks o métodos de recuperación de un objeto con una asignación de desestructuración , es posible que tenga valores inexistentes que no puede llamar como funciones a menos que haya probado su existencia. Usando ?.
, Puede evitar esta prueba adicional:
-
-// Escrito a partir de ES2019
-function doSomething(onContent, onError) {
- try {
- // ... hacer algo con los datos
- }
- catch (err) {
- if (onError) { // Probando si onError realmente existe
- onError(err.message);
- }
- }
-}
-
-
-// Usando encadenamiento opcional con llamado de funciones
-function doSomething(onContent, onError) {
- try {
- // ... hacer algo con los datos
- }
- catch (err) {
- onError?.(err.message); // Sin excepción si onError esta undefined
- }
-}
-
-
-Encadenamiento opcional con expresiones
-
-También puede usar el operador de encadenamiento opcional al acceder a propiedades con una expresión usando la notación de corchetes :
-
-let nestedProp = obj?.['prop' + 'Name'];
-
-
-El encadenamiento opcional no es válido al lado izquierdo de una asignación
-
-let object = {};
-object?.property = 1; // Uncaught SyntaxError: Invalid left-hand side in assignment
-
-Acceso a elementos de un arreglo con encadenamiento opcional
-
-let arrayItem = arr?.[42];
-
-Ejemplos
-
-Ejemplo básico
-
-Este ejemplo busca el valor de la propiedad name
para el miembro bar
en un mapa cuando no existe dicho miembro. El resultado es por lo tanto es undefined
.
-
-let myMap = new Map();
-myMap.set("foo", {name: "baz", desc: "inga"});
-
-let nameBar = myMap.get("bar")?.name;
-
-Evaluación de circuito corto
-
-Cuando se usa el encadenamiento opcional con expresiones, si el operando izquierdo es null
o undefined
, la expresión no se evaluará. Por ejemplo:
-
-let potentiallyNullObj = null;
-let x = 0;
-let prop = potentiallyNullObj?.[x++];
-
-console.log(x); // 0 como x no se incrementó
-
-
-Apilando el operador de encadenamiento opcional
-
-Con estructuras anidadas, es posible usar encadenamiento opcional varias veces:
-
-let customer = {
- name: "Carl",
- details: {
- age: 82,
- location: "Paradise Falls" // "detailed address" es desconocida
- }
-};
-let customerCity = customer.details?.address?.city;
-
-// … esto también funciona con la función opcional de encadenamiento
-let duration = vacations.trip?.getTime?.();
-
-
-Combinando con el operador de fusión nulo
-
-El {{JSxRef("Operators/Nullish_Coalescing_Operator", "operador de fusión nulo", '', 1)}} se puede usar después del encadenamiento opcional para generar un valor predeterminado cuando no se encontró ninguno:
-
-let customer = {
- name: "Carl",
- details: { age: 82 }
-};
-const customerCity = customer?.city ?? "Unknown city";
-console.log(customerCity); // Unknown city
-
-Especificaciones
-
-
-
-
- Specification
-
-
-
-
- {{SpecName('ESDraft', '#prod-OptionalExpression', 'optional expression')}}
-
-
-
-
-Compatibilidad de navegadores
-
-{{Compat("javascript.operators.optional_chaining")}}
-
-Ver también
-
-
- El {{JSxRef("Operators/Nullish_Coalescing_Operator", "Nullish Coalescing Operator", '', 1)}}
-
diff --git a/files/es/web/javascript/reference/operators/optional_chaining/index.md b/files/es/web/javascript/reference/operators/optional_chaining/index.md
new file mode 100644
index 00000000000000..53f727e6798084
--- /dev/null
+++ b/files/es/web/javascript/reference/operators/optional_chaining/index.md
@@ -0,0 +1,182 @@
+---
+title: Encadenamiento opcional
+slug: Web/JavaScript/Reference/Operators/Optional_chaining
+translation_of: Web/JavaScript/Reference/Operators/Optional_chaining
+original_slug: Web/JavaScript/Referencia/Operadores/Encadenamiento_opcional
+---
+{{JSSidebar("Operators")}}
+
+El operador de **encadenamiento opcional** **`?.`** permite leer el valor de una propiedad ubicada dentro de una cadena de objetos conectados sin tener que validar expresamente que cada referencia en la cadena sea válida. El operador `?.` funciona de manera similar a el operador de encadenamiento `.`, excepto que en lugar de causar un error si una referencia es [casi-nula](/es/docs/Glossary/nullish) ({{JSxRef("null")}} o {{JSxRef("undefined")}}), la expresión hace una evaluación de circuito corto con un valor de retorno de `undefined`. Cuando se usa con llamadas a funciones, devuelve `undefined` si la función dada no existe.
+
+Esto da como resultado expresiones más cortas y simples cuando se accede a propiedades encadenadas dónde existe la posibilidad de que falte una referencia. También puede ser útil al explorar el contenido de un objeto cuando no hay una garantía conocida de qué propiedades se requieren.
+
+{{EmbedInteractiveExample("pages/js/expressions-optionalchainingoperator.html", "taller")}}The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone and send us a pull request.
+
+## Sintaxis
+
+```
+obj?.prop
+obj?.[expr]
+arr?.[index]
+func?.(args)
+```
+
+## Descripción
+
+El operador de encadenamiento opcional proporciona una forma de simplificar el acceso a los valores a través de objetos conectados cuando es posible que una referencia o función sea `undefined` o `null`.
+
+Por ejemplo, considere un objeto `obj` que tiene una estructura anidada. Sin encadenamiento opcional, buscar una subpropiedad profundamente anidada requiere validar las referencias intermedias, como:
+
+```js
+let nestedProp = obj.first && obj.first.second;
+```
+
+Se confirma que el valor de `obj.first` no es `null` (y no es `undefined`) antes de acceder al valor de `obj.first.second`. Esto evita el error que ocurriría si simplemente accediera a `obj.first.second` directamente sin probar `obj.first`.
+
+Sin embargo, con el operador de encadenamiento opcional (`?.`), No tiene que probar explícitamente, ni realizar una evaluación de circuito corto basada en el estado de `obj.first` antes de intentar acceder a `obj.first.second`:
+
+```js
+let nestedProp = obj.first?.second;
+```
+
+Al usar el operador `?.` en lugar de solo el `.`, JavaScript sabe verificar implícitamente para asegurarse de que `obj.first` no es `null` o `undefined` antes de intentar acceder `obj.first.second`. Si `obj.first` es `null` o `undefined`, la expresión hace una evaluación de circuito corto automáticamente y retorna `undefined`.
+
+Esto es equivalente a lo siguiente, excepto que la variable temporal es de hecho no creada:
+
+```js
+let temp = obj.first;
+let nestedProp = ((temp === null || temp === undefined) ? undefined : temp.second);
+```
+
+### Encadenamiento opcional con llamadas a funciones
+
+Puede usar el encadenamiento opcional cuando intente llamar a un método que puede no existir. Esto puede ser útil, por ejemplo, cuando se usa una API en la que un método podría no estar disponible, ya sea debido a la antigüedad de la implementación o debido a una característica que no está disponible en el dispositivo del usuario.
+
+El uso de encadenamiento opcional con llamadas a funciones hace que la expresión regrese automáticamente `undefined` en lugar de lanzar una excepción si no se encuentra el método:
+
+```js
+let result = someInterface.customMethod?.();
+```
+
+> **Nota:** Si hay una propiedad con ese nombre y que no es una función, usar `?.` aún levantará una excepción {{JSxRef("TypeError")}} (` x.y`` is not a function `).
+
+#### Manejo de callbacks opcionales o manejadores de eventos
+
+Si utiliza callbacks o métodos de recuperación de un objeto con[una asignación de desestructuración](/es/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Object_destructuring), es posible que tenga valores inexistentes que no puede llamar como funciones a menos que haya probado su existencia. Usando `?.`, Puede evitar esta prueba adicional:
+
+```js
+// Escrito a partir de ES2019
+function doSomething(onContent, onError) {
+ try {
+ // ... hacer algo con los datos
+ }
+ catch (err) {
+ if (onError) { // Probando si onError realmente existe
+ onError(err.message);
+ }
+ }
+}
+```
+
+```js
+// Usando encadenamiento opcional con llamado de funciones
+function doSomething(onContent, onError) {
+ try {
+ // ... hacer algo con los datos
+ }
+ catch (err) {
+ onError?.(err.message); // Sin excepción si onError esta undefined
+ }
+}
+```
+
+### Encadenamiento opcional con expresiones
+
+También puede usar el operador de encadenamiento opcional al acceder a propiedades con una expresión usando [la notación de corchetes](/es/docs/Web/JavaScript/Reference/Operators/Property_Accessors#Bracket_notation):
+
+```js
+let nestedProp = obj?.['prop' + 'Name'];
+```
+
+### El encadenamiento opcional no es válido al lado izquierdo de una asignación
+
+```js
+let object = {};
+object?.property = 1; // Uncaught SyntaxError: Invalid left-hand side in assignment
+```
+
+### Acceso a elementos de un arreglo con encadenamiento opcional
+
+```js
+let arrayItem = arr?.[42];
+```
+
+## Ejemplos
+
+### Ejemplo básico
+
+Este ejemplo busca el valor de la propiedad `name` para el miembro `bar` en un mapa cuando no existe dicho miembro. El resultado es por lo tanto es `undefined`.
+
+```js
+let myMap = new Map();
+myMap.set("foo", {name: "baz", desc: "inga"});
+
+let nameBar = myMap.get("bar")?.name;
+```
+
+### Evaluación de circuito corto
+
+Cuando se usa el encadenamiento opcional con expresiones, si el operando izquierdo es `null` o `undefined`, la expresión no se evaluará. Por ejemplo:
+
+```js
+let potentiallyNullObj = null;
+let x = 0;
+let prop = potentiallyNullObj?.[x++];
+
+console.log(x); // 0 como x no se incrementó
+```
+
+### Apilando el operador de encadenamiento opcional
+
+Con estructuras anidadas, es posible usar encadenamiento opcional varias veces:
+
+```js
+let customer = {
+ name: "Carl",
+ details: {
+ age: 82,
+ location: "Paradise Falls" // "detailed address" es desconocida
+ }
+};
+let customerCity = customer.details?.address?.city;
+
+// … esto también funciona con la función opcional de encadenamiento
+let duration = vacations.trip?.getTime?.();
+```
+
+### Combinando con el operador de fusión nulo
+
+El {{JSxRef("Operators/Nullish_Coalescing_Operator", "operador de fusión nulo", '', 1)}} se puede usar después del encadenamiento opcional para generar un valor predeterminado cuando no se encontró ninguno:
+
+```js
+let customer = {
+ name: "Carl",
+ details: { age: 82 }
+};
+const customerCity = customer?.city ?? "Unknown city";
+console.log(customerCity); // Unknown city
+```
+
+## Especificaciones
+
+| Specification |
+| ---------------------------------------------------------------------------------------------------- |
+| {{SpecName('ESDraft', '#prod-OptionalExpression', 'optional expression')}} |
+
+## Compatibilidad de navegadores
+
+{{Compat("javascript.operators.optional_chaining")}}
+
+## Ver también
+
+- El {{JSxRef("Operators/Nullish_Coalescing_Operator", "Nullish Coalescing Operator", '', 1)}}
diff --git a/files/es/web/javascript/reference/operators/remainder/index.html b/files/es/web/javascript/reference/operators/remainder/index.html
deleted file mode 100644
index 5916e268e024b9..00000000000000
--- a/files/es/web/javascript/reference/operators/remainder/index.html
+++ /dev/null
@@ -1,83 +0,0 @@
----
-title: Resto (%)
-slug: Web/JavaScript/Reference/Operators/Remainder
-translation_of: Web/JavaScript/Reference/Operators/Remainder
-original_slug: Web/JavaScript/Referencia/Operadores/Resto
----
-{{jsSidebar("Operators")}}
-
-El operador resto (%
) devuelve el resto de la división entre dos operandos. Siempre toma el signo del dividendo.
-
-{{EmbedInteractiveExample("pages/js/expressions-remainder.html")}}
-
-
-
-El código fuente para este ejemplo interactivo se encuentra en un repositorio de GitHub. Si quieres contribuir al proyecto de ejemplos interactivas, por favor clona https://github.com/mdn/interactive-examples y realiza un pull request.
-
-Tener en cuenta que en la mayoría de los lenguajes de programación, el operador de resto es ‘%’, pero en otros (como Python, Perl ) es el operador módulo. Ambos son iguales para valores positivos, pero cuando el divisor y el dividendo son de signos distintos, se obtienen distintos resultados. Para obtener el módulo en JavaScript, en lugar de a % n
, usa ((a % n ) + n ) % n
.
-
-Sintaxis
-
-Operador: var1 % var2
-
-
-Ejemplos
-
-Resto con dividendo positivo
-
- 12 % 5 // 2
- 1 % -2 // 1
- 1 % 2 // 1
- 2 % 3 // 2
-5.5 % 2 // 1.5
-
-
-Resto con dividendo negativo
-
--12 % 5 // -2
--1 % 2 // -1
--4 % 2 // -0
-
-Resto con NaN
-
-NaN % 2 // NaN
-
-Resto con Infinity
-
-Infinity % 2 // NaN
-Infinity % 0 // NaN
-Infinity % Infinity // NaN
-
-
-Especificaciones
-
-
-
-
- Especificación
-
-
- {{SpecName('ESDraft', '#sec-multiplicative-operators', 'Remainder operator')}}
-
-
-
-
-Compatibilidad con navegadores
-
-
-
-{{Compat("javascript.operators.remainder")}}
-
-Ver también
-
-
diff --git a/files/es/web/javascript/reference/operators/remainder/index.md b/files/es/web/javascript/reference/operators/remainder/index.md
new file mode 100644
index 00000000000000..10c71b569cf106
--- /dev/null
+++ b/files/es/web/javascript/reference/operators/remainder/index.md
@@ -0,0 +1,77 @@
+---
+title: Resto (%)
+slug: Web/JavaScript/Reference/Operators/Remainder
+translation_of: Web/JavaScript/Reference/Operators/Remainder
+original_slug: Web/JavaScript/Referencia/Operadores/Resto
+---
+{{jsSidebar("Operators")}}
+
+El operador resto (`%`) devuelve el resto de la división entre dos operandos. Siempre toma el signo del dividendo.
+
+{{EmbedInteractiveExample("pages/js/expressions-remainder.html")}}
+
+El código fuente para este ejemplo interactivo se encuentra en un repositorio de GitHub. Si quieres contribuir al proyecto de ejemplos interactivas, por favor clona y realiza un pull request.
+
+Tener en cuenta que en la mayoría de los lenguajes de programación, el operador de resto es ‘%’, pero en otros (como [Python, Perl](https://en.wikipedia.org/wiki/Modulo_operation#In_programming_languages)) es el operador módulo. Ambos son iguales para valores positivos, pero cuando el divisor y el dividendo son de signos distintos, se obtienen distintos resultados. Para obtener el módulo en JavaScript, en lugar de `a % n`, usa `((a % n ) + n ) % n`.
+
+## Sintaxis
+
+```
+Operador: var1 % var2
+```
+
+## Ejemplos
+
+### Resto con dividendo positivo
+
+```js
+ 12 % 5 // 2
+ 1 % -2 // 1
+ 1 % 2 // 1
+ 2 % 3 // 2
+5.5 % 2 // 1.5
+```
+
+### Resto con dividendo negativo
+
+```js
+-12 % 5 // -2
+-1 % 2 // -1
+-4 % 2 // -0
+```
+
+### Resto con NaN
+
+```js
+NaN % 2 // NaN
+```
+
+### Resto con Infinity
+
+```js
+Infinity % 2 // NaN
+Infinity % 0 // NaN
+Infinity % Infinity // NaN
+```
+
+## Especificaciones
+
+| Especificación |
+| -------------------------------------------------------------------------------------------------------- |
+| {{SpecName('ESDraft', '#sec-multiplicative-operators', 'Remainder operator')}} |
+
+## Compatibilidad con navegadores
+
+{{Compat("javascript.operators.remainder")}}
+
+## Ver también
+
+- [Addition operator](/es/docs/Web/JavaScript/Reference/Operators/Addition)
+- [Subtraction operator](/es/docs/Web/JavaScript/Reference/Operators/Subtraction)
+- [Division operator](/es/docs/Web/JavaScript/Reference/Operators/Division)
+- [Multiplication operator](/es/docs/Web/JavaScript/Reference/Operators/Multiplication)
+- [Exponentiation operator](/es/docs/Web/JavaScript/Reference/Operators/Exponentiation)
+- [Increment operator](/es/docs/Web/JavaScript/Reference/Operators/Increment)
+- [Decrement operator](/es/docs/Web/JavaScript/Reference/Operators/Decrement)
+- [Unary negation operator](/es/docs/Web/JavaScript/Reference/Operators/Unary_negation)
+- [Unary plus operator](/es/docs/Web/JavaScript/Reference/Operators/Unary_plus)
diff --git a/files/es/web/javascript/reference/operators/spread_syntax/index.html b/files/es/web/javascript/reference/operators/spread_syntax/index.html
deleted file mode 100644
index 2cec5f5438bd51..00000000000000
--- a/files/es/web/javascript/reference/operators/spread_syntax/index.html
+++ /dev/null
@@ -1,243 +0,0 @@
----
-title: Sintaxis Spread
-slug: Web/JavaScript/Reference/Operators/Spread_syntax
-tags:
- - ECMAScript6
- - Iteradores
- - JavaScript
-translation_of: Web/JavaScript/Reference/Operators/Spread_syntax
-original_slug: Web/JavaScript/Referencia/Operadores/Sintaxis_Spread
----
-{{jsSidebar("Operators")}}
-
-La sintaxis extendida o spread syntax permite a un elemento iterable tal como un arreglo o cadena ser expandido en lugares donde cero o más argumentos (para llamadas de función) o elementos (para
Array literales ) son esperados, o a un objeto ser expandido en lugares donde cero o más pares de valores clave (para
literales Tipo Objeto ) son esperados.
-
-{{EmbedInteractiveExample("pages/js/expressions-spreadsyntax.html")}}
-
-
-
-La fuente para este ejemplo interactivo está almacenada en el repositorio de GitHub. Si quieres contribuir al proyecto interactivo de ejemplos, por favor clona https://github.com/mdn/interactive-examples y envíanos una solicitud de descarga (pull).
-
-Sintaxis
-
-Para llamadas de funciones:
-
-myFunction(...iterableObj);
-
-
-Para arreglos literales o cadenas de caracteres:
-
-[...iterableObj, '4', 'five', 6];
-
-Para objetos literales (nuevo en ECMAScript 2018):
-
-let objClone = { ...obj };
-
-Ejemplos
-
-Spread en llamadas de función
-
-Reemplaza "apply"
-
-Es frecuente usar {{jsxref( "Function.prototype.apply")}} en casos donde quieres usar los elementos de un arreglo como argumentos de una función.
-
-function myFunction(x, y, z) { }
-var args = [0, 1, 2];
-myFunction.apply(null, args);
-
-Con la sintaxis expandida (spread syntax), el código anterior puede ser escrito como:
-
-function myFunction(x, y, z) { }
-var args = [0, 1, 2];
-myFunction(...args);
-
-Cualquier argumento en la lista de argumentos puede usar la sintáxis expandida y esto puede ser usado varias veces.
-
-function myFunction(v, w, x, y, z) { }
-var args = [0, 1];
-myFunction(-1, ...args, 2, ...[3]);
-
-"Apply" para "new"
-
-Cuando se llama un constructor con new
, no es posible usar directamente un arreglo y apply
(apply
hace un [[Call]]
y no un [[Construct]]
). Sin embargo, un arreglo puede ser fácilmente usado con un new gracias a la sintáxis expandida:
-
-var dateFields = [1970, 0, 1]; // 1 Jan 1970
-var d = new Date(...dateFields);
-
-
-Para usar new con un arreglo de parámetros sin la sintáxis expandida, podrías tener que hacerlo indirectamente a través de una aplicación parcial:
-
-function applyAndNew(constructor, args) {
- function partial () {
- return constructor.apply(this, args);
- };
- if (typeof constructor.prototype === "object") {
- partial.prototype = Object.create(constructor.prototype);
- }
- return partial;
-}
-
-
-function myConstructor () {
- console.log("arguments.length: " + arguments.length);
- console.log(arguments);
- this.prop1="val1";
- this.prop2="val2";
-};
-
-var myArguments = ["hi", "how", "are", "you", "mr", null];
-var myConstructorWithArguments = applyAndNew(myConstructor, myArguments);
-
-console.log(new myConstructorWithArguments);
-// (internal log of myConstructor): arguments.length: 6
-// (internal log of myConstructor): ["hi", "how", "are", "you", "mr", null]
-// (log of "new myConstructorWithArguments"): {prop1: "val1", prop2: "val2"}
-
-Expandir Array literales
-
-Un literal Array más poderoso
-
-Sin sintaxis expandida (spread syntax)
, para crear un nuevo arreglo usando un arreglo existente como parte de él,no es suficiente la sintaxis de Array literal y en su lugar se debe usar código imperativo con una combinación de push
, splice
, concat
, etc. Con la sintaxis expandida, esto se vuelve mucho mas práctico:
-
-var parts = ['shoulders', 'knees'];
-var lyrics = ['head', ...parts, 'and', 'toes'];
-// ["head", "shoulders", "knees", "and", "toes"]
-
-
-Así como para expandir listas de argumentos, ...
puede ser usado en cualquier parte dentro del Array literal, y múltiples veces.
-
-Copiar un arreglo
-
-var arr = [1, 2, 3];
-var arr2 = [...arr]; // like arr.slice()
-arr2.push(4);
-
-// arr2 becomes [1, 2, 3, 4]
-// arr remains unaffected
-
-
-Nota: La sintaxis expandida efectivamente va a un nivel de profundidad mientras copia un arreglo. Por lo tanto, esto no permite copiar arreglos multidimensionales como se muestra en los siguientes ejemplos (es lo mismo con {{jsxref("Object.assign()")}} y sintaxis spread).
-
-var a = [[1], [2], [3]];
-var b = [...a];
-b.shift().shift(); // 1
-// Now array a is affected as well: [[], [2], [3]]
-
-
-
-
-{{jsxref("Array.concat")}} es usada a menudo para concatenar un arreglo al final de un arreglo ya existente. Sin la sintaxis spread se realiza:
-
-var arr1 = [0, 1, 2];
-var arr2 = [3, 4, 5];
-// Append all items from arr2 onto arr1
-arr1 = arr1.concat(arr2);
-
-Con la sintaxis spread se transforma en:
-
-var arr1 = [0, 1, 2];
-var arr2 = [3, 4, 5];
-arr1 = [...arr1, ...arr2];
-
-
-{{jsxref("Array.unshift")}} es a menudo usada para insertar un arreglo de valores al inicio de un arreglo existente. Sin la sintáxis spread, esto es hecho como:
-
-var arr1 = [0, 1, 2];
-var arr2 = [3, 4, 5];
-// Prepend all items from arr2 onto arr1
-Array.prototype.unshift.apply(arr1, arr2) // arr1 is now [3, 4, 5, 0, 1, 2]
-
-Con la sintaxis spread se convierte en [Observa, sin embargo, que esto crea un nuevo arreglo arr1
. Diferente a {{jsxref("Array.unshift")}}, esto no modifica el arreglo original en sitio arr1
]:
-
-var arr1 = [0, 1, 2];
-var arr2 = [3, 4, 5];
-arr1 = [...arr2, ...arr1]; // arr1 is now [3, 4, 5, 0, 1, 2]
-
-
-Spread en literales tipo Objeto
-
-La propuesta Propiedades Rest/Spread para ECMAScript (etapa 4) agrega propiedades spread a los literales Tipo Objeto . Esto copia sus propiedades enumerables desde un objeto provisto dentro de un nuevo objeto.
-
-Shallow-cloning (excluyendo prototype) o la combinación de objetos es ahora posible usando una sintaxis más corta que {{jsxref("Object.assign()")}}.
-
-var obj1 = { foo: 'bar', x: 42 };
-var obj2 = { foo: 'baz', y: 13 };
-
-var clonedObj = { ...obj1 };
-// Object { foo: "bar", x: 42 }
-
-var mergedObj = { ...obj1, ...obj2 };
-// Object { foo: "baz", x: 42, y: 13 }
-
-Observa que {{jsxref("Object.assign()")}} desencadena setters mientras que la sintaxis spread no lo hace.
-
-Observa que tú no puedes reemplazar o replicar la función {{jsxref("Object.assign()")}}:
-
-var obj1 = { foo: 'bar', x: 42 };
-var obj2 = { foo: 'baz', y: 13 };
-const merge = ( ...objects ) => ( { ...objects } );
-
-var mergedObj = merge ( obj1, obj2);
-// Object { 0: { foo: 'bar', x: 42 }, 1: { foo: 'baz', y: 13 } }
-
-var mergedObj = merge ( {}, obj1, obj2);
-// Object { 0: {}, 1: { foo: 'bar', x: 42 }, 2: { foo: 'baz', y: 13 } }
-
-En el ejemplo de arriba, el operador spread no trabaja como uno podría esperar: este dispersa un arreglo de argumentos en el literal Tipo Objeto, debido al parámetro rest.
-
-Sólo para iterables
-
-La sintaxis Spread (otra que en el caso de las propiedades spread) puede ser aplicada sólo a los objetos iterables :
-
-var obj = {'key1': 'value1'};
-var array = [...obj]; // TypeError: obj is not iterable
-
-
-Spread con muchos valores
-
-Cuando se usa la sintaxis spread para llamados de funciones, tenga en cuenta la posibilidad de exceder el límite de longitud de argumentos del motor de JavaScript. Vea apply()
para más detalles.
-
-Sintaxis Rest (parámetros)
-
-La sintaxis Rest luce exactamente como la sintaxis spread, pero esto es usado por la desestructuración de arreglos y objetos. De cierta forma, la sintaxis rest es la opuesta a la sintaxis spread: spread 'expande' un arreglo en sus elementos, mientras rest agrupa múltiples elementos y los 'condensa' en un único elemento. Consulta parámetros rest.
-
-Especificaciones
-
-
-
-
- Specification
- Status
- Comment
-
-
-
-
- {{SpecName('ES2015', '#sec-array-initializer')}}
- {{Spec2('ES2015')}}
- Definido en varias secciones de la especificación: Array Initializer , Argument Lists
-
-
- {{SpecName('ESDraft', '#sec-array-initializer')}}
- {{Spec2('ESDraft')}}
- Sin cambios.
-
-
- {{SpecName('ESDraft', '#sec-object-initializer')}}
- {{Spec2('ESDraft')}}
- Definido en Object Initializer
-
-
-
-
-Compatibilidad del navegador
-
-
-
-{{Compat("javascript.operators.spread")}}
-
-Vea también
-
-
diff --git a/files/es/web/javascript/reference/operators/spread_syntax/index.md b/files/es/web/javascript/reference/operators/spread_syntax/index.md
new file mode 100644
index 00000000000000..c143d753e21fa8
--- /dev/null
+++ b/files/es/web/javascript/reference/operators/spread_syntax/index.md
@@ -0,0 +1,240 @@
+---
+title: Sintaxis Spread
+slug: Web/JavaScript/Reference/Operators/Spread_syntax
+tags:
+ - ECMAScript6
+ - Iteradores
+ - JavaScript
+translation_of: Web/JavaScript/Reference/Operators/Spread_syntax
+original_slug: Web/JavaScript/Referencia/Operadores/Sintaxis_Spread
+---
+{{jsSidebar("Operators")}}**La sintaxis extendida o spread** **syntax** permite a un elemento iterable tal como un arreglo o cadena ser expandido en lugares donde cero o más argumentos (para llamadas de función) o elementos (para [Array literales](/es/docs/Web/JavaScript/Guide/Grammar_and_types#Literales_Array)) son esperados, o a un objeto ser expandido en lugares donde cero o más pares de valores clave (para [literales Tipo Objeto](/es/docs/Web/JavaScript/Guide/Grammar_and_types#Literales)) son esperados.{{EmbedInteractiveExample("pages/js/expressions-spreadsyntax.html")}}
+
+La fuente para este ejemplo interactivo está almacenada en el repositorio de GitHub. Si quieres contribuir al proyecto interactivo de ejemplos, por favor clona y envíanos una solicitud de descarga (pull).
+
+## Sintaxis
+
+Para llamadas de funciones:
+
+```
+myFunction(...iterableObj);
+```
+
+Para arreglos literales o cadenas de caracteres:
+
+```
+[...iterableObj, '4', 'five', 6];
+```
+
+Para objetos literales (nuevo en ECMAScript 2018):
+
+```
+let objClone = { ...obj };
+```
+
+## Ejemplos
+
+### Spread en llamadas de función
+
+#### Reemplaza "apply"
+
+Es frecuente usar {{jsxref( "Function.prototype.apply")}} en casos donde quieres usar los elementos de un arreglo como argumentos de una función.
+
+```js
+function myFunction(x, y, z) { }
+var args = [0, 1, 2];
+myFunction.apply(null, args);
+```
+
+Con la sintaxis expandida (spread syntax), el código anterior puede ser escrito como:
+
+```js
+function myFunction(x, y, z) { }
+var args = [0, 1, 2];
+myFunction(...args);
+```
+
+Cualquier argumento en la lista de argumentos puede usar la sintáxis expandida y esto puede ser usado varias veces.
+
+```js
+function myFunction(v, w, x, y, z) { }
+var args = [0, 1];
+myFunction(-1, ...args, 2, ...[3]);
+```
+
+#### "Apply" para "new"
+
+Cuando se llama un constructor con `new`, no es posible usar **directamente** un arreglo y `apply` (`apply` hace un `[[Call]]` y no un `[[Construct]]`). Sin embargo, un arreglo puede ser fácilmente usado con un new gracias a la sintáxis expandida:
+
+```js
+var dateFields = [1970, 0, 1]; // 1 Jan 1970
+var d = new Date(...dateFields);
+```
+
+Para usar **new** con un arreglo de parámetros sin la sintáxis expandida, podrías tener que hacerlo **indirectamente** a través de una aplicación parcial:
+
+```js
+function applyAndNew(constructor, args) {
+ function partial () {
+ return constructor.apply(this, args);
+ };
+ if (typeof constructor.prototype === "object") {
+ partial.prototype = Object.create(constructor.prototype);
+ }
+ return partial;
+}
+
+
+function myConstructor () {
+ console.log("arguments.length: " + arguments.length);
+ console.log(arguments);
+ this.prop1="val1";
+ this.prop2="val2";
+};
+
+var myArguments = ["hi", "how", "are", "you", "mr", null];
+var myConstructorWithArguments = applyAndNew(myConstructor, myArguments);
+
+console.log(new myConstructorWithArguments);
+// (internal log of myConstructor): arguments.length: 6
+// (internal log of myConstructor): ["hi", "how", "are", "you", "mr", null]
+// (log of "new myConstructorWithArguments"): {prop1: "val1", prop2: "val2"}
+```
+
+### Expandir Array literales
+
+#### Un literal Array más poderoso
+
+Sin **`sintaxis expandida (spread syntax)`**, para crear un nuevo arreglo usando un arreglo existente como parte de él,no es suficiente la sintaxis de Array literal y en su lugar se debe usar código imperativo con una combinación de `push`, `splice`, `concat`, etc. Con la sintaxis expandida, esto se vuelve mucho mas práctico:
+
+```js
+var parts = ['shoulders', 'knees'];
+var lyrics = ['head', ...parts, 'and', 'toes'];
+// ["head", "shoulders", "knees", "and", "toes"]
+```
+
+Así como para expandir listas de argumentos, `...` puede ser usado en cualquier parte dentro del Array literal, y múltiples veces.
+
+#### Copiar un arreglo
+
+```js
+var arr = [1, 2, 3];
+var arr2 = [...arr]; // like arr.slice()
+arr2.push(4);
+
+// arr2 becomes [1, 2, 3, 4]
+// arr remains unaffected
+```
+
+**Nota:** La sintaxis expandida efectivamente va a un nivel de profundidad mientras copia un arreglo. Por lo tanto, esto no permite copiar arreglos multidimensionales como se muestra en los siguientes ejemplos (es lo mismo con {{jsxref("Object.assign()")}} y sintaxis spread).
+
+```js
+var a = [[1], [2], [3]];
+var b = [...a];
+b.shift().shift(); // 1
+// Now array a is affected as well: [[], [2], [3]]
+```
+
+#### Una forma mejor para concatenar arreglos
+
+{{jsxref("Array.concat")}} es usada a menudo para concatenar un arreglo al final de un arreglo ya existente. Sin la sintaxis spread se realiza:
+
+```js
+var arr1 = [0, 1, 2];
+var arr2 = [3, 4, 5];
+// Append all items from arr2 onto arr1
+arr1 = arr1.concat(arr2);
+```
+
+Con la sintaxis spread se transforma en:
+
+```js
+var arr1 = [0, 1, 2];
+var arr2 = [3, 4, 5];
+arr1 = [...arr1, ...arr2];
+```
+
+{{jsxref("Array.unshift")}} es a menudo usada para insertar un arreglo de valores al inicio de un arreglo existente. Sin la sintáxis spread, esto es hecho como:
+
+```js
+var arr1 = [0, 1, 2];
+var arr2 = [3, 4, 5];
+// Prepend all items from arr2 onto arr1
+Array.prototype.unshift.apply(arr1, arr2) // arr1 is now [3, 4, 5, 0, 1, 2]
+```
+
+Con la sintaxis spread se convierte en \[Observa, sin embargo, que esto crea un nuevo arreglo `arr1`. Diferente a {{jsxref("Array.unshift")}}, esto no modifica el arreglo original en sitio `arr1`]:
+
+```js
+var arr1 = [0, 1, 2];
+var arr2 = [3, 4, 5];
+arr1 = [...arr2, ...arr1]; // arr1 is now [3, 4, 5, 0, 1, 2]
+```
+
+### Spread en literales tipo Objeto
+
+La propuesta [Propiedades Rest/Spread para ECMAScript](https://github.com/tc39/proposal-object-rest-spread) (etapa 4) agrega propiedades spread a los [literales Tipo Objeto](/es/docs/Web/JavaScript/Reference/Operators/Object_initializer). Esto copia sus propiedades enumerables desde un objeto provisto dentro de un nuevo objeto.
+
+Shallow-cloning (excluyendo prototype) o la combinación de objetos es ahora posible usando una sintaxis más corta que {{jsxref("Object.assign()")}}.
+
+```js
+var obj1 = { foo: 'bar', x: 42 };
+var obj2 = { foo: 'baz', y: 13 };
+
+var clonedObj = { ...obj1 };
+// Object { foo: "bar", x: 42 }
+
+var mergedObj = { ...obj1, ...obj2 };
+// Object { foo: "baz", x: 42, y: 13 }
+```
+
+Observa que {{jsxref("Object.assign()")}} desencadena [setters](/es/docs/Web/JavaScript/Reference/Functions/set) mientras que la sintaxis spread no lo hace.
+
+Observa que tú no puedes reemplazar o replicar la función {{jsxref("Object.assign()")}}:
+
+```js
+var obj1 = { foo: 'bar', x: 42 };
+var obj2 = { foo: 'baz', y: 13 };
+const merge = ( ...objects ) => ( { ...objects } );
+
+var mergedObj = merge ( obj1, obj2);
+// Object { 0: { foo: 'bar', x: 42 }, 1: { foo: 'baz', y: 13 } }
+
+var mergedObj = merge ( {}, obj1, obj2);
+// Object { 0: {}, 1: { foo: 'bar', x: 42 }, 2: { foo: 'baz', y: 13 } }
+```
+
+En el ejemplo de arriba, el operador spread no trabaja como uno podría esperar: este dispersa un _arreglo_ de argumentos en el literal Tipo Objeto, debido al parámetro rest.
+
+### Sólo para iterables
+
+La sintaxis Spread (otra que en el caso de las propiedades spread) puede ser aplicada sólo a los objetos [iterables](/es/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator):
+
+```js
+var obj = {'key1': 'value1'};
+var array = [...obj]; // TypeError: obj is not iterable
+```
+
+### Spread con muchos valores
+
+Cuando se usa la sintaxis spread para llamados de funciones, tenga en cuenta la posibilidad de exceder el límite de longitud de argumentos del motor de JavaScript. Vea [`apply()`](/es/docs/Web/JavaScript/Reference/Global_Objects/Function/apply) para más detalles.
+
+## Sintaxis Rest (parámetros)
+
+La sintaxis Rest luce exactamente como la sintaxis spread, pero esto es usado por la desestructuración de arreglos y objetos. De cierta forma, la sintaxis rest es la opuesta a la sintaxis spread: spread 'expande' un arreglo en sus elementos, mientras rest agrupa múltiples elementos y los 'condensa' en un único elemento. Consulta [parámetros rest.](/es/docs/Web/JavaScript/Reference/Functions_and_function_scope/rest_parameters)
+
+## Especificaciones
+
+| Specification | Status | Comment |
+| -------------------------------------------------------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| {{SpecName('ES2015', '#sec-array-initializer')}} | {{Spec2('ES2015')}} | Definido en varias secciones de la especificación: [Array Initializer](http://www.ecma-international.org/ecma-262/6.0/#sec-array-initializer), [Argument Lists](http://www.ecma-international.org/ecma-262/6.0/#sec-argument-lists) |
+| {{SpecName('ESDraft', '#sec-array-initializer')}} | {{Spec2('ESDraft')}} | Sin cambios. |
+| {{SpecName('ESDraft', '#sec-object-initializer')}} | {{Spec2('ESDraft')}} | Definido en [Object Initializer](https://tc39.github.io/ecma262/2018/#sec-object-initializer) |
+
+## Compatibilidad del navegador
+
+{{Compat("javascript.operators.spread")}}
+
+## Vea también
+
+- [Rest parameters](/es/docs/Web/JavaScript/Reference/Functions_and_function_scope/rest_parameters) (también ‘`...`’)
diff --git a/files/es/web/javascript/reference/operators/strict_equality/index.html b/files/es/web/javascript/reference/operators/strict_equality/index.html
deleted file mode 100644
index 1325266a1289a1..00000000000000
--- a/files/es/web/javascript/reference/operators/strict_equality/index.html
+++ /dev/null
@@ -1,102 +0,0 @@
----
-title: Igualdad Estricta (===)
-slug: Web/JavaScript/Reference/Operators/Strict_equality
-translation_of: Web/JavaScript/Reference/Operators/Strict_equality
-original_slug: Web/JavaScript/Referencia/Operadores/Strict_equality
----
-{{jsSidebar("Operators")}}
-
-El operador de estricta igualdad (===
) revisa si dos operandos son iguales y produce un resultado Booleano. A diferencia del operador de igualdad regular (==), el operador de estricta igualdad siempre considera que los operandos de distinto tipo de valor son diferentes y nunca similares.
-
-{{EmbedInteractiveExample("pages/js/expressions-strict-equality.html")}}
-
-The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone
https://github.com/mdn/interactive-examples and send us a pull request.
-
-Sintaxis
-
-x === y
-
-Descripción
-
-Los operadores de estricta igualdad (===
y !==
) usan el Algoritmo Estricto Comparativo de Igualdad para comparar dos operandos:
-
-
- Si los operandos son de diferente tipo de valor, produce false
.
- Si ambos operandos son objetos, produce true
solo si se refiere al mismo objeto.
- Si ambos operandos son de tipo null
o ambos operandos son undefined
, produce true
.
- Si cualquier operando es de tipo NaN , produce false
.
- En otros casos, compara los valores de ambos operandos:
-
- Los números deben tener el mismo valor numérico, aunque +0
y -0
son considerados como del mismo valor.
- Los strings deben tener los mismos caracteres en el mismo orden.
- Los booleanos deben ambos ser true
o ambos ser false
.
-
-
-
-
-La diferencia más notable entre este operador y el operador de igualdad regular (==
) es que si los operandos son de distinto tipo de valor, el operador ==
intenta convertir los valores a un mismo tipo de dato antes de compararlos.
-
-Ejemplos
-
-Comparando operandos del mismo tipo
-
-console.log("hello" === "hello"); // true
-console.log("hello" === "hola"); // false
-
-console.log(3 === 3); // true
-console.log(3 === 4); // false
-
-console.log(true === true); // true
-console.log(true === false); // false
-
-console.log(null === null); // true
-
-Comparando operandos de distinto tipo
-
-console.log("3" === 3); // false
-
-console.log(true === 1); // false
-
-console.log(null === undefined); // false
-
-Comparando objetos
-
-const object1 = {
- name: "hello"
-}
-
-const object2 = {
- name: "hello"
-}
-
-console.log(object1 === object2); // false
-console.log(object1 === object1); // true
-
-Especificaciones
-
-
-
-
- Specification
-
-
-
-
- {{SpecName('ESDraft', '#sec-equality-operators', 'Equality operators')}}
-
-
-
-
-Compatibilidad entre exploradores
-
-
-
-{{Compat("javascript.operators.strict_equality")}}
-
-También revisa
-
-
diff --git a/files/es/web/javascript/reference/operators/strict_equality/index.md b/files/es/web/javascript/reference/operators/strict_equality/index.md
new file mode 100644
index 00000000000000..ae63b7beee15f5
--- /dev/null
+++ b/files/es/web/javascript/reference/operators/strict_equality/index.md
@@ -0,0 +1,91 @@
+---
+title: Igualdad Estricta (===)
+slug: Web/JavaScript/Reference/Operators/Strict_equality
+translation_of: Web/JavaScript/Reference/Operators/Strict_equality
+original_slug: Web/JavaScript/Referencia/Operadores/Strict_equality
+---
+{{jsSidebar("Operators")}}
+
+El operador de estricta igualdad (`===`) revisa si dos operandos son iguales y produce un resultado Booleano. A diferencia del operador de igualdad regular (==), el operador de estricta igualdad siempre considera que los operandos de distinto tipo de valor son diferentes y nunca similares.
+
+{{EmbedInteractiveExample("pages/js/expressions-strict-equality.html")}}The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone and send us a pull request.
+
+## Sintaxis
+
+```
+x === y
+```
+
+## Descripción
+
+Los operadores de estricta igualdad (`===` y `!==`) usan el [Algoritmo Estricto Comparativo de Igualdad](http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6)para comparar dos operandos:
+
+- Si los operandos son de diferente tipo de valor, produce `false`.
+- Si ambos operandos son objetos, produce `true` solo si se refiere al mismo objeto.
+- Si ambos operandos son de tipo `null` o ambos operandos son `undefined`, produce `true`.
+- Si cualquier operando es de tipo NaN, produce `false`.
+- En otros casos, compara los valores de ambos operandos:
+
+ - Los números deben tener el mismo valor numérico, aunque `+0` y `-0` son considerados como del mismo valor.
+ - Los strings deben tener los mismos caracteres en el mismo orden.
+ - Los booleanos deben ambos ser `true` o ambos ser `false`.
+
+La diferencia más notable entre este operador y el operador de [igualdad](/es/docs/Web/JavaScript/Reference/Operators/Equality) regular (`==`) es que si los operandos son de distinto tipo de valor, el operador `==` intenta convertir los valores a un mismo tipo de dato antes de compararlos.
+
+## Ejemplos
+
+### Comparando operandos del mismo tipo
+
+```js
+console.log("hello" === "hello"); // true
+console.log("hello" === "hola"); // false
+
+console.log(3 === 3); // true
+console.log(3 === 4); // false
+
+console.log(true === true); // true
+console.log(true === false); // false
+
+console.log(null === null); // true
+```
+
+### Comparando operandos de distinto tipo
+
+```js
+console.log("3" === 3); // false
+
+console.log(true === 1); // false
+
+console.log(null === undefined); // false
+```
+
+### Comparando objetos
+
+```js
+const object1 = {
+ name: "hello"
+}
+
+const object2 = {
+ name: "hello"
+}
+
+console.log(object1 === object2); // false
+console.log(object1 === object1); // true
+```
+
+## Especificaciones
+
+| Specification |
+| ------------------------------------------------------------------------------------------------ |
+| {{SpecName('ESDraft', '#sec-equality-operators', 'Equality operators')}} |
+
+## Compatibilidad entre exploradores
+
+{{Compat("javascript.operators.strict_equality")}}
+
+## También revisa
+
+- [Operador de igualdad](/es/docs/Web/JavaScript/Reference/Operators/Equality)
+- [Operador de desigualdad](/es/docs/Web/JavaScript/Reference/Operators/Inequality)
+- [Operador de estricta desigualdad](/es/docs/Web/JavaScript/Reference/Operators/Strict_inequality)
diff --git a/files/es/web/javascript/reference/operators/typeof/index.html b/files/es/web/javascript/reference/operators/typeof/index.html
deleted file mode 100644
index b7c951658d7b35..00000000000000
--- a/files/es/web/javascript/reference/operators/typeof/index.html
+++ /dev/null
@@ -1,77 +0,0 @@
----
-title: typeof
-slug: Web/JavaScript/Reference/Operators/typeof
-tags:
- - JavaScript
- - Operator
- - Unary
-translation_of: Web/JavaScript/Reference/Operators/typeof
-original_slug: Web/JavaScript/Referencia/Operadores/typeof
----
-{{jsSidebar("Operators")}}
-
-Resumen
-
-El operador typeof
se usa en cualquiera de los siguientes modos:
-
-
- typeof operando
- typeof (operando )
-
-
-El operador typeof
devuelve una cadena que indica el tipo del operando sin evaluarlo. operando
es la cadena, variable, palabra clave u objeto para el que se devolverá su tipo. Los paréntesis son opcionales.
-
-Suponga que define las siguientes variables:
-
-var miFuncion = new Function("5+2")
-var forma = "redonda"
-var tamano = 1
-var hoy = new Date()
-
-
-El operador typeof
devuelve los siguientes resultados para estas variables
-
-typeof miFuncion === 'function'
-typeof forma === 'string'
-typeof tamano === 'number'
-typeof hoy === 'object'
-typeof noExiste === 'undefined'
-
-
-Para las palabras clave true
y null
, el operador typeof
devuelve los siguientes resultados:
-
-typeof true === 'boolean'
-typeof null === 'object'
-
-
-Para un número o una cadena, el operador typeof
devuelve los siguientes resultados:
-
-typeof 62 === 'number'
-typeof 'Hola mundo' === 'string'
-
-
-Para valores de propiedades, el operador typeof
devuelve el tipo del valor que contiene la propiedad:
-
-typeof document.lastModified === 'string'
-typeof window.length === 'number'
-typeof Math.LN2 === 'number'
-
-
-Para métodos y funciones, el operador typeof
devuelve los resultados siguientes:
-
-typeof blur === 'function'
-typeof eval === 'function'
-typeof parseInt === 'function'
-typeof shape.split === 'function'
-
-
-Para objetos predefinidos, el operador typeof
devuelve los siguientes resultados:
-
-typeof Date === 'function'
-typeof Function === 'function'
-typeof Math === 'object'
-typeof Object === 'function'
-typeof String === 'function'
-
-
-
diff --git a/files/es/web/javascript/reference/operators/typeof/index.md b/files/es/web/javascript/reference/operators/typeof/index.md
new file mode 100644
index 00000000000000..e379c9d96e7f41
--- /dev/null
+++ b/files/es/web/javascript/reference/operators/typeof/index.md
@@ -0,0 +1,80 @@
+---
+title: typeof
+slug: Web/JavaScript/Reference/Operators/typeof
+tags:
+ - JavaScript
+ - Operator
+ - Unary
+translation_of: Web/JavaScript/Reference/Operators/typeof
+original_slug: Web/JavaScript/Referencia/Operadores/typeof
+---
+{{jsSidebar("Operators")}}
+
+## Resumen
+
+El operador `typeof` se usa en cualquiera de los siguientes modos:
+
+1. `typeof operando`
+2. `typeof (operando)`
+
+El operador `typeof` devuelve una cadena que indica el tipo del operando sin evaluarlo. `operando` es la cadena, variable, palabra clave u objeto para el que se devolverá su tipo. Los paréntesis son opcionales.
+
+Suponga que define las siguientes variables:
+
+```js
+var miFuncion = new Function("5+2")
+var forma = "redonda"
+var tamano = 1
+var hoy = new Date()
+```
+
+El operador `typeof` devuelve los siguientes resultados para estas variables
+
+```js
+typeof miFuncion === 'function'
+typeof forma === 'string'
+typeof tamano === 'number'
+typeof hoy === 'object'
+typeof noExiste === 'undefined'
+```
+
+Para las palabras clave `true` y `null`, el operador `typeof` devuelve los siguientes resultados:
+
+```js
+typeof true === 'boolean'
+typeof null === 'object'
+```
+
+Para un número o una cadena, el operador `typeof` devuelve los siguientes resultados:
+
+```js
+typeof 62 === 'number'
+typeof 'Hola mundo' === 'string'
+```
+
+Para valores de propiedades, el operador `typeof` devuelve el tipo del valor que contiene la propiedad:
+
+```js
+typeof document.lastModified === 'string'
+typeof window.length === 'number'
+typeof Math.LN2 === 'number'
+```
+
+Para métodos y funciones, el operador `typeof` devuelve los resultados siguientes:
+
+```js
+typeof blur === 'function'
+typeof eval === 'function'
+typeof parseInt === 'function'
+typeof shape.split === 'function'
+```
+
+Para objetos predefinidos, el operador `typeof` devuelve los siguientes resultados:
+
+```js
+typeof Date === 'function'
+typeof Function === 'function'
+typeof Math === 'object'
+typeof Object === 'function'
+typeof String === 'function'
+```
diff --git a/files/es/web/javascript/reference/operators/yield/index.html b/files/es/web/javascript/reference/operators/yield/index.html
deleted file mode 100644
index dcd4768149c371..00000000000000
--- a/files/es/web/javascript/reference/operators/yield/index.html
+++ /dev/null
@@ -1,131 +0,0 @@
----
-title: yield
-slug: Web/JavaScript/Reference/Operators/yield
-tags:
- - Característica del lenguaje
- - ECMAScript 2015
- - Generadores
- - Iterador
- - JavaScript
- - Operador
-translation_of: Web/JavaScript/Reference/Operators/yield
-original_slug: Web/JavaScript/Referencia/Operadores/yield
----
-{{jsSidebar("Operadores")}}
-
-La palabra clave yield
se usa para pausar y reanudar una función generadora ({{jsxref("Statements/function*", "function*")}} o {{jsxref("Statements/Legacy_generator_function", "función generadora heredada")}}).
-
-{{EmbedInteractiveExample("pages/js/expressions-yield.html", "taller")}}
-
-La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si deseas contribuir al proyecto de ejemplos interactivos, clona
https://github.com/mdn/interactive-examples y envíanos una solicitud de extracción.
-
-Sintaxis
-
-[rv ] = yield [expression ]
-
-
- expression
{{optional_inline}}
- Define el valor que se devolverá desde la función generadora a través del {{jsxref("Iteration_protocols", "protocolo iterador", "#El_protocolo_iterador")}}. Si se omite, devuelve undefined
en su lugar.
- rv
{{optional_inline}}
-
- Recupera el valor opcional pasado al método next()
del generador para reanudar su ejecución.
-
-
-
-Descripción
-
-La palabra clave yield
detiene la ejecución de la función del generador y el valor de la expresión que sigue a la palabra clave yield
se devuelve al llamador del generador. Se puede considerar como una versión basada en un generador de la palabra clave return
.
-
-yield
solo se puede llamar directamente desde la función generadora que la contiene. No se puede llamar desde funciones anidadas o retrollamadas.
-
-La palabra clave yield
hace que la llamada al método next()
del generador devuelva un objeto IteratorResult
con dos propiedades: value
y done
. La propiedad value
es el resultado de evaluar la expresión yield
, y done
es false
, lo cual indica que la función generadora no se ha completado completamente.
-
-Una vez en pausa en una expresión yield
, la ejecución del código del generador permanece en pausa hasta que se llama al método next()
del generador. Cada vez que se llama al método next()
del generador, el generador reanuda la ejecución y se ejecuta hasta que alcanza uno de los siguientes:
-
-
- Un yield
, el cual hace que el generador vuelva a pausar y devuelva el nuevo valor del generador. La próxima vez que se llame a next()
, la ejecución se reanudará con la instrucción inmediatamente después de yield
.
- {{jsxref("Statements/throw", "throw")}} se usa para lanzar una excepción desde el generador. Esta detiene la ejecución del generador por completo y la ejecución se reanuda en el llamador (como suele ser el caso cuando se lanza una excepción).
- Se alcanza el final de la función generadora. En este caso, la ejecución del generador finaliza y se devuelve un IteratorResult
al llamador en el que el value
es {{jsxref("undefined")}} y done
es true
.
- Se alcanza una instrucción {{jsxref("Statements/return", "return")}}. En este caso, la ejecución del generador finaliza y se devuelve un IteratorResult
al llamador en el que el value
es el valor especificado por la instrucción return
y done
es true
.
-
-
-Si se pasa un valor opcional al método next()
del generador, ese valor se convierte en el valor devuelto por la operación yield
actual del generador.
-
-Entre la ruta del código del generador, sus operadores yield
y la capacidad de especificar un nuevo valor inicial pasándolo a {{jsxref("Generator.prototype.next()")}}, los generadores ofrecen enorme poder y control.
-
-
-
Desafortunadamente, next()
es asimétrico, pero eso no se puede evitar: siempre envía un valor al yield
actualmente suspendido, pero devuelve el operando del siguiente yield
.
-
-
-Ejemplos
-
-Usar yield
-
-El siguiente código es la declaración de una función generadora de ejemplo.
-
-function* countAppleSales () {
- let saleList = [3, 7, 5]
- for (let i = 0; i < saleList.length; i++) {
- yield saleList[i]
- }
-}
-
-Una vez que se define una función generadora, se puede usar construyendo un iterador como el siguiente.
-
-let appleStore = countAppleSales() // Generator { }
-console.log(appleStore.next()) // { value: 3, done: false }
-console.log(appleStore.next()) // { value: 7, done: false }
-console.log(appleStore.next()) // { value: 5, done: false }
-console.log(appleStore.next()) // { value: undefined, done: true }
-
-También puedes enviar un valor con next(value)
al generador. 'step
' se evalúa como un valor de retorno en esta sintaxis [rv ] = yield [expression ]
-
-function* counter(value) {
- let step;
-
- while (true) {
- step = yield ++value;
-
- if (step) {
- value += step;
- }
- }
-}
-
-const generatorFunc = counter(0);
-console.log(generatorFunc.next().value); // 1
-console.log(generatorFunc.next().value); // 2
-console.log(generatorFunc.next().value); // 3
-console.log(generatorFunc.next(10).value); // 14
-console.log(generatorFunc.next().value); // 15
-console.log(generatorFunc.next(10).value); // 26
-
-Especificaciones
-
-
-
-
- Especificación
-
-
-
-
- {{SpecName('ESDraft', '#prod-YieldExpression', 'Yield')}}
-
-
-
-
-Compatibilidad del navegador
-
-
-
-{{Compat("javascript.operators.yield")}}
-
-Ve también
-
-
- El protocolo Iterator
- {{jsxref("Statements/function*", "function*")}}
- {{jsxref("Operators/function*", "function* expression")}}
- {{jsxref("Operators/yield*", "yield*")}}
-
diff --git a/files/es/web/javascript/reference/operators/yield/index.md b/files/es/web/javascript/reference/operators/yield/index.md
new file mode 100644
index 00000000000000..da2017aa213f37
--- /dev/null
+++ b/files/es/web/javascript/reference/operators/yield/index.md
@@ -0,0 +1,116 @@
+---
+title: yield
+slug: Web/JavaScript/Reference/Operators/yield
+tags:
+ - Característica del lenguaje
+ - ECMAScript 2015
+ - Generadores
+ - Iterador
+ - JavaScript
+ - Operador
+translation_of: Web/JavaScript/Reference/Operators/yield
+original_slug: Web/JavaScript/Referencia/Operadores/yield
+---
+{{jsSidebar("Operadores")}}
+
+La palabra clave `yield` se usa para pausar y reanudar una función generadora ({{jsxref("Statements/function*", "function*")}} o {{jsxref("Statements/Legacy_generator_function", "función generadora heredada")}}).
+
+{{EmbedInteractiveExample("pages/js/expressions-yield.html", "taller")}}La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si deseas contribuir al proyecto de ejemplos interactivos, clona y envíanos una solicitud de extracción.
+
+## Sintaxis
+
+```
+[rv] = yield [expression]
+```
+
+- `expression` {{optional_inline}}
+ - : Define el valor que se devolverá desde la función generadora a través del {{jsxref("Iteration_protocols", "protocolo iterador", "#El_protocolo_iterador")}}. Si se omite, devuelve `undefined` en su lugar.
+- `rv` {{optional_inline}}
+ - : Recupera el valor opcional pasado al método `next()` del generador para reanudar su ejecución.
+
+## Descripción
+
+La palabra clave `yield` detiene la ejecución de la función del generador y el valor de la expresión que sigue a la palabra clave `yield` se devuelve al llamador del generador. Se puede considerar como una versión basada en un generador de la palabra clave `return`.
+
+`yield` solo se puede llamar directamente desde la función generadora que la contiene. No se puede llamar desde funciones anidadas o retrollamadas.
+
+La palabra clave `yield` hace que la llamada al método `next()` del generador devuelva un objeto `IteratorResult` con dos propiedades: `value` y `done`. La propiedad `value` es el resultado de evaluar la expresión `yield`, y `done` es `false`, lo cual indica que la función generadora no se ha completado completamente.
+
+Una vez en pausa en una expresión `yield`, la ejecución del código del generador permanece en pausa hasta que se llama al método `next()` del generador. Cada vez que se llama al método `next()` del generador, el generador reanuda la ejecución y se ejecuta hasta que alcanza uno de los siguientes:
+
+- Un `yield`, el cual hace que el generador vuelva a pausar y devuelva el nuevo valor del generador. La próxima vez que se llame a `next()`, la ejecución se reanudará con la instrucción inmediatamente después de `yield`.
+- {{jsxref("Statements/throw", "throw")}} se usa para lanzar una excepción desde el generador. Esta detiene la ejecución del generador por completo y la ejecución se reanuda en el llamador (como suele ser el caso cuando se lanza una excepción).
+- Se alcanza el final de la función generadora. En este caso, la ejecución del generador finaliza y se devuelve un `IteratorResult` al llamador en el que el `value` es {{jsxref("undefined")}} y `done` es `true`.
+- Se alcanza una instrucción {{jsxref("Statements/return", "return")}}. En este caso, la ejecución del generador finaliza y se devuelve un `IteratorResult` al llamador en el que el `value` es el valor especificado por la instrucción `return` y `done` es `true`.
+
+Si se pasa un valor opcional al método `next()` del generador, ese valor se convierte en el valor devuelto por la operación `yield` actual del generador.
+
+Entre la ruta del código del generador, sus operadores `yield` y la capacidad de especificar un nuevo valor inicial pasándolo a {{jsxref("Generator.prototype.next()")}}, los generadores ofrecen enorme poder y control.
+
+> **Advertencia:** Desafortunadamente, `next()` es asimétrico, pero eso no se puede evitar: siempre envía un valor al `yield` actualmente suspendido, pero devuelve el operando del siguiente `yield`.
+
+## Ejemplos
+
+### Usar `yield`
+
+El siguiente código es la declaración de una función generadora de ejemplo.
+
+```js
+function* countAppleSales () {
+ let saleList = [3, 7, 5]
+ for (let i = 0; i < saleList.length; i++) {
+ yield saleList[i]
+ }
+}
+```
+
+Una vez que se define una función generadora, se puede usar construyendo un iterador como el siguiente.
+
+```js
+let appleStore = countAppleSales() // Generator { }
+console.log(appleStore.next()) // { value: 3, done: false }
+console.log(appleStore.next()) // { value: 7, done: false }
+console.log(appleStore.next()) // { value: 5, done: false }
+console.log(appleStore.next()) // { value: undefined, done: true }
+```
+
+También puedes enviar un valor con `next(value)` al generador. '`step`' se evalúa como un valor de retorno en esta sintaxis \[_rv_] = **yield** \[_expression_]
+
+```js
+function* counter(value) {
+ let step;
+
+ while (true) {
+ step = yield ++value;
+
+ if (step) {
+ value += step;
+ }
+ }
+}
+
+const generatorFunc = counter(0);
+console.log(generatorFunc.next().value); // 1
+console.log(generatorFunc.next().value); // 2
+console.log(generatorFunc.next().value); // 3
+console.log(generatorFunc.next(10).value); // 14
+console.log(generatorFunc.next().value); // 15
+console.log(generatorFunc.next(10).value); // 26
+```
+
+## Especificaciones
+
+| Especificación |
+| ---------------------------------------------------------------------------- |
+| {{SpecName('ESDraft', '#prod-YieldExpression', 'Yield')}} |
+
+## Compatibilidad del navegador
+
+{{Compat("javascript.operators.yield")}}
+
+## Ve también
+
+- [El protocolo `Iterator`](/es/docs/Web/JavaScript/Guide/The_Iterator_protocol)
+- {{jsxref("Statements/function*", "function*")}}
+- {{jsxref("Operators/function*", "function* expression")}}
+- {{jsxref("Operators/yield*", "yield*")}}
diff --git a/files/es/web/javascript/reference/statements/async_function/index.html b/files/es/web/javascript/reference/statements/async_function/index.html
deleted file mode 100644
index 4de7af72698cd4..00000000000000
--- a/files/es/web/javascript/reference/statements/async_function/index.html
+++ /dev/null
@@ -1,174 +0,0 @@
----
-title: Función async
-slug: Web/JavaScript/Reference/Statements/async_function
-tags:
- - Declaración
- - Ejemplo
- - JavaScript
- - función
-translation_of: Web/JavaScript/Reference/Statements/async_function
-original_slug: Web/JavaScript/Referencia/Sentencias/funcion_asincrona
----
-
-
{{jsSidebar("Statements")}}
-
-
La declaración de función async
define una función asíncrona , la cual devuelve un objeto {{jsxref("Global_Objects/AsyncFunction","AsyncFunction")}}.
-
-
-
Es posible definir también funciones asíncronas a través de una {{jsxref("Operators/async_function", "expresión de función async", "", 1)}}.
-
-
-
-{{EmbedInteractiveExample("pages/js/statement-async.html", "taller")}}
-
-The source for this interactive demo is stored in a GitHub repository. If you'd like to contribute to the interactive demo project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
-
-Sintaxis
-
-async function name ([param [, param [, ... param ]]]) {
- statements
-}
-
-
-Parámetros
-
-
- name
- El nombre de la función.
-
-
-
- param
- El nombre de un argumento que se debe pasar a la función.
-
-
-
- statements
- Las declaraciones que conforman el cuerpo de la función.
-
-
-Valor de retorno
-
-Un objeto {{jsxref("Global_Objects/AsyncFunction","AsyncFunction")}}, que representa una función asíncrona que ejecuta el código contenido dentro de la función.
-
-Descripción
-
-Cuando se llama a una función async
, esta devuelve un elemento {{jsxref("Promise")}}. Cuando la función async
devuelve un valor, Promise
se resolverá con el valor devuelto. Si la función async
genera una excepción o algún valor, Promise
se rechazará con el valor generado.
-
-Una función async
puede contener una expresión {{jsxref("Operators/await", "await")}}, la cual pausa la ejecución de la función asíncrona y espera la resolución de la Promise
pasada y, a continuación, reanuda la ejecución de la función async
y devuelve el valor resuelto.
-
-
-
La finalidad de las funciones async
/await
es simplificar el comportamiento del uso síncrono de promesas y realizar algún comportamiento específico en un grupo de Promises
. Del mismo modo que las Promises
son semejantes a las devoluciones de llamadas estructuradas, async
/await
se asemejan a una combinación de generadores y promesas.
-
-
-Ejemplos
-
-Ejemplo sencillo
-
-function resolveAfter2Seconds(x) {
- return new Promise(resolve => {
- setTimeout(() => {
- resolve(x);
- }, 2000);
- });
-}
-
-
-async function add1(x) {
- const a = await resolveAfter2Seconds(20);
- const b = await resolveAfter2Seconds(30);
- return x + a + b;
-}
-
-add1(10).then(v => {
- console.log(v); // prints 60 after 4 seconds.
-});
-
-
-async function add2(x) {
- const p_a = resolveAfter2Seconds(20);
- const p_b = resolveAfter2Seconds(30);
- return x + await p_a + await p_b;
-}
-
-add2(10).then(v => {
- console.log(v); // prints 60 after 2 seconds.
-});
-
-
-
-
No se deben confundir await
y Promise.all
-
-
En add1
, la ejecución se suspende durante dos segundos correspondientes al primer operador await
, y luego durante otros dos segundos correspondientes al segundo await
. El segundo temporizador no se crea hasta que el primero no se haya disparado ya. En add2
, ambos temporizadores se crean y, acto seguido, ambos reciben await
. Esto provoca la resolución en dos segundos y no cuatro, ya que los temporizadores se ejecutaron de manera simultánea. Sin embargo, ambas llamadas await
aún pueden ejecutarse en series, no en paralelo: esto no constituye ninguna aplicación automática de Promise.all
. Si se desea aplicar await
a dos o más promesas en paralelo, es preciso utilizar Promise.all
.
-
-
-Reescritura de una cadena de promesas con una función async
-
-Una API que devuelva una {{jsxref("Promise")}} tendrá como resultado una cadena de promesas, y dividirá la función en muchas partes. Estudie este código:
-
-function getProcessedData(url) {
- return downloadData(url) // returns a promise
- .catch(e => {
- return downloadFallbackData(url) // returns a promise
- })
- .then(v => {
- return processDataInWorker(v); // returns a promise
- });
-}
-
-
-Es posible reescribirlo utilizando un solo operador async
de esta manera:
-
-async function getProcessedData(url) {
- let v;
- try {
- v = await downloadData(url);
- } catch(e) {
- v = await downloadFallbackData(url);
- }
- return processDataInWorker(v);
-}
-
-
-Observe que, en el ejemplo anterior, no hay ninguna instrucción await
dentro de la instrucción return
, porque el valor de retorno de una async function
queda implícitamente dentro de un {{jsxref("Promise.resolve")}}.
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
-
-
- {{SpecName('ESDraft', '#sec-async-function-definitions', 'Función async')}}
- {{Spec2('ESDraft')}}
- Definición inicial en ES2017.
-
-
- {{SpecName('ES8', '#sec-async-function-definitions', 'Función async')}}
- {{Spec2('ES8')}}
-
-
-
-
-
-Compatibilidad entre navegadores
-
-
-
-
-
{{Compat("javascript.statements.async_function")}}
-
-
-Véase también
-
-
diff --git a/files/es/web/javascript/reference/statements/async_function/index.md b/files/es/web/javascript/reference/statements/async_function/index.md
new file mode 100644
index 00000000000000..7e31392bf4aab6
--- /dev/null
+++ b/files/es/web/javascript/reference/statements/async_function/index.md
@@ -0,0 +1,143 @@
+---
+title: Función async
+slug: Web/JavaScript/Reference/Statements/async_function
+tags:
+ - Declaración
+ - Ejemplo
+ - JavaScript
+ - función
+translation_of: Web/JavaScript/Reference/Statements/async_function
+original_slug: Web/JavaScript/Referencia/Sentencias/funcion_asincrona
+---
+{{jsSidebar("Statements")}}
+
+La declaración de función **`async`** define una _función asíncrona_, la cual devuelve un objeto {{jsxref("Global_Objects/AsyncFunction","AsyncFunction")}}.
+
+Es posible definir también funciones asíncronas a través de una {{jsxref("Operators/async_function", "expresión de función async", "", 1)}}.
+
+{{EmbedInteractiveExample("pages/js/statement-async.html", "taller")}}
+
+The source for this interactive demo is stored in a GitHub repository. If you'd like to contribute to the interactive demo project, please clone and send us a pull request.
+
+## Sintaxis
+
+```
+async function name([param[, param[, ... param]]]) {
+ statements
+}
+```
+
+### Parámetros
+
+- `name`
+ - : El nombre de la función.
+
+
+
+- `param`
+ - : El nombre de un argumento que se debe pasar a la función.
+
+
+
+- `statements`
+ - : Las declaraciones que conforman el cuerpo de la función.
+
+### Valor de retorno
+
+Un objeto {{jsxref("Global_Objects/AsyncFunction","AsyncFunction")}}, que representa una función asíncrona que ejecuta el código contenido dentro de la función.
+
+## Descripción
+
+Cuando se llama a una función `async`, esta devuelve un elemento {{jsxref("Promise")}}. Cuando la función `async` devuelve un valor, `Promise` se resolverá con el valor devuelto. Si la función `async` genera una excepción o algún valor, `Promise` se rechazará con el valor generado.
+
+Una función `async` puede contener una expresión {{jsxref("Operators/await", "await")}}, la cual pausa la ejecución de la función asíncrona y espera la resolución de la `Promise` pasada y, a continuación, reanuda la ejecución de la función `async` y devuelve el valor resuelto.
+
+> **Nota:** La finalidad de las funciones `async`/`await` es simplificar el comportamiento del uso síncrono de promesas y realizar algún comportamiento específico en un grupo de `Promises`. Del mismo modo que las `Promises` son semejantes a las devoluciones de llamadas estructuradas, `async`/`await` se asemejan a una combinación de generadores y promesas.
+
+## Ejemplos
+
+### Ejemplo sencillo
+
+```js
+function resolveAfter2Seconds(x) {
+ return new Promise(resolve => {
+ setTimeout(() => {
+ resolve(x);
+ }, 2000);
+ });
+}
+
+
+async function add1(x) {
+ const a = await resolveAfter2Seconds(20);
+ const b = await resolveAfter2Seconds(30);
+ return x + a + b;
+}
+
+add1(10).then(v => {
+ console.log(v); // prints 60 after 4 seconds.
+});
+
+
+async function add2(x) {
+ const p_a = resolveAfter2Seconds(20);
+ const p_b = resolveAfter2Seconds(30);
+ return x + await p_a + await p_b;
+}
+
+add2(10).then(v => {
+ console.log(v); // prints 60 after 2 seconds.
+});
+```
+
+> **Advertencia:** **No se deben confundir `await` y `Promise.all`** En `add1`, la ejecución se suspende durante dos segundos correspondientes al primer operador `await`, y luego durante otros dos segundos correspondientes al segundo `await`. El segundo temporizador no se crea hasta que el primero no se haya disparado ya. En `add2`, ambos temporizadores se crean y, acto seguido, ambos reciben `await`. Esto provoca la resolución en dos segundos y no cuatro, ya que los temporizadores se ejecutaron de manera simultánea. Sin embargo, ambas llamadas `await` aún pueden ejecutarse en series, no en paralelo: esto **no** constituye ninguna aplicación automática de `Promise.all`. Si se desea aplicar `await` a dos o más promesas en paralelo, es preciso utilizar `Promise.all`.
+
+### Reescritura de una cadena de promesas con una función `async`
+
+Una API que devuelva una {{jsxref("Promise")}} tendrá como resultado una cadena de promesas, y dividirá la función en muchas partes. Estudie este código:
+
+```js
+function getProcessedData(url) {
+ return downloadData(url) // returns a promise
+ .catch(e => {
+ return downloadFallbackData(url) // returns a promise
+ })
+ .then(v => {
+ return processDataInWorker(v); // returns a promise
+ });
+}
+```
+
+Es posible reescribirlo utilizando un solo operador `async` de esta manera:
+
+```js
+async function getProcessedData(url) {
+ let v;
+ try {
+ v = await downloadData(url);
+ } catch(e) {
+ v = await downloadFallbackData(url);
+ }
+ return processDataInWorker(v);
+}
+```
+
+Observe que, en el ejemplo anterior, no hay ninguna instrucción `await` dentro de la instrucción `return`, porque el valor de retorno de una `async function` queda implícitamente dentro de un {{jsxref("Promise.resolve")}}.
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| ---------------------------------------------------------------------------------------------------- | ---------------------------- | ----------------------------- |
+| {{SpecName('ESDraft', '#sec-async-function-definitions', 'Función async')}} | {{Spec2('ESDraft')}} | Definición inicial en ES2017. |
+| {{SpecName('ES8', '#sec-async-function-definitions', 'Función async')}} | {{Spec2('ES8')}} | |
+
+## Compatibilidad entre navegadores
+
+{{Compat("javascript.statements.async_function")}}
+
+## Véase también
+
+- {{jsxref("Operators/async_function", "Expresión de función async")}}
+- Objeto {{jsxref("AsyncFunction")}}
+- {{jsxref("Operators/await", "await")}}
+- [«Decorar funciones async de JavaScript» en innolitics.com](http://innolitics.com/10x/javascript-decorators-for-promise-returning-functions/) (en inglés)
diff --git a/files/es/web/javascript/reference/statements/for-await...of/index.html b/files/es/web/javascript/reference/statements/for-await...of/index.html
deleted file mode 100644
index 8150dc1b826267..00000000000000
--- a/files/es/web/javascript/reference/statements/for-await...of/index.html
+++ /dev/null
@@ -1,145 +0,0 @@
----
-title: for await...of
-slug: Web/JavaScript/Reference/Statements/for-await...of
-tags:
- - Iteración
- - JavaScript
- - Referencia
- - Sentencia
- - asincrónico
- - await
- - iterar
-translation_of: Web/JavaScript/Reference/Statements/for-await...of
-original_slug: Web/JavaScript/Referencia/Sentencias/for-await...of
----
-{{jsSidebar("Statements")}}
-
-La sentencia for await...of
crea un bucle iterando tanto sobre objetos iterables asincrónicos como sincrónicos, incluyendo: built-in {{jsxref("String")}}, {{jsxref("Array")}}, objetos Array
-like (por ej., {{jsxref("Functions/arguments", "arguments")}} o {{domxref("NodeList")}}), {{jsxref("TypedArray")}}, {{jsxref("Map")}}, {{jsxref("Set")}}, y async/sync iterables definidos por el usuario. Invoca un hook de iteración personalizada con sentencias a ser ejecutadas por el valor de cada propiedad diferente del objeto.
-
-El código fuente de este ejemplo interactivo está almacenado en un repositorio Github. Si te gustaría contribuir al proyecto de ejemplos interactivos, por favor clona https://github.com/mdn/interactive-examples y envíanos un pull request.
-
-Sintaxis
-
-for await (variable of iterable ) {
- sentencia
- }
-
-
-
- variable
- En cada iteración, el valor de una propiedad diferente es asignado a variable . variable puede ser declarada con const
, let
, o var
.
- iterable
- Objeto sobre cuyas propiedades se itera.
-
-
-Iterando sobre iterables asincrónicos
-
-También puedes iterar sobre un objeto que explícitamente implementa el protocolo async iterable:
-
-var asyncIterable = {
- [Symbol.asyncIterator]() {
- return {
- i: 0,
- next() {
- if (this.i < 3) {
- return Promise.resolve({ value: this.i++, done: false });
- }
-
- return Promise.resolve({ done: true });
- }
- };
- }
-};
-
-(async function() {
- for await (let num of asyncIterable) {
- console.log(num);
- }
-})();
-
-// 0
-// 1
-// 2
-
-
-Iterando sobre funciones generadoras asincrónicas
-
-Debido a que las funciones generadoras asincrónicas implementan el protocolo async iterator, las mismas pueden ser iteradas utilizando for await... of
-
-async function* asyncGenerator() {
- var i = 0;
- while (i < 3) {
- yield i++;
- }
-}
-
-(async function() {
- for await (let num of asyncGenerator()) {
- console.log(num);
- }
-})();
-// 0
-// 1
-// 2
-
-Para un ejemplo más concreto de iteración sobre una función generadora utilizando for await... of
, considera iterar sobre datos provistos por una API. Este ejemplo primero crea un iterador asincrónico para un stream de datos, luego lo utiliza para obtener el tamaño de la respuesta desde la API.
-
-async function* streamAsyncIterator(stream) {
- const reader = stream.getReader();
- try {
- while (true) {
- const { done, value } = await reader.read();
- if (done) {
- return;
- }
- yield value;
- }
- } finally {
- reader.releaseLock();
- }
-}
-// Obtiene datos desde url y calcula el tamaño de la respuesta utilizando la función generadora asincrónica.
-async function getResponseSize(url) {
- const response = await fetch(url);
- // Almacenará el tamaño de la respuesta en bytes.
- let responseSize = 0;
- // El buble for-await-of. Itera asincrónicamente sobre cada parte de la respuesta.
- for await (const chunk of streamAsyncIterator(response.body)) {
- // Incrementando el tamaño total.
- responseSize += chunk.length;
- }
-
- console.log(`Tamaño de la respuesta: ${responseSize} bytes`);
- // salida esperada: "Tamaño de la respuesta: 1071472"
- return responseSize;
-}
-getResponseSize('https://jsonplaceholder.typicode.com/photos');
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentarios
-
-
- {{SpecName('ESDraft', '#sec-for-in-and-for-of-statements', 'ECMAScript Language: The for-in, for-of, and for-await-of Statements')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad de Navegadores
-
-
-
-{{Compat("javascript.statements.for_await_of")}}
-
-Ver también
-
-
- {{jsxref("Statements/for...of")}}
-
diff --git a/files/es/web/javascript/reference/statements/for-await...of/index.md b/files/es/web/javascript/reference/statements/for-await...of/index.md
new file mode 100644
index 00000000000000..f406f13ddc81bf
--- /dev/null
+++ b/files/es/web/javascript/reference/statements/for-await...of/index.md
@@ -0,0 +1,134 @@
+---
+title: for await...of
+slug: Web/JavaScript/Reference/Statements/for-await...of
+tags:
+ - Iteración
+ - JavaScript
+ - Referencia
+ - Sentencia
+ - asincrónico
+ - await
+ - iterar
+translation_of: Web/JavaScript/Reference/Statements/for-await...of
+original_slug: Web/JavaScript/Referencia/Sentencias/for-await...of
+---
+{{jsSidebar("Statements")}}
+
+La **sentencia** **`for await...of`** crea un bucle iterando tanto sobre objetos iterables asincrónicos como sincrónicos, incluyendo: built-in {{jsxref("String")}}, {{jsxref("Array")}}, objetos `Array`-like (por ej., {{jsxref("Functions/arguments", "arguments")}} o {{domxref("NodeList")}}), {{jsxref("TypedArray")}}, {{jsxref("Map")}}, {{jsxref("Set")}}, y async/sync iterables definidos por el usuario. Invoca un hook de iteración personalizada con sentencias a ser ejecutadas por el valor de cada propiedad diferente del objeto.
+
+El código fuente de este ejemplo interactivo está almacenado en un repositorio Github. Si te gustaría contribuir al proyecto de ejemplos interactivos, por favor clona y envíanos un pull request.
+
+## Sintaxis
+
+```
+for await (variable of iterable) {
+ sentencia
+}
+```
+
+- `variable`
+ - : En cada iteración, el valor de una propiedad diferente es asignado a _variable_. _variable_ puede ser declarada con `const`, `let`, o `var`.
+- `iterable`
+ - : Objeto sobre cuyas propiedades se itera.
+
+### Iterando sobre iterables asincrónicos
+
+También puedes iterar sobre un objeto que explícitamente implementa el protocolo async iterable:
+
+```js
+var asyncIterable = {
+ [Symbol.asyncIterator]() {
+ return {
+ i: 0,
+ next() {
+ if (this.i < 3) {
+ return Promise.resolve({ value: this.i++, done: false });
+ }
+
+ return Promise.resolve({ done: true });
+ }
+ };
+ }
+};
+
+(async function() {
+ for await (let num of asyncIterable) {
+ console.log(num);
+ }
+})();
+
+// 0
+// 1
+// 2
+```
+
+### Iterando sobre funciones generadoras asincrónicas
+
+Debido a que las funciones generadoras asincrónicas implementan el protocolo async iterator, las mismas pueden ser iteradas utilizando `for await... of`
+
+```js
+async function* asyncGenerator() {
+ var i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+(async function() {
+ for await (let num of asyncGenerator()) {
+ console.log(num);
+ }
+})();
+// 0
+// 1
+// 2
+```
+
+Para un ejemplo más concreto de iteración sobre una función generadora utilizando `for await... of`, considera iterar sobre datos provistos por una API. Este ejemplo primero crea un iterador asincrónico para un stream de datos, luego lo utiliza para obtener el tamaño de la respuesta desde la API.
+
+```js
+async function* streamAsyncIterator(stream) {
+ const reader = stream.getReader();
+ try {
+ while (true) {
+ const { done, value } = await reader.read();
+ if (done) {
+ return;
+ }
+ yield value;
+ }
+ } finally {
+ reader.releaseLock();
+ }
+}
+// Obtiene datos desde url y calcula el tamaño de la respuesta utilizando la función generadora asincrónica.
+async function getResponseSize(url) {
+ const response = await fetch(url);
+ // Almacenará el tamaño de la respuesta en bytes.
+ let responseSize = 0;
+ // El buble for-await-of. Itera asincrónicamente sobre cada parte de la respuesta.
+ for await (const chunk of streamAsyncIterator(response.body)) {
+ // Incrementando el tamaño total.
+ responseSize += chunk.length;
+ }
+
+ console.log(`Tamaño de la respuesta: ${responseSize} bytes`);
+ // salida esperada: "Tamaño de la respuesta: 1071472"
+ return responseSize;
+}
+getResponseSize('https://jsonplaceholder.typicode.com/photos');
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentarios |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ----------- |
+| {{SpecName('ESDraft', '#sec-for-in-and-for-of-statements', 'ECMAScript Language: The for-in, for-of, and for-await-of Statements')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad de Navegadores
+
+{{Compat("javascript.statements.for_await_of")}}
+
+## Ver también
+
+- {{jsxref("Statements/for...of")}}
diff --git a/files/es/web/javascript/reference/statements/for...in/index.html b/files/es/web/javascript/reference/statements/for...in/index.html
deleted file mode 100644
index d72fbcbc3fe633..00000000000000
--- a/files/es/web/javascript/reference/statements/for...in/index.html
+++ /dev/null
@@ -1,151 +0,0 @@
----
-title: for...in
-slug: Web/JavaScript/Reference/Statements/for...in
-tags:
- - Característica del lenguaje
- - Declaración
- - JavaScript
-translation_of: Web/JavaScript/Reference/Statements/for...in
-original_slug: Web/JavaScript/Referencia/Sentencias/for...in
----
-{{jsSidebar("Statements")}}
-
-La instrucción {{JSxRef("Sentencias/for...in", "for-in")}} itera sobre todas las {{JSxRef("../Enumerability_and_ownership_of_properties", "propiedades enumerables")}} de un objeto que está codificado por cadenas (ignorando los codificados por {{JSxRef("Objetos_globales/Symbol", "Símbolos")}}, incluidas las propiedades enumerables heredadas.
-
-{{EmbedInteractiveExample("pages/js/statement-forin.html")}}
-
-La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si deseas contribuir al proyecto de ejemplos interactivos, clona https://github.com/mdn/interactive-examples y envíanos una solicitud de extracción.
-
-Sintaxis
-
-for (variable in objeto )
- instrucción
-
-
- variable
- Asigna un nombre de propiedad diferente a la variable en cada iteración.
- objeto
- Objeto cuyas propiedades enumerables que no son símbolos se iteran.
-
-
-Descripción
-
-Un bucle for...in
solo itera sobre propiedades enumerables que no son símbolo. Los objetos creados a partir de constructores integrados como Array
y Object
han heredado propiedades no enumerables de Object.prototype
y String.prototype
, como el método {{JSxRef("String.indexOf", "indexOf()")}} de {{JSxRef("String")}} o el método {{JSxRef("Object.toString", "toString()")}} de {{JSxRef("Object")}}. El bucle iterará sobre todas las propiedades enumerables del objeto en sí y aquellas que el objeto hereda de su cadena de prototipos (las propiedades de los prototipos más cercanos tienen prioridad sobre las de los prototipos más alejados del objeto en su cadena de prototipos).
-
-Propiedades deleted
, added
o modified
-
-Un bucle for...in
itera sobre las propiedades de un objeto en un orden arbitrario (consulta el operador {{JSxRef("Operadores/delete", "delete")}} para obtener más información sobre por qué no puede depender del aparente orden de la iteración, al menos en una configuración entre navegadores).
-
-Si una propiedad se modifica en una iteración y luego se visita en un momento posterior, su valor en el bucle es su valor en ese momento posterior. Una propiedad que se elimina antes de haber sido visitada no se visitará más tarde. Las propiedades agregadas al objeto sobre el que se está produciendo la iteración se pueden visitar u omitir de la iteración.
-
-En general, es mejor no agregar, modificar o eliminar propiedades del objeto durante la iteración, aparte de la propiedad que se está visitando actualmente. No hay garantía de si se visitará una propiedad agregada, si se visitará una propiedad modificada (distinta de la actual) antes o después de que se modifique, o si se visitará una propiedad eliminada antes de eliminarla.
-
-Iteración en arreglos y for
...in
-
-
-
Nota : for...in
no se debe usar para iterar sobre un {{JSxRef("Array")}} donde el orden del índice es importante.
-
-
-Los índices del arreglo son solo propiedades enumerables con nombres enteros y, por lo demás, son idénticos a las propiedades generales del objeto. No hay garantía de que for...in
devuelva los índices en un orden en particular. La instrucción de bucle for...in
devolverá todas las propiedades enumerables, incluidas aquellas con nombres no enteros y aquellas que se heredan.
-
-Debido a que el orden de iteración depende de la implementación, es posible que la iteración sobre un arreglo no visite los elementos en un orden coherente. Por lo tanto, es mejor usar un bucle {{JSxRef("Sentencias/for", "for")}} con un índice numérico (o {{JSxRef("Array.prototype.forEach()")}} o el bucle {{JSxRef("Sentencias/for...of", "for...of")}}) cuando se itera sobre arreglos donde el orden de acceso es importante.
-
-Iterar solo sobre propiedades directas
-
-Si solo deseas considerar las propiedades adjuntas al objeto en sí mismo, y no sus prototipos, usa {{JSxRef("Object.getOwnPropertyNames", "getOwnPropertyNames()")}} o realiza una {{JSxRef("Object.prototype.hasOwnProperty", "hasOwnProperty()")}} verificación ({{jsxref("Object.prototype.propertyIsEnumerable", "propertyIsEnumerable()")}} también se puede utilizar). Alternativamente, si sabes que no habrá ninguna interferencia de código externo, puedes extender los prototipos incorporados con un método de verificación.
-
-¿Por qué usar for
...in
?
-
-Dado que for...in
está construido para iterar propiedades de objeto, no se recomienda su uso con arreglos y opciones como Array.prototype.forEach()
y existe for...of
, ¿cuál podría ser el uso de for...in
?
-
-Es posible que se utilice de forma más práctica con fines de depuración, ya que es una forma fácil de comprobar las propiedades de un objeto (mediante la salida a la consola o de otro modo). Aunque los arreglos suelen ser más prácticos para almacenar datos, en situaciones en las que se prefiere un par clave-valor para trabajar con datos (con propiedades que actúan como la "clave"), puede haber casos en los que desees comprobar si alguna de esas claves cumple un valor particular.
-
-Ejemplos
-
-Utilizar for
...in
-
-El siguiente bucle for...in
itera sobre todas las propiedades enumerables que no son símbolos del objeto y registra una cadena de los nombres de propiedad y sus valores.
-
-var obj = {a: 1, b: 2, c: 3};
-
-for (const prop in obj) {
- console.log(`obj.${prop} = ${obj[prop]}`);
-}
-
-// Produce:
-// "obj.a = 1"
-// "obj.b = 2"
-// "obj.c = 3"
-
-Iterar propiedades directas
-
-La siguiente función ilustra el uso de {{JSxRef("Object.prototype.hasOwnProperty", "hasOwnProperty()")}} — las propiedades heredadas no se muestran.
-
-var triangle = {a: 1, b: 2, c: 3};
-
-function ColoredTriangle() {
- this.color = 'red';
-}
-
-ColoredTriangle.prototype = triangle;
-
-var obj = new ColoredTriangle();
-
-for (const prop in obj) {
- if (obj.hasOwnProperty(prop)) {
- console.log(`obj.${prop} = ${obj[prop]}`);
- }
-}
-
-// Produce:
-// "obj.color = red"
-
-
-Especificaciones
-
-
-
-
- Especificación
-
-
- {{SpecName('ESDraft', '#sec-for-in-and-for-of-statements', 'declaración for...in')}}
-
-
-
-
-Compatibilidad del navegador
-
-
-
-{{Compat("javascript.statements.for_in")}}
-
-Compatibilidad: expresiones iniciadoras en modo estricto
-
-Antes de Firefox 40, era posible utilizar una expresión iniciadora (i=0
) en un bucle for...in
:
-
-var obj = {a: 1, b: 2, c: 3};
-for (var i = 0 in obj) {
- console.log(obj[i]);
-}
-// 1
-// 2
-// 3
-
-
-Este comportamiento no estándar ahora se ignora en la versión 40 y posteriores, y presentará un {{JSxRef("SyntaxError")}} ("{{JSxRef("errors/Invalid_for-in_initializer", "iniciador for...in no válido", "las declaraciones de encabezado del bucle for-in posiblemente no tengan iniciadores")}} en {{JSxRef("Strict_mode", "modo estricto")}} ({{bug(748550)}} y {{bug(1164741)}}").
-
-Otros motores como v8 (Chrome), Chakra (IE/Edge) y JSC (WebKit/Safari) están investigando si eliminar también el comportamiento no estándar.
-
-Ve también
-
-
- {{JSxRef("Sentencias/for...of", "for...of")}} — una declaración similar que itera sobre la propiedad values
- {{JSxRef("Sentencias/for_each...in", "for each...in")}} — una declaración similar pero obsoleta que itera sobre los valores de las propiedades de un objeto, en lugar de los nombres de las propiedades en sí
- {{JSxRef("Sentencias/for", "for")}}
- {{JSxRef("../Guide/Iterators_and_Generators", "Expresiones generadoras")}} (usa la sintaxis for...in
)
- {{JSxRef("../Enumerability_and_ownership_of_properties", "Enumerabilidad y posesión de propiedades")}}
- {{JSxRef("Object.getOwnPropertyNames()")}}
- {{JSxRef("Object.prototype.hasOwnProperty()")}}
- {{JSxRef("Array.prototype.forEach()")}}
-
diff --git a/files/es/web/javascript/reference/statements/for...in/index.md b/files/es/web/javascript/reference/statements/for...in/index.md
new file mode 100644
index 00000000000000..edea691ad9d2ba
--- /dev/null
+++ b/files/es/web/javascript/reference/statements/for...in/index.md
@@ -0,0 +1,142 @@
+---
+title: for...in
+slug: Web/JavaScript/Reference/Statements/for...in
+tags:
+ - Característica del lenguaje
+ - Declaración
+ - JavaScript
+translation_of: Web/JavaScript/Reference/Statements/for...in
+original_slug: Web/JavaScript/Referencia/Sentencias/for...in
+---
+{{jsSidebar("Statements")}}
+
+La instrucción {{JSxRef("Sentencias/for...in", "for-in")}} itera sobre todas las {{JSxRef("../Enumerability_and_ownership_of_properties", "propiedades enumerables")}} de un objeto que está codificado por cadenas (ignorando los codificados por {{JSxRef("Objetos_globales/Symbol", "Símbolos")}}, incluidas las propiedades enumerables heredadas.
+
+{{EmbedInteractiveExample("pages/js/statement-forin.html")}}
+
+La fuente de este ejemplo interactivo se almacena en un repositorio de GitHub. Si deseas contribuir al proyecto de ejemplos interactivos, clona y envíanos una solicitud de extracción.
+
+## Sintaxis
+
+```
+for (variable in objeto)
+ instrucción
+```
+
+- `variable`
+ - : Asigna un nombre de propiedad diferente a la _variable_ en cada iteración.
+- `objeto`
+ - : Objeto cuyas propiedades enumerables que no son símbolos se iteran.
+
+## Descripción
+
+Un bucle `for...in` solo itera sobre propiedades enumerables que no son símbolo. Los objetos creados a partir de constructores integrados como `Array` y `Object` han heredado propiedades no enumerables de `Object.prototype` y `String.prototype`, como el método {{JSxRef("String.indexOf", "indexOf()")}} de {{JSxRef("String")}} o el método {{JSxRef("Object.toString", "toString()")}} de {{JSxRef("Object")}}. El bucle iterará sobre todas las propiedades enumerables del objeto en sí y aquellas que el objeto hereda de su cadena de prototipos (las propiedades de los prototipos más cercanos tienen prioridad sobre las de los prototipos más alejados del objeto en su cadena de prototipos).
+
+### Propiedades `deleted`, `added` o `modified`
+
+Un bucle `for...in` itera sobre las propiedades de un objeto en un orden arbitrario (consulta el operador {{JSxRef("Operadores/delete", "delete")}} para obtener más información sobre por qué no puede depender del aparente orden de la iteración, al menos en una configuración entre navegadores).
+
+Si una propiedad se modifica en una iteración y luego se visita en un momento posterior, su valor en el bucle es su valor en ese momento posterior. Una propiedad que se elimina antes de haber sido visitada no se visitará más tarde. Las propiedades agregadas al objeto sobre el que se está produciendo la iteración se pueden visitar u omitir de la iteración.
+
+En general, es mejor no agregar, modificar o eliminar propiedades del objeto durante la iteración, aparte de la propiedad que se está visitando actualmente. No hay garantía de si se visitará una propiedad agregada, si se visitará una propiedad modificada (distinta de la actual) antes o después de que se modifique, o si se visitará una propiedad eliminada antes de eliminarla.
+
+### Iteración en arreglos y `for`...`in`
+
+> **Nota:** `for...in` no se debe usar para iterar sobre un {{JSxRef("Array")}} donde el orden del índice es importante.
+
+Los índices del arreglo son solo propiedades enumerables con nombres enteros y, por lo demás, son idénticos a las propiedades generales del objeto. No hay garantía de que `for...in` devuelva los índices en un orden en particular. La instrucción de bucle `for...in` devolverá todas las propiedades enumerables, incluidas aquellas con nombres no enteros y aquellas que se heredan.
+
+Debido a que el orden de iteración depende de la implementación, es posible que la iteración sobre un arreglo no visite los elementos en un orden coherente. Por lo tanto, es mejor usar un bucle {{JSxRef("Sentencias/for", "for")}} con un índice numérico (o {{JSxRef("Array.prototype.forEach()")}} o el bucle {{JSxRef("Sentencias/for...of", "for...of")}}) cuando se itera sobre arreglos donde el orden de acceso es importante.
+
+### Iterar solo sobre propiedades directas
+
+Si solo deseas considerar las propiedades adjuntas al objeto en sí mismo, y no sus prototipos, usa {{JSxRef("Object.getOwnPropertyNames", "getOwnPropertyNames()")}} o realiza una {{JSxRef("Object.prototype.hasOwnProperty", "hasOwnProperty()")}} verificación ({{jsxref("Object.prototype.propertyIsEnumerable", "propertyIsEnumerable()")}} también se puede utilizar). Alternativamente, si sabes que no habrá ninguna interferencia de código externo, puedes extender los prototipos incorporados con un método de verificación.
+
+## ¿Por qué usar `for`...`in`?
+
+Dado que `for...in` está construido para iterar propiedades de objeto, no se recomienda su uso con arreglos y opciones como `Array.prototype.forEach()` y existe `for...of`, ¿cuál podría ser el uso de `for...in`?
+
+Es posible que se utilice de forma más práctica con fines de depuración, ya que es una forma fácil de comprobar las propiedades de un objeto (mediante la salida a la consola o de otro modo). Aunque los arreglos suelen ser más prácticos para almacenar datos, en situaciones en las que se prefiere un par clave-valor para trabajar con datos (con propiedades que actúan como la "clave"), puede haber casos en los que desees comprobar si alguna de esas claves cumple un valor particular.
+
+## Ejemplos
+
+### Utilizar `for`...`in`
+
+El siguiente bucle `for...in` itera sobre todas las propiedades enumerables que no son símbolos del objeto y registra una cadena de los nombres de propiedad y sus valores.
+
+```js
+var obj = {a: 1, b: 2, c: 3};
+
+for (const prop in obj) {
+ console.log(`obj.${prop} = ${obj[prop]}`);
+}
+
+// Produce:
+// "obj.a = 1"
+// "obj.b = 2"
+// "obj.c = 3"
+```
+
+### Iterar propiedades directas
+
+La siguiente función ilustra el uso de {{JSxRef("Object.prototype.hasOwnProperty", "hasOwnProperty()")}} — las propiedades heredadas no se muestran.
+
+```js
+var triangle = {a: 1, b: 2, c: 3};
+
+function ColoredTriangle() {
+ this.color = 'red';
+}
+
+ColoredTriangle.prototype = triangle;
+
+var obj = new ColoredTriangle();
+
+for (const prop in obj) {
+ if (obj.hasOwnProperty(prop)) {
+ console.log(`obj.${prop} = ${obj[prop]}`);
+ }
+}
+
+// Produce:
+// "obj.color = red"
+```
+
+## Especificaciones
+
+| Especificación |
+| ---------------------------------------------------------------------------------------------------------------- |
+| {{SpecName('ESDraft', '#sec-for-in-and-for-of-statements', 'declaración for...in')}} |
+
+## Compatibilidad del navegador
+
+{{Compat("javascript.statements.for_in")}}
+
+### Compatibilidad: expresiones iniciadoras en modo estricto
+
+Antes de Firefox 40, era posible utilizar una expresión iniciadora (`i=0`) en un bucle `for...in`:
+
+```js example-bad
+var obj = {a: 1, b: 2, c: 3};
+for (var i = 0 in obj) {
+ console.log(obj[i]);
+}
+// 1
+// 2
+// 3
+```
+
+Este comportamiento no estándar ahora se ignora en la versión 40 y posteriores, y presentará un {{JSxRef("SyntaxError")}} ("{{JSxRef("errors/Invalid_for-in_initializer", "iniciador for...in no válido", "las declaraciones de encabezado del bucle for-in posiblemente no tengan iniciadores")}} en {{JSxRef("Strict_mode", "modo estricto")}} ({{bug(748550)}} y {{bug(1164741)}}").
+
+Otros motores como v8 (Chrome), Chakra (IE/Edge) y JSC (WebKit/Safari) están investigando si eliminar también el comportamiento no estándar.
+
+## Ve también
+
+- {{JSxRef("Sentencias/for...of", "for...of")}} — una declaración similar que itera sobre la propiedad `values`
+- {{JSxRef("Sentencias/for_each...in", "for each...in")}} — una declaración similar pero obsoleta que itera sobre los valores de las propiedades de un objeto, en lugar de los nombres de las propiedades en sí
+- {{JSxRef("Sentencias/for", "for")}}
+- {{JSxRef("../Guide/Iterators_and_Generators", "Expresiones generadoras")}} (usa la sintaxis `for...in`)
+- {{JSxRef("../Enumerability_and_ownership_of_properties", "Enumerabilidad y posesión de propiedades")}}
+- {{JSxRef("Object.getOwnPropertyNames()")}}
+- {{JSxRef("Object.prototype.hasOwnProperty()")}}
+- {{JSxRef("Array.prototype.forEach()")}}
diff --git a/files/es/web/javascript/reference/statements/for...of/index.md b/files/es/web/javascript/reference/statements/for...of/index.md
index 7430830675b290..82f3a7ff523e37 100644
--- a/files/es/web/javascript/reference/statements/for...of/index.md
+++ b/files/es/web/javascript/reference/statements/for...of/index.md
@@ -11,7 +11,7 @@ original_slug: Web/JavaScript/Referencia/Sentencias/for...of
---
{{jsSidebar("Statements")}}
-La sentencia **sentencia `for...of`** ejecuta un bloque de código para cada elemento de un [objeto iterable](/es/docs/Web/JavaScript/Guide/iterable), como lo son: {{jsxref("String")}}, {{jsxref("Array")}}, objetos similares a array (por ejemplo, {{jsxref("Functions/arguments", "arguments")}} or [`NodeList`](/es/docs/Web/API/NodeList "NodeList objects are collections of nodes, usually returned by properties such as Node.childNodes and methods such as document.querySelectorAll().")), {{jsxref("TypedArray")}}, {{jsxref("Map")}}, {{jsxref("Set")}} e iterables definidos por el usuario.
+La sentencia **sentencia `for...of`** ejecuta un bloque de código para cada elemento de un [objeto iterable](/es/docs/Web/JavaScript/Guide/iterable), como lo son: {{jsxref("String")}}, {{jsxref("Array")}}, objetos similares a array (por ejemplo, {{jsxref("Functions/arguments", "arguments")}} or [`NodeList`](/es/docs/Web/API/NodeList)), {{jsxref("TypedArray")}}, {{jsxref("Map")}}, {{jsxref("Set")}} e iterables definidos por el usuario.
## Sintaxis
diff --git a/files/es/web/javascript/reference/statements/import/index.html b/files/es/web/javascript/reference/statements/import/index.html
deleted file mode 100644
index 4901ef2dc6a183..00000000000000
--- a/files/es/web/javascript/reference/statements/import/index.html
+++ /dev/null
@@ -1,178 +0,0 @@
----
-title: import
-slug: Web/JavaScript/Reference/Statements/import
-tags:
- - ECMAScript 2015
- - JavaScript
- - Módulos
- - Sentencia
- - import
-translation_of: Web/JavaScript/Reference/Statements/import
-original_slug: Web/JavaScript/Referencia/Sentencias/import
----
-{{jsSidebar("Sentencias")}}
-
-La sentencia import
se usa para importar funciones que han sido exportadas desde un módulo externo.
-
-
-
-Sintaxis
-
-import defaultExport from "module-name ";
-import * as name from "module-name ";
-import { export } from "module-name ";
-import { export as alias } from "module-name ";
-import { export1 , export2 } from "module-name ";
-import { export1 , export2 as alias2 , [...] } from "module-name ";
-import defaultExport , { export [ , [...] ] } from "module-name ";
-import defaultExport , * as name from "module-name ";
-import "module-name ";
-
-
- defaultExport
- Nombre que se referirá al export por defecto del módulo.
- module-name
- El módulo desde el que importar. Normalmente es una ruta relativa o absoluta al archivo .js
que contiene el módulo, excluyendo la extensión .js
. Algunos empaquetadores pueden permitir o requerir el uso de la extensión; comprueba tu entorno. Sólo se permiten Strings con comillas simples o dobles.
- name
- Nombre del objeto del módulo que se utilizará como nombre de dominio al hacer referencia a los imports.
- export, exportN
-
-
-
- Nombre de los exports a ser importados.
- alias, aliasN
- Nombre del objeto que recibirá la propiedad importada.
-
-
-Descripción
-
-El parámetro name
es el nombre del objeto que recibirá los miembros exportados. El parámetro member
especifica miembros individuales, mientras el parámetro name
importa todos ellos. name puede también ser una función si el módulo exporta un sólo parámetro por defecto en lugar de una serie de miembros. Abajo hay ejemplos que explican la sintaxis.
-
-Importa el contenido de todo un módulo.
-
-Esto inserta myModule
en el ámbito actual, que contiene todos los elementos exportados en el archivo ubicado en /modules/my-module.js
.
-
-import * as myModule from '/modules/my-module.js';
-
-Aquí, para acceder a los miembros exportados habrá que usar el alias del módulo ("myModule" en este caso) como namespace. Por ejemplo, si el módulo importado arriba incluye un miembre exportado llamado doAllTheAmazingThings()
, habría que invocarlo de la siguiente manera:
-
-myModule.doAllTheAmazingThings();
-
-Importa un solo miembro de un módulo.
-
-Dado un objeto o valor llamado myExport
que ha sido exportado del módulo my-module
ya sea implícitamente (porque todo el módulo ha sido exportado) o explícitamente (usando la sentencia {{jsxref("Sentencias/export", "export")}} ), esto inserta myExport
en el ámbito actual.
-
-import {myExport} from '/modules/my-module.js';
-
-Importa multiples miembros de un módulo.
-
-Esto inserta foo
y bar
en el ámbito actual.
-
-import {foo, bar} from "my-module.js";
-
-Importa un miembre con un alias mas conveniente
-
-Se puede renombrar un miembro exportado cuando se importa. Por ejemplo, esto inserta shortName
en el ámbito actual.
-
-import {reallyReallyLongModuleExportName as shortName}
- from '/modules/my-module.js';
-
-Renombra multiples miembros durante la importación
-
-Importa múltiples miembros exportados de un módulo con un alias conveniente.
-
-import {
- reallyReallyLongModuleExportName as shortName,
- anotherLongModuleName as short
-} from '/modules/my-module.js';
-
-Importa un módulo entero para efectos secundarios sólamente
-
-Importa un módulo entero para efectos secundarios sólamente, sin importar ningun elemento. Esto ejecuta el código global del módulo, pero no importa ningún valor.
-
-import '/modules/my-module.js';
-
-Importación de elementos por defecto
-
-Es posible tener una exportación por defecto (tanto si se trata de un objeto, función, clase, etc.). Recíprocamente, es posible usa la instrucción import
para importar esos elementos establecidos como por defecto.
-
-La versión más sencilla de importar un elemento por defecto es:
-
-import myDefault from '/modules/my-module.js';
-
-También es posible usar la sintaxis por defecto con lo que hemos visto anteriormente (importación de espacios de nombres o importaciones con nombre. En esos casos, la importación por defecto se deberá realizar en primer lugar. Por ejemplo:
-
-import myDefault, * as myModule from '/modules/my-module.js';
-// myModule used as a namespace
-
-o
-
-import myDefault, {foo, bar} from '/modules/my-module.js';
-// specific, named imports
-
-Ejemplos
-
-Importar un archivo secundario para asistir en un procesamiento de una petición JSON AJAX.
-
-El módulo: file.js
-
-function getJSON(url, callback) {
- let xhr = new XMLHttpRequest();
- xhr.onload = function () {
- callback(this.responseText)
- };
- xhr.open('GET', url, true);
- xhr.send();
-}
-
-export function getUsefulContents(url, callback) {
- getJSON(url, data => callback(JSON.parse(data)));
-}
-
-El programa principal: main.js
-
-import { getUsefulContents } from '/modules/file.js';
-
-getUsefulContents('http://www.example.com',
- data => { doSomethingUseful(data); });
-
-Especificaciones
-
-
-
-
- Especificación
- Estado
- Comentario
-
-
- {{SpecName('ES6', '#sec-imports', 'Imports')}}
- {{Spec2('ES6')}}
- Definición inical
-
-
- {{SpecName('ESDraft', '#sec-imports', 'Imports')}}
- {{Spec2('ESDraft')}}
-
-
-
-
-
-Compatibilidad entre navegadores
-
-
-
-{{Compat("javascript.statements.import")}}
-
-Ver también
-
-
diff --git a/files/es/web/javascript/reference/statements/import/index.md b/files/es/web/javascript/reference/statements/import/index.md
new file mode 100644
index 00000000000000..73edb46eebc5e2
--- /dev/null
+++ b/files/es/web/javascript/reference/statements/import/index.md
@@ -0,0 +1,178 @@
+---
+title: import
+slug: Web/JavaScript/Reference/Statements/import
+tags:
+ - ECMAScript 2015
+ - JavaScript
+ - Módulos
+ - Sentencia
+ - import
+translation_of: Web/JavaScript/Reference/Statements/import
+original_slug: Web/JavaScript/Referencia/Sentencias/import
+---
+{{jsSidebar("Sentencias")}}
+
+La sentencia **`import`** se usa para importar funciones que han sido exportadas desde un módulo externo.
+
+> **Nota:** Por el momento, esta característica sólo está [comenzando a ser implementada](https://jakearchibald.com/2017/es-modules-in-browsers/) de forma nativa en los navegadores. Está implementada en muchos transpiladores, tales como Typescript y [Babel](http://babeljs.io/), y en empaquetadores como [Rollup](https://github.com/rollup/rollup) y [Webpack](https://webpack.js.org/).
+
+## Sintaxis
+
+```
+import defaultExport from "module-name";
+import * as name from "module-name";
+import { export } from "module-name";
+import { export as alias } from "module-name";
+import { export1 , export2 } from "module-name";
+import { export1 , export2 as alias2 , [...] } from "module-name";
+import defaultExport, { export [ , [...] ] } from "module-name";
+import defaultExport, * as name from "module-name";
+import "module-name";
+```
+
+- `defaultExport`
+ - : Nombre que se referirá al export por defecto del módulo.
+- `module-name`
+ - : El módulo desde el que importar. Normalmente es una ruta relativa o absoluta al archivo **`.js`** que contiene el módulo, excluyendo la extensión **`.js`**. Algunos empaquetadores pueden permitir o requerir el uso de la extensión; comprueba tu entorno. Sólo se permiten Strings con comillas simples o dobles.
+- `name`
+ - : Nombre del objeto del módulo que se utilizará como nombre de dominio al hacer referencia a los imports.
+- export, exportN
+ - : Nombre de los exports a ser importados.
+- `alias, aliasN`
+ - : Nombre del objeto que recibirá la propiedad importada.
+
+## Descripción
+
+El parámetro `name` es el nombre del objeto que recibirá los miembros exportados. El parámetro `member` especifica miembros individuales, mientras el parámetro `name` importa todos ellos. name puede también ser una función si el módulo exporta un sólo parámetro por defecto en lugar de una serie de miembros. Abajo hay ejemplos que explican la sintaxis.
+
+### Importa el contenido de todo un módulo.
+
+Esto inserta `myModule` en el ámbito actual, que contiene todos los elementos exportados en el archivo ubicado en `/modules/my-module.js`.
+
+```js
+import * as myModule from '/modules/my-module.js';
+```
+
+Aquí, para acceder a los miembros exportados habrá que usar el alias del módulo ("myModule" en este caso) como namespace. Por ejemplo, si el módulo importado arriba incluye un miembre exportado llamado `doAllTheAmazingThings()`, habría que invocarlo de la siguiente manera:
+
+```js
+myModule.doAllTheAmazingThings();
+```
+
+### Importa un solo miembro de un módulo.
+
+Dado un objeto o valor llamado `myExport` que ha sido exportado del módulo `my-module` ya sea implícitamente (porque todo el módulo ha sido exportado) o explícitamente (usando la sentencia {{jsxref("Sentencias/export", "export")}} ), esto inserta `myExport` en el ámbito actual.
+
+```js
+import {myExport} from '/modules/my-module.js';
+```
+
+### Importa multiples miembros de un módulo.
+
+Esto inserta `foo` y `bar` en el ámbito actual.
+
+```js
+import {foo, bar} from "my-module.js";
+```
+
+### Importa un miembre con un alias mas conveniente
+
+Se puede renombrar un miembro exportado cuando se importa. Por ejemplo, esto inserta `shortName` en el ámbito actual.
+
+```js
+import {reallyReallyLongModuleExportName as shortName}
+ from '/modules/my-module.js';
+```
+
+### Renombra multiples miembros durante la importación
+
+Importa múltiples miembros exportados de un módulo con un alias conveniente.
+
+```js
+import {
+ reallyReallyLongModuleExportName as shortName,
+ anotherLongModuleName as short
+} from '/modules/my-module.js';
+```
+
+### Importa un módulo entero para efectos secundarios sólamente
+
+Importa un módulo entero para efectos secundarios sólamente, sin importar ningun elemento. Esto ejecuta el código global del módulo, pero no importa ningún valor.
+
+```js
+import '/modules/my-module.js';
+```
+
+### Importación de elementos por defecto
+
+Es posible tener una exportación por defecto (tanto si se trata de un objeto, función, clase, etc.). Recíprocamente, es posible usa la instrucción `import` para importar esos elementos establecidos como por defecto.
+
+La versión más sencilla de importar un elemento por defecto es:
+
+```js
+import myDefault from '/modules/my-module.js';
+```
+
+También es posible usar la sintaxis por defecto con lo que hemos visto anteriormente (importación de espacios de nombres o importaciones con nombre. En esos casos, la importación por defecto se deberá realizar en primer lugar. Por ejemplo:
+
+```js
+import myDefault, * as myModule from '/modules/my-module.js';
+// myModule used as a namespace
+```
+
+o
+
+```js
+import myDefault, {foo, bar} from '/modules/my-module.js';
+// specific, named imports
+```
+
+## Ejemplos
+
+Importar un archivo secundario para asistir en un procesamiento de una petición JSON AJAX.
+
+### El módulo: file.js
+
+```js
+function getJSON(url, callback) {
+ let xhr = new XMLHttpRequest();
+ xhr.onload = function () {
+ callback(this.responseText)
+ };
+ xhr.open('GET', url, true);
+ xhr.send();
+}
+
+export function getUsefulContents(url, callback) {
+ getJSON(url, data => callback(JSON.parse(data)));
+}
+```
+
+### El programa principal: main.js
+
+```js
+import { getUsefulContents } from '/modules/file.js';
+
+getUsefulContents('http://www.example.com',
+ data => { doSomethingUseful(data); });
+```
+
+## Especificaciones
+
+| Especificación | Estado | Comentario |
+| -------------------------------------------------------------------- | ---------------------------- | ----------------- |
+| {{SpecName('ES6', '#sec-imports', 'Imports')}} | {{Spec2('ES6')}} | Definición inical |
+| {{SpecName('ESDraft', '#sec-imports', 'Imports')}} | {{Spec2('ESDraft')}} | |
+
+## Compatibilidad entre navegadores
+
+The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out and send us a pull request.
+
+{{Compat("javascript.statements.import")}}
+
+## Ver también
+
+- {{jsxref("Sentencias/export", "export")}}
+- [Previewing ES6 Modules and more from ES2015, ES2016 and beyond](https://blogs.windows.com/msedgedev/2016/05/17/es6-modules-and-beyond/)
+- [ES6 in Depth: Modules](https://hacks.mozilla.org/2015/08/es6-in-depth-modules/), Hacks blog post by Jason Orendorff
+- [Axel Rauschmayer's book: "Exploring JS: Modules"](http://exploringjs.com/es6/ch_modules.html)
diff --git a/files/es/web/javascript/reference/statements/let/index.html b/files/es/web/javascript/reference/statements/let/index.html
deleted file mode 100644
index 40dd0322a00c9f..00000000000000
--- a/files/es/web/javascript/reference/statements/let/index.html
+++ /dev/null
@@ -1,272 +0,0 @@
----
-title: let
-slug: Web/JavaScript/Reference/Statements/let
-tags:
- - Característica del lenguaje
- - Declaración de variable
- - ECMAScript 2015
- - JavaScript
- - Variables
- - let
- - sentencias
-translation_of: Web/JavaScript/Reference/Statements/let
-original_slug: Web/JavaScript/Referencia/Sentencias/let
-browser-compat: javascript.statements.let
----
-{{jsSidebar("Statements")}}
-
-La instrucción let
declara una variable de alcance local con ámbito de bloque( block scope) , la cual, opcionalmente, puede ser inicializada con algún valor.
-
-
-
La palabra reservada let
en Mozilla Firefox 44 y anteriores, está solo disponible para bloques de código en HTML que esten envueltos en una etiqueta <script type="application/javascript;version=1.7">
(o de una version mayor). Las etiquetas XUL tienen acceso a esas características sin necesidad de dicho bloque. Es necesario tomar en cuenta que esta es una característica no estándar que ya se ha hecho actualmente estándar , esto pero puede crear conflictos con otros navegadores, ya que fue una característica no estándar.
-
-
-Sintaxis
-
-let var1 [= valor1] [, var2 [= valor2]] [, ..., varN [= valorN]];
-
-Parámetros
-
-
- var1
, var2
, …, varN
- Los nombres de la variable o las variables a declarar. Cada una de ellas debe ser un identificador legal de JavaScript
- value1
, value2
, …, valueN
- Por cada una de las variables declaradas puedes, opcionalmente, especificar su valor inicial como una expresión legal JavaScript.
-
-
-Descripción
-
-let
te permite declarar variables limitando su alcance (scope ) al bloque, declaración, o expresión donde se está usando.a diferencia de la palabra clave var
la cual define una variable global o local en una función sin importar el ámbito del bloque. La otra diferencia entre var
y let
es que este último se inicializa a un valor sólo cuando un analizador lo evalúa (ver abajo).
-
-Al igual que const
, let
no crea propiedades del objeto se declara globalmente (en el alcance más alto).
-
-Alcance (scope ) a nivel de bloque con let
-
-Usar la palabra reservada let
para definir variables dentro de un bloque.
-
-if (x > y) {
- let gamma = 12.7 + y;
- i = gamma * x;
-}
-
-
-Es posible usar definiciones let
para asociar código en extensiones con un pseudo-espacio-de-nombre (pseudo-namespace). (Ver Mejores prácticas de seguridad en extensiones .)
-
-let Cc = Components.classes, Ci = Components.interfaces;
-
-
-let
puede ser útil para escribir código más limpio cuando usamos funciones internas.
-
-var list = document.getElementById("list");
-
-for (var i = 1; i <= 5; i++) {
- var item = document.createElement("LI");
- item.appendChild(document.createTextNode("Item " + i));
-
- let j = i;
- item.onclick = function (ev) {
- console.log("Item " + j + " is clicked.");
- };
- list.appendChild(item);
-}
-
-
-El ejemplo anterior trabaja como se espera porque las cinco instancias de la función (anónima) interna hacen referencia a cinco diferentes instancias de la variable j
. Nótese que esto no funcionaría como se espera si reemplazamos let
con var
o si removemos la variable j
y simplemente usamos la variable i
dentro de la función interna.
-
-Reglas de alcance
-
-Variables declaradas por let
tienen por alcance el bloque en el que se han definido, así mismo, como en cualquier bloque interno. De esta manera, let
trabaja muy parecido a var
. La más notable diferencia es que el alcance de una variable var
es la función contenedora:
-
-function varTest() {
- var x = 31;
- if (true) {
- var x = 71; // ¡misma variable!
- console.log(x); // 71
- }
- console.log(x); // 71
-}
-
-function letTest() {
- let x = 31;
- if (true) {
- let x = 71; // variable diferente
- console.log(x); // 71
- }
- console.log(x); // 31
-}
-// llamamos a las funciones
-varTest();
-letTest();
-
-
-En el nivel superior de un programa y funciones, let
, a diferencia de var
, no crea una propiedad en el objeto global, por ejemplo:
-
-var x = 'global';
-let y = 'global';
-console.log(this.x); // "global"
-console.log(this.y); // undefined
-
-
-La salida de este código desplegaría "global" una vez.
-
-Zona muerta temporal y errores con let
-
-La redeclaración de la misma variable bajo un mismo ámbito léxico terminaría en un error de tipo SyntaxError
. Esto también es extensible si usamos var
dentro del ámbito léxico . Esto nos salvaguarda de redeclarar una variable accidentalmente y que no era posible solo con var.
-
-if (x) {
- let foo;
- let foo; // Terminamos con un SyntaxError.
-}
-if (x) {
- let foo;
- var foo; // Terminamos con un SyntaxError.
-}
-
-
-En ECMAScript 2015, let
no eleva la variable a la parte superior del bloque. Si se hace una referencia a la variable declarada con let
(let foo
) antes de su declaración, terminaríamos con un error de tipo ReferenceError
(al contrario de la variable declarada con var
, que tendrá el valor undefined
), esto porque la variables vive en una "zona muerta temporal" desde el inicio del bloque hasta que la declaración ha sido procesada.
-
-function do_something() {
- console.log(bar); // undefined
- console.log(foo); // ReferenceError: foo
no está definido
- var bar = 1;
- let foo = 2;
-}
-
-Es posible encontrar errores en bloques de control switch
debido a que solamente existe un block subyacente.
-
-switch (x) {
- case 0:
- let foo;
- break;
-
- case 1:
- let foo; // Terminamos con un error de tipo SyntaxError.
- // esto debido a la redeclaracion
- break;
-}
-
-Otro ejemplo de zona muerta temporal combinada con ámbito léxico
-
-Debido al alcance léxico, el identificador num
dentro de la expresión (num + 55
) se evalúa como num
del bloque if
, y no como la variable num
con el valor 33 que esta por encima
-
-En esa misma línea, el num
del bloque if
ya se ha creado en el ámbito léxico, pero aún no ha alcanzado (y terminado ) su inicialización (que es parte de la propia declaración): todavía está en la zona muerta temporal.
-
-function prueba(){
- var num = 33;
- if (true) {
- let num = (num + 55);
//ReferenceError: no se puede acceder a la declaración léxica `num'antes de la inicialización
- }
-}
-prueba();
-
-
-Ejemplos
-
-let
vs var
-
-Cuando usamos let
dentro de un bloque, podemos limitar el alcance de la variable a dicho bloque. Notemos la diferencia con var
, cuyo alcance reside dentro de la función donde ha sido declarada la variable.
-
-var a = 5;
-var b = 10;
-
-if (a === 5) {
- let a = 4; // El alcance es dentro del bloque if
- var b = 1; // El alcance es global
-
- console.log(a); // 4
- console.log(b); // 1
-}
-
-console.log(a); // 5
-console.log(b); // 1
-
-let
en bucles
-
-Es posible usar la palabra reservada let
para enlazar variables con alcance local dentro del alcance de un bucle en lugar de usar una variable global (definida usando var
) para dicho propósito.
-
-for (let i = 0; i<10; i++) {
- console.log(i); // 0, 1, 2, 3, 4 ... 9
-}
-
-console.log(i); // ReferenceError: i is not defined
-
-
-Extensiones let
no-estandar
-
-Bloques let
-
-
-
La sintaxis del bloque y expresion let
es no-estandar y sera deshechado en un futuro. ¡No deben ser usados! ver error 1023609 y error 1167029 para mas detalles.
-
-
-Un bloque let
provee una manera de asociar valores con variables dentro del alcance de un bloque sin afectar el valor de variables con nombre similar fuera del bloque.
-
-Sintaxis
-
-let (var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]]) {declaración};
-
-Descripción
-
-El bloque let
provee alcance local para las variables. Funciona enlazando cero o más variables en el alcance léxico de un solo bloque de código; de otra manera, es exactamente lo mismo que una declaración de bloque. Hay que notar particularmente que el alcance de una variable declarada dentro de un bloque let
usando var es equivalente a declarar esa variable fuera del bloque let
; dicha variable aún tiene alcance dentro de la función. Al usar la sintaxis de bloque let
, los paréntesis siguientes a let
son requeridos. Una falla al incluir dichos paréntesis resultará en un error de sintaxis.
-
-Ejemplo
-
-var x = 5;
-var y = 0;
-
-let (x = x+10, y = 12) {
- console.log(x+y); // 27
-}
-
-console.log(x + y); // 5
-
-
-Las reglas para el bloque de código son las mismas que para cualquier otro bloque de código en JavaScript. Es posible tener sus propias variables locales usando declaraciones let
en dicho bloque.
-
-Reglas de alcance
-
-El alcance de las variables definidas usando let
es el mismo bloque let
, así como cualquier bloque interno contenido dentro de el bloque, a menos que esos bloques internos definan variables con el mismo nombre.
-
-expresiones let
-
-
-
Soporte de expresiones let
ha sido removido en Gecko 41 ({{bug(1023609)}}).
-
-
-Una expresion let
permite establecer variables con alcance dentro de una expresión.
-
-Sintaxis
-
-let (var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]]) expression;
-
-Ejemplo
-
-Podemos usar let
para establecer variables que tienen como alcance solo una expresión:
-
-var a = 5;
-let(a = 6) console.log(a); // 6
-console.log(a); // 5
-
-Reglas de alcance
-
-Dada la expresión let
siguiente:
-
-let (decls ) expr
-
-
-Existe un bloque implícito creado alrededor de expr.
-
-Especificaciones
-
-{{Specification}}
-
-Compatibilidad en navegadores
-
-{{Compat}}
-
-Ver también
-
-
diff --git a/files/es/web/javascript/reference/statements/let/index.md b/files/es/web/javascript/reference/statements/let/index.md
new file mode 100644
index 00000000000000..20cecdd0e4285b
--- /dev/null
+++ b/files/es/web/javascript/reference/statements/let/index.md
@@ -0,0 +1,286 @@
+---
+title: let
+slug: Web/JavaScript/Reference/Statements/let
+tags:
+ - Característica del lenguaje
+ - Declaración de variable
+ - ECMAScript 2015
+ - JavaScript
+ - Variables
+ - let
+ - sentencias
+translation_of: Web/JavaScript/Reference/Statements/let
+original_slug: Web/JavaScript/Referencia/Sentencias/let
+browser-compat: javascript.statements.let
+---
+{{jsSidebar("Statements")}}
+
+La instrucción **`let`** declara una variable de alcance local con ámbito de bloque([block](/es/docs/Web/JavaScript/Referencia/Sentencias/block)scope), la cual, opcionalmente, puede ser inicializada con algún valor.
+
+> **Advertencia:** La palabra reservada **`let`** en Mozilla Firefox 44 y anteriores, está solo disponible para bloques de código en HTML que esten envueltos en una etiqueta `