Bucles y arrays en JavaScript

Aprende a hacer que JavaScript repita tareas y maneje listas de datos. Escribe bucles for, while y do...while que se ejecuten el número correcto de veces, almacena valores en arrays y añade, elimina, busca y modifica sus elementos. Procesa listas con for...of y con métodos de arrays como map, filter, find y reduce, ordena números y texto como esperan los lectores, y copia y combina arrays con la sintaxis de propagación sin modificar los originales por accidente.

PrincipianteUnidad 2 de 9 del curso Curso de Programación en JavaScript

Lo que aprenderás

  1. Escribe bucles for, while y do...while que se ejecuten el número correcto de veces, sigue su ejecución paso a paso y contrólalos con break y continue.
    • Cuenta y repite con un bucle for
      Escribe un bucle for a partir de sus tres partes, sigue su contador desde la primera hasta la última iteración y calcula una suma acumulada.
    • Repite mientras se cumpla una condición
      Usa bucles while y do...while cuando no se conozca de antemano el número de repeticiones y asegúrate de que todos los bucles puedan terminar.
    • Interrumpe bucles, omite iteraciones y anida bucles
      Sal de un bucle antes de tiempo con break, omite una iteración con continue y coloca un bucle dentro de otro para recorrer cuadrículas y pares.
  2. Crea arrays, lee y modifica sus elementos por índice, añade y elimina elementos, y busca en arrays o convierte entre arrays y texto.
    • Crea un array y lee sus elementos
      Escribe literales de array, lee elementos por su índice que empieza en cero y usa length y at() para acceder al último elemento.
    • Añade, elimina y sustituye elementos
      Modifica arrays in situ mediante la asignación por índice, push, pop, shift, unshift y splice, copia partes con slice y distingue los métodos que modifican un array de los que devuelven uno nuevo.
    • Busca en un array y convierte entre arrays y texto
      Comprueba si un array contiene un valor, encuentra la posición de un valor, compara arrays correctamente y convierte cadenas en arrays y viceversa con split y join.
  3. Visita cada elemento de un array con bucles for y for...of y usa patrones de bucle habituales para sumar, contar, buscar y construir resultados.
    • Recorre un array con for y for...of
      Elige entre un bucle for basado en índices y for...of, obtén el índice cuando lo necesites y evita for...in y cambiar la longitud de un array mientras lo recorres.
    • Suma, cuenta, busca y construye resultados con patrones de bucles
      Aplica los patrones de acumulador, contador, máximo, búsqueda y construcción de un array nuevo a listas de datos reales y sigue su ejecución paso a paso.
  4. Pasa funciones flecha breves a métodos de arrays y usa forEach, map, filter, find, some, every y reduce para transformar, seleccionar, buscar y resumir datos.
    • Pasa una función a un método de array
      Escribe funciones flecha breves, conoce qué recibe y qué debe devolver una función de devolución de llamada y usa forEach para ejecutar código para cada elemento.
    • Transforma y selecciona elementos con map y filter
      Usa map para convertir cada elemento en un valor nuevo y filter para conservar los elementos que cumplen una condición, y encadena ambos.
    • Busca elementos y comprueba condiciones
      Usa find, findIndex, findLast, findLastIndex, some y every para localizar un elemento o comprobar una condición en una lista.
    • Combina todos los elementos en un solo valor con reduce
      Usa reduce con un acumulador y un valor inicial para calcular sumas, conteos y valores extremos, y sigue cada paso.
  5. Ordena números y texto correctamente, incluido el orden alfabético del idioma del lector, y copia y combina arrays con la sintaxis de propagación sin modificar los originales por accidente.
    • Ordena e invierte arrays de números y cadenas de caracteres
      Usa sort con una función de comparación, ten en cuenta que sort modifica el array y usa toSorted y toReversed para obtener copias ordenadas o con el orden invertido.
    • Ordena y presenta texto para lectores de cualquier idioma
      Compara cadenas con localeCompare e Intl.Collator para obtener un orden alfabético natural, conserva las fechas en una forma que se pueda ordenar y convierte arrays en texto legible con join, Intl.ListFormat y formato de números.
    • Copia y combina arrays con la sintaxis de propagación
      Comprende que las variables de array hacen referencia a un array compartido y usa la sintaxis de propagación para copiar, combinar e insertar arrays y para pasar los elementos de un array a una función como valores separados.

Guía de estudio de Bucles y arrays en JavaScript

5 capítulos

1

Repite código con bucles

Repetir código requiere un punto de partida claro, una comprobación y una forma de avanzar. Los bucles de conteo hacen visible el número de pasos; los bucles basados en condiciones permiten que los datos decidan cuándo detenerse. Sigue cada variable que cambia para ver qué se ejecuta antes y después de una comprobación, y luego usa salidas anticipadas y bucles anidados para manejar búsquedas, valores omitidos y pares. Pequeños cambios en un extremo o en una actualización pueden cambiar todo el resultado.

1.1 Controla un bucle de conteo

Un bucle repite un bloque de código. Cada ejecución de su cuerpo es una iteración. Puedes cambiar cuántas veces se repite el trabajo modificando el contador y la condición del bucle, sin copiar el cuerpo.

Lee las tres partes
for (let i = 1; i <= 5; i++) {
  console.log(i);
}

Los paréntesis contienen una inicialización, una condición y una actualización, separadas por puntos y comas. let i = 1 se ejecuta una vez. Después JavaScript comprueba i <= 5. Si es verdadero, el cuerpo muestra i, la actualización i++ suma 1 y JavaScript comprueba la condición de nuevo. Una condición falsa termina el bucle antes de otra ejecución del cuerpo.

Valor antes de la comprobaciónCondiciónAcción
1trueMostrar 1; actualizar a 2
2, 3, 4true cada vezMostrar cada valor y actualizar
5trueMostrar 5; actualizar a 6
6falseDetenerse

Hay cinco iteraciones, pero seis comprobaciones de la condición. La última comprobación, que falla, no ejecuta el cuerpo. Un bucle cuya condición es falsa al principio no tiene iteraciones.

Elige los extremos y el paso

for (let i = 0; i < 10; i++) visita desde 0 hasta 9. Empezar en 1 con i <= 10 visita desde 1 hasta 10. Ambos se ejecutan diez veces. Para un paso de 1 desde a hacia b, cuando b es al menos igual a a, < b da b - a iteraciones y <= b da b - a + 1.

La actualización puede dar pasos mayores: for (let i = 0; i <= 20; i += 5) visita 0, 5, 10, 15, 20. Contar hacia atrás requiere una actualización decreciente y una condición acorde: for (let i = 3; i >= 1; i--) visita 3, 2, 1. Anota el primer y el último valor previstos antes de elegir < o <=; esto permite detectar un error de desfase de una unidad.

Mantén una suma acumulada
let total = 0;
for (let i = 1; i <= 100; i++) {
  total += i;
}
console.log(total); // 5050

total es un acumulador: lleva el resultado de una iteración a la siguiente. Después de las tres primeras iteraciones contiene 1, luego 3 y después 6. Coloca su declaración antes del bucle para que se inicialice una vez. Declararlo dentro del cuerpo lo reiniciaría cada vez y haría que no estuviera disponible después del bucle.

Diagnostica un bucle que se comporta de forma extraña

El contador de la cabecera usa let porque i++ le reasigna un valor. Un contador const permite la primera ejecución del cuerpo, pero lanza un TypeError en la actualización. Un let i declarado en la cabecera pertenece al bucle; leerlo después produce un ReferenceError, salvo que exista otra variable llamada i fuera.

Un punto y coma inmediatamente después de la cabecera deja vacío el cuerpo del bucle. En for (let i = 0; i < 3; i++); { console.log("Hello"); }, el bloque se ejecuta una vez después del bucle. Mantén la llave de apertura junto a la cabecera. Por último, comprueba la dirección de la actualización: empezar en 0 con i < 5 e i-- aleja el contador del punto de parada y el bucle nunca termina.

Puntos clave

  • La inicialización se ejecuta una vez; la condición se comprueba antes de cada iteración; la actualización sigue al cuerpo.
  • Comprueba el primer y el último valor del contador para detectar un error de desfase de una unidad.
  • Declara una suma acumulada antes del bucle para conservar el trabajo anterior.
  • Usa let para un contador que cambia y acércalo al punto de parada.

1.2 Repite hasta que cambie una condición

Algunas tareas terminan cuando un resultado alcanza un objetivo, no después de un número conocido de pasos. Un bucle while comprueba esa condición de parada antes de cada repetición. Un bucle do...while la comprueba después del cuerpo.

Comprueba primero con while
let balance = 1000;
let years = 0;
while (balance < 1500) {
  balance = balance * 1.05;
  years++;
}
console.log(years); // 9

El saldo crece un 5 % al año. Ambas variables se inicializan antes del bucle. Después de ocho repeticiones el saldo es aproximadamente 1477.46, por debajo del objetivo, así que se necesita otra repetición. Después de nueve es aproximadamente 1551.33; la siguiente comprobación es falsa. Conserva el saldo completo durante el cálculo y redondea solo el resultado que se muestra.

Si una condición de while es falsa al principio, el cuerpo no se ejecuta ninguna vez. Para un bucle de conteo sencillo, coloca la inicialización antes de while y la actualización al final del cuerpo. Esto conserva el comportamiento de un bucle for cuando no hay continue. Con continue, la actualización requiere especial cuidado porque puede omitirse.

Ejecuta una vez antes de comprobar
let n = 4096;
let digits = 0;
do {
  n = Math.floor(n / 10);
  digits++;
} while (n > 0);
console.log(digits); // 4

Math.floor redondea hacia abajo. Aquí cada división elimina la última cifra: 4096 se convierte en 409, luego en 40, 4 y 0. Cada eliminación incrementa digits. Empezar con 0 también ejecuta el cuerpo una vez y cuenta correctamente su única cifra. Un while (n > 0) que comprueba antes omitiría ese caso e indicaría cero cifras. Este método de conteo de cifras sirve para números enteros no negativos.

BucleCuándo se comprueba la condiciónEjecuciones mínimas del cuerpo
whileAntes del cuerpoCero
do...whileDespués del cuerpoUna

Con let n = 10, un cuerpo do...while que muestra n se ejecuta una vez incluso si su condición es n < 5. La misma condición, comprobada antes, no muestra nada. El punto y coma va después de la condición final en do...while.

Avanza hacia una salida

Un bucle infinito sigue repitiéndose sin terminar. Olvidar n++ en let n = 0; while (n < 3) { console.log(n); } deja la condición verdadera indefinidamente. El código que se ejecuta durante mucho tiempo puede congelar una pestaña del navegador. Sigue qué modifica la condición y detén un script bloqueado con los controles del navegador.

Una condición compuesta como attempts < 3 && !found continúa solo mientras ambas comprobaciones son verdaderas. Se detiene cuando se han usado tres intentos o se encuentra un resultado. Para un entero no negativo que disminuye hacia cero, while (count > 0) expresa una cuenta atrás con más claridad que while (count). Los números negativos también son verdaderos en contexto booleano, así que ser verdadero en ese contexto por sí solo no significa que un contador sea positivo.

Evita la igualdad como comprobación de parada para decimales. Diez sumas de 0.1 dan 0.9999999999999999 en JavaScript, así que while (x !== 1) puede superar el extremo previsto y continuar indefinidamente. Una comparación como x < 1 permite cruzar el límite; un contador entero es mejor cuando se necesitan exactamente diez pasos. Calcula cada valor decimal a partir de ese contador.

Puntos clave

  • while puede ejecutarse cero veces; do...while siempre se ejecuta al menos una vez.
  • Elige una condición basada en lo que aún debe ocurrir y después modifica sus valores de entrada en el cuerpo.
  • Una condición compuesta puede detener el trabajo cuando se alcanza un límite o se encuentra un resultado.
  • El redondeo en coma flotante hace que la igualdad decimal exacta sea una mala comprobación de parada.
  • Usa contadores enteros cuando el número de repeticiones deba ser exacto.

1.3 Detén una búsqueda, omite trabajo y visita pares

Un bucle puede terminar antes de que su condición sea falsa u omitir trabajo para un solo elemento. Los bucles anidados permiten repetir una secuencia dentro de otra, como al visitar filas y columnas.

Interrumpe o continúa

break sale de su bucle inmediatamente. Para encontrar el primer múltiplo de 7 mayor que 50:

for (let n = 51; n <= 100; n++) {
  if (n % 7 === 0) {
    console.log(n); // 56
    break;
  }
}

Después de mostrar 56, la ejecución continúa después del bucle. Los valores desde 57 hasta 100 nunca se comprueban. while (true) puede usar el mismo patrón cuando la salida es más fácil de comprobar dentro del cuerpo; un break al que se pueda llegar debe proporcionar la salida.

continue omite el resto de la iteración actual. En un bucle for, sí ejecuta la actualización de la cabecera antes de comprobar la condición de nuevo:

for (let i = 1; i <= 9; i++) {
  if (i % 2 === 0) continue;
  console.log(i);
}

Los valores pares omiten la salida, así que el resultado es 1, 3, 5, 7, 9. Sustituir continue por break terminaría el bucle en 2 y solo se mostraría 1.

En un bucle while, continue salta directamente a la condición. Una actualización situada más adelante en el cuerpo se omite. Si i es 2 y el cuerpo empieza con if (i === 2) continue;, ese valor puede quedarse bloqueado indefinidamente. Coloca la actualización necesaria antes de ese salto o expresa el conteo con for.

Repite un bucle interior para cada fila
for (let row = 1; row <= 3; row++) {
  let line = "";
  for (let col = 1; col <= 4; col++) {
    line = line + (row * col) + " ";
  }
  console.log(line.trim());
}

Para row = 1, el bucle interior visita las columnas desde 1 hasta 4 y construye el texto «1 2 3 4». Vuelve a empezar en la columna 1 para la fila 2 y produce «2 4 6 8». La fila 3 produce «3 6 9 12». El cuerpo interior se ejecuta doce veces: cuatro columnas para cada una de las tres filas. Declara line dentro del cuerpo exterior para que cada fila empiece con una cadena vacía.

Usa nombres distintos para los contadores. Un let i interior oculta un i exterior, lo que dificulta leer ambas posiciones.

Visita cada par distinto una vez

Para cuatro personas numeradas desde 0 hasta 3, inicia el contador interior en i + 1:

for (let i = 0; i < 4; i++) {
  for (let j = i + 1; j < 4; j++) {
    console.log(i, j);
  }
}

Los pares son 0–1, 0–2, 0–3, 1–2, 1–3, 2–3: seis visitas. Empezar j en 0 produciría dieciséis visitas, incluidos pares de una persona consigo misma y duplicados en orden inverso.

Un break normal solo sale del bucle más interno. Para terminar una búsqueda anidada completa, coloca una etiqueta al bucle exterior, por ejemplo outer: for (...), y después usa break outer; cuando encuentres la coincidencia. La etiqueta nombra el bucle del que se debe salir; no cambia el orden en que se comprueban los pares.

Puntos clave

  • break termina un bucle; continue omite el resto de una iteración.
  • continue ejecuta la actualización de un for, pero puede omitir una actualización dentro del cuerpo de un while.
  • El bucle interior vuelve a empezar en cada iteración del bucle exterior.
  • Usa j = i + 1 para visitar cada par distinto una vez.
  • Un break normal sale del bucle más interno.
  • Un break con etiqueta también puede salir de un bucle exterior.
2

Almacena y modifica listas de datos en arrays

Una lista tiene valores y posiciones. Los arrays mantienen esos valores juntos y dan a cada uno un índice numerado. Leer, sustituir, insertar y eliminar elementos depende de esas posiciones, y las modificaciones pueden desplazar los elementos posteriores a nuevos índices. Aprende qué devuelve cada método y qué modifica, y después elige búsquedas y conversiones de texto que produzcan la forma de resultado que necesita el siguiente paso.

2.1 Lee valores y posiciones en un array

Un array almacena una lista ordenada bajo un solo nombre. Sus valores se llaman elementos. Un literal de array usa corchetes y comas: const temps = [18, 21, 19, 24];. El literal [] crea un array vacío.

Cuenta posiciones desde cero
const colors = ["red", "green", "blue"];
console.log(colors[0]); // "red"
console.log(colors[2]); // "blue"
console.log(colors.length); // 3

El índice de un elemento es su posición contando desde cero. El tercer elemento tiene el índice 2. length cuenta las posiciones indexadas, incluidas las vacías. Para este array sin huecos también es el número de elementos. El último índice es colors.length - 1, así que colors[colors.length - 1] lee «blue».

Leer colors[colors.length] pide el índice 3, una posición después del final, y da undefined. Un índice ausente no lanza un error solo por estar ausente. colors[5] también da undefined.

Lee desde el final

colors.at(-1) lee el último elemento y colors.at(-2) lee el anterior. Los índices no negativos funcionan como siempre: colors.at(0) lee «red». Un número negativo entre corchetes tiene un significado diferente: colors[-1] no cuenta desde el final y da undefined para este array.

ExpresiónResultado
colors[1]"green"
colors.at(-1)"blue"
colors[3]undefined
colors[-1]undefined
Lee una lista dentro de otra

Un elemento puede ser a su vez un array:

const grid = [[1, 2, 3], [4, 5, 6]];
console.log(grid[1]); // [4, 5, 6]
console.log(grid[1][0]); // 4

El primer índice selecciona una fila. El segundo selecciona un valor dentro de esa fila. grid.length es 2, mientras que grid[0].length es 3. Estas longitudes describen arrays distintos. Las filas de un array anidado pueden tener longitudes diferentes.

Los arrays pueden mezclar tipos, como en [42, "km", true]. Una lista con un solo tipo de datos, como temperaturas, es más fácil de procesar porque cada elemento se puede manejar de la misma forma.

Reconoce un array y evita sorpresas con las posiciones vacías

typeof [1, 2] devuelve «object», así que no es una comprobación específica de arrays. Usa Array.isArray(value): devuelve true para [1, 2] y false para «12».

new Array(3) crea tres posiciones vacías; no almacena el número 3 por sí solo. Usa [3] para un elemento o [0, 0, 0] para tres ceros explícitos. Una posición vacía se lee como undefined, pero es un hueco, no un valor almacenado explícitamente. Escribir literales de array deja claro el contenido previsto.

Lee cadenas sin intentar modificarlas in situ

Las cadenas también admiten índices, length y at(). "hello"[1] es «e» y "hello".at(-1) es «o». Las cadenas son inmutables: asignar un valor a la posición de un carácter no lo sustituye. En modo estricto, incluidos los módulos de JavaScript, esa asignación lanza un TypeError. Construye una cadena nueva cuando el texto deba cambiar.

Puntos clave

  • Los índices empiezan en 0; el último índice es length - 1.
  • at(-1) lee el último elemento; arr[-1] no.
  • Lee los arrays anidados un índice cada vez.
  • Usa Array.isArray para identificar arrays.
  • Los literales de array distinguen los valores almacenados de las posiciones vacías.

2.2 Modifica un array o copia una parte

Modificar un array existente se llama mutación. Algunos métodos mutan el array; otros devuelven uno nuevo. El valor de retorno de un método también puede ser una longitud o un elemento eliminado, así que comprueba tanto el array como el resultado de la llamada.

Sustituye elementos y modifica los extremos
const scores = [70, 80, 90];
scores[1] = 85;
console.log(scores); // [70, 85, 90]

const mantiene scores apuntando al mismo array. No congela el contenido de ese array. Asignar scores = [] lanzaría un TypeError, pero la asignación por índice está permitida.

MétodoCambioValor de retorno
push(...items)Añade al finalNueva longitud
pop()Elimina del finalElemento eliminado
unshift(...items)Añade al principioNueva longitud
shift()Elimina del principioElemento eliminado

Para const queue = ["Ana", "Ben"];, queue.push("Cleo") devuelve 3. El array pasa a ser ["Ana", "Ben", "Cleo"]. Después, queue.pop() devuelve «Cleo» y deja los dos primeros nombres. Almacenar una llamada a push guarda su longitud numérica, no el array actualizado. pop y shift devuelven undefined en un array vacío. Añadir o eliminar al principio también desplaza los demás índices, lo que puede suponer más trabajo en arrays largos.

Inserta y elimina en medio

splice(start, deleteCount, ...items) modifica el array y devuelve un array con los elementos eliminados:

const days = ["Mon", "Tue", "Thu", "Fri"];
const removed = days.splice(2, 0, "Wed");
// days: ["Mon", "Tue", "Wed", "Thu", "Fri"]
// removed: []
const nextRemoved = days.splice(1, 2);
// days: ["Mon", "Thu", "Fri"]
// nextRemoved: ["Tue", "Wed"]

La primera llamada empieza en el índice 2, elimina cero elementos e inserta «Wed» ahí. La segunda empieza en el índice 1 y elimina dos elementos. Su segundo argumento es una cantidad, no un índice final. Los elementos posteriores a una inserción o eliminación reciben nuevos índices.

Copia un intervalo con slice

slice(start, end) devuelve un array nuevo y excluye el índice final. Para const t = [10, 20, 30, 40, 50];, t.slice(1, 3) da [20, 30] y deja t sin cambios. t.slice(-2) copia los dos últimos elementos, [40, 50]. Sin argumentos, t.slice() copia todo el array. La letra adicional de splice señala una operación distinta: modifica el original; slice copia un intervalo.

Mantén la lista libre de huecos accidentales

Escribir más allá del final crea posiciones vacías. Después de const a = [1, 2]; a[4] = 5;, la longitud es 5 y los índices 2 y 3 son huecos. delete a[i] también deja un hueco y conserva la longitud. Usa push para añadir al final y splice(i, 1) para eliminar un elemento y cerrar el hueco.

Asignar un valor menor a length elimina elementos del final. a.length = 0 vacía el array. Los elementos eliminados no reaparecen si después se aumenta la longitud.

sort y reverse también mutan arrays. Entre los métodos que copian están slice, concat, map, filter, toSorted, toReversed, toSpliced y with. Cuando un método devuelve un array nuevo, guarda o usa ese resultado; el original sigue conteniendo sus valores anteriores.

Puntos clave

  • const impide la reasignación de la variable, pero permite la mutación del array.
  • push y unshift devuelven longitudes; pop y shift devuelven los elementos eliminados.
  • splice modifica in situ y devuelve los elementos eliminados.
  • slice copia un intervalo cuyo índice final queda excluido.
  • delete deja un hueco; splice(i, 1) lo cierra.
  • Establecer un valor menor de length elimina elementos del final.
  • Conserva el resultado de un método que copia cuando necesites el array nuevo.

2.3 Busca valores y convierte listas en texto

Una búsqueda puede necesitar un resultado de sí o no o la posición de un elemento. La conversión de texto tiene otro propósito: cambia la forma de los datos para que una lista se pueda leer, almacenar o procesar.

Pregunta si está o dónde está

includes(value) devuelve un booleano. ["tea", "coffee"].includes("tea") es true; cambiar la búsqueda a «Tea» da false. La búsqueda de coincidencias en texto distingue entre mayúsculas y minúsculas, y los tipos importan: [5].includes("5") es false.

indexOf(value) devuelve el primer índice que coincide, o -1 cuando ningún valor coincide. lastIndexOf busca desde el final. Con [3, 7, 3, 9], el primer 3 está en el índice 0 y el último está en el índice 2. Buscar 5 devuelve -1.

No escribas if (arr.indexOf(x)). El índice 0 es falso en contexto booleano, mientras que -1 es verdadero en ese contexto: esa comprobación rechaza una coincidencia al principio y acepta un valor ausente. Usa arr.indexOf(x) !== -1, o usa includes cuando no necesites la posición.

Para valores ordinarios, ambos métodos requieren el mismo tipo y valor, como la igualdad estricta. Su tratamiento de NaN es distinto: [1, NaN].includes(NaN) es true, pero [1, NaN].indexOf(NaN) es -1. La regla de igualdad usada por includes puede hacer coincidir NaN consigo mismo.

Compara el contenido de forma deliberada

Dos arrays creados por separado son arrays distintos aunque sus elementos coincidan. [1, 2] === [1, 2] es false; == también compara la identidad de los arrays. Para comprobar que tienen el mismo contenido ordenado, compara las longitudes y después los valores de cada índice correspondiente. Una comprobación de pertenencia con resultado de sí o no no establecería por sí sola el mismo orden ni el mismo número de repeticiones.

Une elementos en una cadena
const dateParts = ["2026", "03", "15"];
console.log(dateParts.join("-")); // "2026-03-15"
console.log([1, 2, 3].join()); // "1,2,3"
console.log([1, 2, 3].join("")); // "123"

join coloca su separador entre los elementos, nunca después del último. Su separador predeterminado es una coma sin espacios. Los elementos null y undefined aportan texto vacío. Elige el separador de forma explícita para obtener una salida legible.

Usar + con una cadena también convierte un array en texto, pero usa comas: "List: " + [1, 2] se convierte en «List: 1,2». La estructura anidada se pierde en ese texto: String([1, [2, 3]]) da «1,2,3». Registra el propio array para inspeccionar su estructura.

Divide texto en partes

"red,green,blue".split(",") devuelve ["red", "green", "blue"]. El separador debe coincidir exactamente. Dividir «red, green» solo por una coma conserva el espacio al principio de « green»; dividir por «, » elimina la coma y ese espacio.

"4,8,15".split(",") devuelve cadenas, no números. Convierte cada parte antes de sumar valores numéricos. De lo contrario, el operador + puede unir texto en lugar de calcular un total.

Para texto sencillo basado en letras, "stressed".split("").reverse().join("") produce «desserts». La división crea un array nuevo, la inversión modifica ese array y la unión reconstruye una cadena. Un separador vacío divide en unidades de código UTF-16; algunos símbolos usan más de una unidad, así que esta no es una forma general de invertir todo el texto legible para las personas.

Puntos clave

  • Usa includes para comprobar la pertenencia e indexOf o lastIndexOf para obtener posiciones.
  • Compara un índice de búsqueda con -1; no uses su valor en contexto booleano.
  • Los arrays distintos se comparan por identidad, aunque sus valores parezcan idénticos.
  • join crea texto; split crea un array de cadenas.
  • Los espacios solo forman parte del separador cuando los incluyes explícitamente.
  • Convierte el texto numérico antes de hacer cálculos.
3

Recorre arrays con bucles

Recorrer una lista es más fácil cuando el bucle proporciona la información adecuada. A veces el cuerpo solo necesita cada valor; otras veces necesita un índice, un valor anterior o recorrer el array hacia atrás. Construye patrones reutilizables para sumas, conteos, búsquedas y listas nuevas, y observa cómo cambia cada resultado después de una iteración. Estos patrones también explican los métodos de arrays que siguen.

3.1 Visita los valores de un array sin omitirlos

Un bucle puede visitar las posiciones de un array o tomar los valores directamente. Elige la forma que proporcione la información que necesita el cuerpo. Ten en cuenta que los índices del array cambian al insertar o eliminar elementos.

Usa índices para posiciones y dirección
const fruits = ["apple", "pear", "plum"];
for (let i = 0; i < fruits.length; i++) {
  console.log(fruits[i]);
}

Los índices son 0, 1, 2. La comprobación es < fruits.length, porque el índice 3 está más allá del final. Con <=, una iteración adicional leería undefined. Los bucles con índice también pueden ir hacia atrás, empezando en fruits.length - 1 y continuando mientras i >= 0, o visitar uno de cada dos elementos con i += 2.

Usa for...of para los valores
for (const fruit of fruits) {
  console.log(fruit.toUpperCase());
}

Esto muestra «APPLE», «PEAR» y «PLUM». fruit contiene un valor por iteración. const funciona porque cada iteración crea un enlace nuevo; el bucle no reasigna un contador compartido. for...of también funciona con cadenas. Un bucle sobre «banana» puede contar vocales comprobando "aeiou".includes(ch) para cada ch.

Cambiar un número local no escribe en el array. Después de for (let n of nums) { n = n * 2; }, los elementos numéricos de nums no cambian. Para mutarlos, asigna mediante nums[i] o construye un array nuevo de números duplicados.

Obtén valores e índices juntos

entries() proporciona pares que contienen un índice y un valor. Los corchetes en la cabecera del bucle extraen cada par:

for (const [i, fruit] of fruits.entries()) {
  console.log((i + 1) + ". " + fruit);
}

La salida es «1. apple», «2. pear», «3. plum». Los índices del array siguen empezando en cero; i + 1 solo cambia la numeración mostrada.

NecesidadBucle útil
Cada valor en ordenfor...of
Posiciones, orden inverso o elementos vecinosfor basado en índices
Valor e índice juntosfor...of sobre entries()

for...in visita nombres de propiedades. En los arrays, sus índices son cadenas y puede incluir propiedades adicionales. Usa las formas de bucle para arrays anteriores para procesar elementos.

Evita omitir elementos desplazados
const nums = [2, 4, 5, 6];
for (let i = 0; i < nums.length; i++) {
  if (nums[i] % 2 === 0) nums.splice(i, 1);
}
// nums is [4, 5]

En el índice 0, eliminar 2 desplaza 4 al índice 0. La actualización mueve i a 1, así que se omite 4. Después el bucle ve 5 y elimina 6. El resultado todavía contiene un número par.

Cuando elimines por índice, recorre el array hacia atrás desde el final. Al eliminar un elemento, solo se desplazan posiciones ya visitadas. Otra opción es construir un array nuevo que contenga los valores que se quieren conservar. Evita añadir elementos al mismo array mientras la comprobación de parada de un bucle dependa de su longitud; el punto final puede seguir desplazándose.

Puntos clave

  • Visita los índices desde 0 mientras i < arr.length.
  • Usa for...of cuando solo necesites los valores.
  • entries() proporciona pares de índice y valor.
  • Reasignar una variable numérica local del bucle no sustituye un elemento del array.
  • Eliminar hacia delante puede omitir elementos desplazados; recorre hacia atrás o construye un array nuevo.

3.2 Calcula sumas, busca y construye listas nuevas

Muchas tareas con arrays usan los mismos patrones breves de bucle. Decide qué resultado necesitas, elige su valor inicial y actualízalo una vez por cada elemento pertinente. Un seguimiento muestra qué significa el resultado después de cada paso.

Acumula un total y cuenta coincidencias
const temps = [18, 21, 19, 24];
let sum = 0;
let warm = 0;
for (const t of temps) {
  sum += t;
  if (t > 20) warm++;
}

sum suma cada temperatura; warm añade uno solo para una temperatura superior a 20 °C. Registran cantidades distintas. Un seguimiento hace visible esa diferencia:

tsum después de sumarwarm después de comprobar
18180
21391
19581
24822

El promedio es sum / temps.length, que da 20,5 °C. Comprueba la longitud antes de dividir: un array vacío da 0 / 0, que es NaN, no un promedio significativo.

Sigue un valor máximo o mínimo

Para un array no vacío, inicializa el máximo con su primer elemento. Después sustitúyelo solo cuando encuentres un valor mayor:

const values = [-3, -7, -1, -5];
let max = values[0];
for (const n of values) {
  if (n > max) max = n;
}
// max is -1

Empezar en cero conservaría incorrectamente el cero para una lista de valores negativos. Empezar con -Infinity también funciona para un máximo, pero una entrada vacía deja entonces ese valor inicial. Para un mínimo, invierte la comparación y elige el primer elemento o Infinity como valor inicial.

Encuentra la primera coincidencia o comprueba una lista completa

Una búsqueda almacena una coincidencia y sale con break. Con let firstWarm;, el bucle puede asignar firstWarm = t en el primer t > 20 y salir. Encuentra 21 y deja los elementos posteriores sin comprobar. Si nada coincide, la variable permanece en undefined.

Para una comprobación de «todos», inicia un indicador en true y cámbialo a false en el primer fallo. Para una comprobación de «alguno», empieza en false y cámbialo a true en el primer acierto. Si las puntuaciones aprobadas son las de al menos 50, [72, 85, 49] falla la comprobación de que todos aprobaron en 49. Una lista vacía deja el indicador con su valor inicial.

Construye valores modificados y compara elementos vecinos
const km = [1.5, 3, 0.25];
const meters = [];
for (const d of km) {
  meters.push(d * 1000);
}
// meters is [1500, 3000, 250]

El array nuevo empieza vacío y recibe una distancia convertida por iteración. Coloca una condición antes de push cuando solo algunos valores deban formar parte del resultado.

Para los cambios de un día al siguiente, empieza en el índice 1, porque el índice 0 no tiene un día anterior:

const changes = [];
for (let i = 1; i < temps.length; i++) {
  changes.push(temps[i] - temps[i - 1]);
}
// changes is [3, -2, 5]

Hay una diferencia menos que lecturas. Restar en el orden contrario invertiría todos los signos. Las mismas formas de resultado aparecen en los métodos de arrays: map construye valores transformados, filter conserva coincidencias, find busca, some y every comprueban condiciones y reduce acumula. Un bucle sigue siendo útil cuando una pasada necesita varios resultados, como con sum y warm.

Puntos clave

  • Inicia sumas y conteos en cero y actualiza cada uno según su propósito.
  • Inicializa un valor extremo con los datos o con el infinito adecuado.
  • Una búsqueda de la primera coincidencia se detiene con break.
  • Los indicadores de todos o alguno empiezan con valores booleanos opuestos.
  • Construye un array nuevo con push para conservar el original.
  • Empieza las comparaciones entre elementos vecinos en el índice 1.
  • Sigue las variables que cambian para encontrar dónde aparece el primer error en un resultado.
4

Procesa arrays con métodos que reciben funciones de devolución de llamada

Los métodos de arrays permiten que una función breve describa lo que debe ocurrir con cada valor. El método gestiona el recorrido mientras la función de devolución de llamada proporciona una transformación, una comprobación o el siguiente resultado acumulado. Lee con atención el valor devuelto: puede ser un array, un elemento, un índice, un booleano o un total. Las mismas reglas básicas de las funciones de devolución de llamada sirven para todas estas tareas, incluido un comportamiento fiable cuando una lista está vacía.

4.1 Pasa una función de devolución de llamada a un método de array

Una función recibe entradas, ejecuta código y puede devolver un resultado. Una función de devolución de llamada es una función que se pasa a otra para que la llame. Los métodos de arrays usan estas funciones para describir el trabajo que se hace con cada elemento.

Escribe una función flecha breve

n => n * 2 recibe un parámetro llamado n y devuelve su valor duplicado. La flecha separa las entradas del cuerpo. Un solo parámetro puede omitir los paréntesis. Si no hay parámetros o hay varios, se necesitan: () => 0 y (a, b) => a - b.

const double = n => n * 2;
const doubled = [1, 2, 3].map(double);
// doubled is [2, 4, 6]

double nombra la función en sí. El método la llama con cada número. Escribir map(double()) la llamaría inmediatamente y pasaría el resultado en lugar de la función. Con una comprobación definida por una función con nombre, como function isEven(n) { return n % 2 === 0; }, usa filter(isEven) para que el método proporcione cada elemento.

Devuelve un valor desde un cuerpo de bloque

Una expresión después de la flecha se devuelve automáticamente. Las llaves crean un bloque, por lo que un resultado necesita un return explícito:

const double = n => {
  const doubled = n * 2;
  return doubled;
};

Sin return, la función devuelve undefined. Por tanto, [1, 2, 3].map(n => { n * 2; }) produce [undefined, undefined, undefined]. La multiplicación se ejecuta, pero su valor nunca se convierte en el resultado de la función de devolución de llamada.

Interpreta los argumentos por su posición

Métodos como map, filter y forEach pasan primero el elemento, después su índice desde cero y en tercer lugar el array completo. En (name, i) => ..., tú eliges los nombres; sus posiciones determinan qué reciben. Omite los parámetros que no uses al final. Otros métodos tienen firmas diferentes: reduce también recibe un acumulador y una función de comparación para ordenar recibe dos valores que comparar.

Usa forEach para acciones
const letters = ["a", "b"];
const result = letters.forEach((letter, i) => {
  console.log(i + ": " + letter);
});
// Prints "0: a" and "1: b".
// result is undefined.

Mostrar texto es un efecto secundario: una acción que se realiza mientras se ejecuta la función de devolución de llamada. forEach descarta los valores de retorno de esa función y devuelve undefined. Usa map cuando necesites un array nuevo de resultados. Devolver un valor desde una función de devolución de llamada de forEach no cambia esa regla.

Un return en esta función termina solo la llamada actual; el método continúa con el siguiente elemento. No se puede usar break dentro de una función de devolución de llamada para salir de forEach. Elige for...of con break, o un método de búsqueda como find o some, cuando el trabajo posterior deba detenerse al encontrar una coincidencia.

Estos métodos no modifican por sí mismos el array original. La función de devolución de llamada aún puede mutarlo, por ejemplo mediante una asignación por índice o push. Mantener estas funciones centradas en su valor de retorno o en la acción prevista facilita razonar sobre lo que contendrá el array original después.

Puntos clave

  • Pasa la propia función de devolución de llamada, sin llamarla antes.
  • Un cuerpo de expresión devuelve su valor automáticamente; un cuerpo de bloque necesita return.
  • Las posiciones de los parámetros de la función de devolución de llamada determinan sus significados.
  • forEach realiza acciones y devuelve undefined.

4.2 Transforma cada valor o conserva los que coinciden

Elige un método de array según la forma del resultado. map produce un valor para cada elemento presente. filter conserva los elementos originales que cumplen una condición. Ambos devuelven arrays nuevos.

Transforma con map
const km = [1.5, 3, 0.25];
const meters = km.map(d => d * 1000);
// meters is [1500, 3000, 250]; km is unchanged.

El valor devuelto por la función de devolución de llamada se convierte en el elemento de la posición correspondiente. Para una entrada sin huecos hay una llamada por elemento y el resultado tiene la misma longitud. También funciona con elementos de tipo cadena: ["ana", "ben"].map(s => s.toUpperCase()) da ["ANA", "BEN"].

El segundo parámetro de la función de devolución de llamada proporciona el índice. ["Ana", "Ben"].map((name, i) => (i + 1) + ". " + name) construye ["1. Ana", "2. Ben"]. Si la función tiene un cuerpo de bloque, devuelve explícitamente el valor que se va a almacenar.

Selecciona con filter
const temps = [18, 21, 19, 24];
const warm = temps.filter(t => t > 20);
// warm is [21, 24]

filter conserva un elemento cuando la función de devolución de llamada devuelve un resultado verdadero en contexto booleano. Conserva el propio elemento, no el booleano devuelto por la función. Los valores conservados mantienen su orden original. El resultado puede contener todos los elementos, algunos o ninguno; temps.filter(t => t > 30) es [].

No devuelvas el propio elemento cuando cero sea un dato válido. [0, 5, 0, 3].filter(n => n) descarta ambos ceros porque son falsos en contexto booleano. Una condición como n !== null elimina las lecturas ausentes representadas por null y conserva el cero. Expresa la regla real para conservar un elemento.

Resultado necesarioMétodo
Un valor transformado por elementomap
Todos los elementos originales que cumplen una condiciónfilter
Algunos elementos, transformados despuésfilter seguido de map

Usar map con una condición que devuelve undefined para los elementos rechazados no los elimina. Esos resultados undefined siguen ocupando posiciones en el array nuevo.

Sigue una cadena de izquierda a derecha

[12, 7, 30, 4].filter(n => n >= 10).map(n => n / 2) primero crea [12, 30] y después [6, 15]. La segunda función de devolución de llamada solo recibe los elementos conservados. Filtrar antes de transformar es adecuado cuando la comprobación se refiere a los valores originales. Cambiar el orden puede cambiar lo que comprueba la condición.

Convierte texto numérico de forma deliberada
const numbers = "4,8,15".split(",").map(Number);
// numbers is [4, 8, 15]

Number recibe cada parte del texto y produce un número. Pasar parseInt directamente es una trampa: su segundo argumento es una base numérica, mientras que map proporciona ahí el índice. ["10", "10", "10"].map(parseInt) da [10, NaN, 2]. Usa map(s => parseInt(s, 10)) para fijar la base, o map(Number) para estas cadenas de números enteros.

Ni map ni filter sustituyen el original. temps.map(t => t + 1); por sí solo descarta el array recién calculado. Guárdalo, devuélvelo desde una función o úsalo en una cadena de métodos.

Puntos clave

  • map devuelve valores transformados en un array nuevo de la misma longitud.
  • filter devuelve los elementos originales que cumplen la condición en su orden original.
  • Una comprobación de filtro debe expresar la regla prevista para conservar los ceros válidos.
  • Las funciones de devolución de llamada encadenadas operan sobre el resultado del método anterior.
  • Usa Number o una función envolvente de un argumento en lugar de map(parseInt).
  • Almacena o usa el array nuevo; el original no cambia.

4.3 Encuentra una coincidencia y comprueba si alguno o todos cumplen

Algunas preguntas necesitan un valor, otras una posición o una respuesta de sí o no. Los métodos de búsqueda pueden detenerse una vez que se conoce esa respuesta. Elegir el tipo de retorno adecuado facilita escribir correctamente las condiciones posteriores.

Elige un valor o un índice
const temps = [18, 21, 19, 24];
console.log(temps.find(t => t > 20)); // 21
console.log(temps.findIndex(t => t > 20)); // 1
console.log(temps.findLast(t => t > 20)); // 24
console.log(temps.findLastIndex(t => t > 20)); // 3

find busca desde el principio y devuelve el primer elemento que coincide. findIndex devuelve su índice. Sus formas con Last buscan hacia atrás. Los cuatro se detienen cuando encuentran la coincidencia solicitada.

MétodoResultado con coincidenciaResultado sin coincidencia
find, findLastElementoundefined
findIndex, findLastIndexÍndice-1
filterArray de todas las coincidencias[]

temps.find(t => t > 30) devuelve undefined; temps.findIndex(t => t > 30) devuelve -1. Antes de pasar un índice encontrado a splice, comprueba i !== -1. De lo contrario, splice(-1, 1) elimina el último elemento aunque no se haya encontrado ninguna coincidencia.

Conserva las coincidencias falsas en contexto booleano

[3, 0, 5].find(n => n < 1) devuelve 0, una coincidencia válida. if (result) la trata incorrectamente como un fallo porque cero es falso en contexto booleano. Para datos numéricos, result !== undefined distingue cero de la ausencia de coincidencia. Si un array puede contener undefined como valor coincidente, usa findIndex y compara el resultado con -1; el valor por sí solo no puede distinguir esos casos.

filter es adecuado cuando se necesitan todas las coincidencias. [5, 12, 8, 130].filter(n => n > 10) da [12, 130]; find devuelve solo 12. Obtener filter(...)[0] calcula todo el array de coincidencias antes de leer su primer valor.

Comprueba si alguno o todos cumplen
const scores = [72, 85, 49];
const anyFailed = scores.some(s => s < 50); // true
const allPassed = scores.every(s => s >= 50); // false

some se detiene en el primer acierto. every se detiene en el primer fallo. Sus respuestas son booleanos, no elementos. En estas llamadas, el 49 hace que some tenga éxito y que every falle.

Para un array vacío, some devuelve false porque nada cumple la condición. every devuelve true porque nada deja de cumplirla. Si un conjunto completo de resultados debe contener al menos una puntuación, combina las comprobaciones: scores.length > 0 && scores.every(s => s >= 50). La condición de longitud maneja el caso vacío; every comprueba los elementos.

Elige entre pertenencia exacta y una comprobación personalizada

includes("ana") busca exactamente ese valor. Una búsqueda que no distinga mayúsculas y minúsculas necesita una función de devolución de llamada: names.some(n => n.toLowerCase() === "ana"). Esta puede aceptar tanto «Ana» como «ANA». Usa includes para un valor conocido y una búsqueda con función de devolución de llamada cuando cada elemento deba comprobarse mediante una regla.

Puntos clave

  • Elige valor, índice, array o booleano según el resultado que necesites.
  • findLast y findLastIndex buscan desde el final.
  • Compara un índice con -1 antes de usarlo para modificar un array.
  • Un elemento falso en contexto booleano como 0 puede ser una coincidencia real.
  • some se detiene en un acierto; every se detiene en un fallo.
  • Los arrays vacíos dan false para some y true para every.

4.4 Mantén un resultado a lo largo de reduce

reduce lleva un acumulador de un elemento al siguiente. Su función de devolución de llamada devuelve el acumulador para el paso siguiente. Después del último elemento, el método devuelve ese valor final.

Sigue el cálculo de un total
const temps = [18, 21, 19, 24];
const total = temps.reduce((sum, t) => sum + t, 0);
// total is 82

El 0 es el acumulador inicial. La función de devolución de llamada recibe primero sum y después la temperatura actual t. La suma que devuelve se convierte en el primer argumento de la siguiente llamada.

Acumulador anteriorElementoAcumulador devuelto
01818
182139
391958
582482

Esta es la misma suma acumulada que en un bucle con let sum = 0. La función de devolución de llamada también tiene argumentos opcionales de índice y array después del acumulador y el elemento. Los nombres de los parámetros son flexibles, pero su orden es fijo.

Proporciona un valor inicial útil

Con un valor inicial, la reducción empieza en el primer elemento. Sin él, el primer elemento presente se convierte en el acumulador y las llamadas a la función de devolución de llamada empiezan con el siguiente elemento presente. En un array vacío, omitir el valor inicial lanza un TypeError. [].reduce((sum, n) => sum + n, 0) devuelve 0 sin error porque no se necesita ninguna llamada a la función de devolución de llamada.

El valor inicial también establece el tipo de resultado. Usa 0 para sumas o conteos y "" para texto. ["a", "b", "c"].reduce((text, s) => text + s.toUpperCase(), "") construye «ABC». Un total numérico que empieza con una cadena puede concatenar texto accidentalmente mediante +.

Cuenta y encuentra un valor extremo
const scores = [72, 85, 49];
const passed = scores.reduce(
  (count, s) => s >= 50 ? count + 1 : count,
  0
);
// passed is 2

Una puntuación aprobada suma uno; una no aprobada devuelve el conteo sin cambios. Cada rama proporciona el siguiente acumulador. Para un máximo, devuelve el valor mayor: [-3, -7, -1, -5].reduce((max, n) => n > max ? n : max, -Infinity) da -1. Empezar en cero sería incorrecto para esta lista de valores negativos. Una entrada vacía deja -Infinity, así que maneja ese resultado cuando se necesite un máximo real.

Devuelve un valor en cada ruta

Una función de devolución de llamada con bloque necesita return. (sum, n) => { sum + n; } devuelve undefined, así que el resultado final de la reducción es undefined. Una devolución omitida en algunas rutas también es peligrosa. En un conteo sobre [72, 49, 85], devolver un valor solo cuando se aprueba da primero 1, luego undefined en 49 y después NaN al sumar uno en 85. Devuelve el acumulador sin cambios cuando un elemento no aporte nada.

Combina operaciones sin ocultar la tarea

La suma de las puntuaciones aprobadas es scores.filter(s => s >= 50).reduce((sum, s) => sum + s, 0), que da 157. Un promedio necesita un conteo aparte: temps.reduce((sum, t) => sum + t, 0) / temps.length da 20,5 °C. Comprueba primero la longitud, porque una entrada vacía da NaN después de la división. Si una función de devolución de llamada empieza a hacer varias tareas sin relación, un bucle for...of puede mostrar con más claridad los resultados que cambian.

Puntos clave

  • reduce pasa primero el acumulador y después el elemento.
  • La función de devolución de llamada debe devolver el siguiente acumulador en cada ruta.
  • Un valor inicial explícito hace predecible el comportamiento con una entrada vacía.
  • Elige el valor inicial según el resultado: suma, conteo, texto o valor extremo.
  • Un promedio necesita tanto un total como un conteo distinto de cero.
5

Ordena, copia y combina arrays

Ordenar una lista y copiarla son decisiones distintas. Una ordenación numérica necesita reglas de comparación diferentes a las de una lista de nombres, y el idioma influye en el orden que esperan los lectores. Decide si debe conservarse la secuencia original antes de elegir un método que modifique o copie. Las referencias y las copias superficiales explican qué cambios posteriores quedan localizados y cuáles siguen siendo visibles a través de otro nombre del array.

5.1 Ordena números y conserva el original

Ordenar establece un orden mediante la comparación de elementos. Invertir simplemente da la vuelta al orden existente. Ambas operaciones tienen métodos que modifican un array y métodos que crean una copia.

Comprende el orden predeterminado

[10, 9, 1, 100].sort() da [1, 10, 100, 9]. Sin una función de comparación, sort compara los elementos como cadenas, carácter por carácter, mediante unidades de código UTF-16. «100» empieza por «1», que va antes que «9». Los elementos almacenados siguen siendo números; solo la comparación usa su forma de texto.

Para las cadenas, este orden predeterminado también puede sorprender a los lectores. ["banana", "Cherry", "apple"].sort() da ["Cherry", "apple", "banana"], porque las mayúsculas ASCII van antes que las minúsculas. Las letras acentuadas pueden quedar separadas de las letras con las que los lectores las agrupan. Usa una comparación que tenga en cuenta el idioma para obtener un orden alfabético natural.

Devuelve el signo correcto

Una función de comparación recibe dos elementos, a y b. Un valor de retorno negativo coloca a antes de b; uno positivo lo coloca después de b; cero los trata como iguales para la ordenación.

const nums = [10, 9, 1, 100];
nums.sort((a, b) => a - b);
// nums is [1, 9, 10, 100]

Comparar 10 con 9 produce el valor positivo 1, así que 9 va antes que 10. Para orden numérico descendente, usa (a, b) => b - a. Devuelve un número con un signo significativo. (a, b) => a > b solo devuelve true o false, que se convierten en 1 o 0; nunca indica que a debe ir antes que b. Un comparador así produce un orden poco fiable.

La ordenación es estable: los elementos que se comparan como iguales conservan su orden relativo original. ["kiwi", "fig", "pear", "plum"].sort((a, b) => a.length - b.length) da ["fig", "kiwi", "pear", "plum"]. Las tres palabras de cuatro letras conservan su orden.

Elige entre mutación o copia
MétodoEfecto en el originalArray devuelto
sort(compare)Ordena el original in situEl mismo array
toSorted(compare)Deja el original sin cambiosArray nuevo ordenado
reverse()Invierte el original in situEl mismo array
toReversed()Deja el original sin cambiosArray nuevo con el orden invertido

const sorted = scores.sort((a, b) => a - b); proporciona un segundo nombre para el mismo array, ahora ordenado. No conserva el orden anterior. Para obtener un array nuevo ordenado, usa scores.toSorted((a, b) => a - b) o crea una copia mediante propagación antes de sort.

[3, 1, 2].toReversed() da [2, 1, 3]. Es una secuencia invertida, no un orden numérico descendente. Para colocar primero los valores mayores, usa un comparador descendente u ordena de forma ascendente antes de invertir.

Comprueba los tipos antes de ordenar texto numérico

Los valores de split son cadenas. ["10", "9", "100"].sort() da ["10", "100", "9"]. La resta en un comparador convierte las cadenas numéricas durante la comparación, pero deja los elementos como cadenas. Convierte primero con map(Number) cuando los valores sean datos numéricos y después usa un comparador numérico. Esto también prepara los datos para sumas posteriores sin concatenar texto por accidente.

Puntos clave

  • La ordenación predeterminada compara texto, incluso para elementos numéricos.
  • Usa a - b para ordenar números de forma ascendente y b - a para hacerlo de forma descendente.
  • Un comparador devuelve un número negativo, cero o un número positivo.
  • Los elementos que se comparan como iguales conservan su orden relativo.
  • sort y reverse mutan; toSorted y toReversed copian.
  • Invertir el orden actual no necesariamente lo ordena.

5.2 Ordena y da formato a los datos para el lector

Las personas esperan que el orden del texto y el formato de los números sigan las convenciones de un idioma. Conserva los valores en formas fáciles de procesar, elige una configuración regional explícita para comparar texto y da formato a la salida final para el lector.

Compara texto con reglas regionales

a.localeCompare(b, locale) devuelve un número negativo cuando a va antes que b, uno positivo cuando va después y cero cuando se comparan como iguales. Solo se garantiza el signo, no un -1 o 1 exacto.

const names = ["Zoe", "Émile", "adam"];
const sorted = names.toSorted((a, b) => a.localeCompare(b, "en"));
// sorted is ["adam", "Émile", "Zoe"]

Una configuración regional es una etiqueta de idioma como «en», «de» o «sv». El alemán coloca «ä» antes de «z», mientras que el sueco la coloca después de «z». Pasa el idioma previsto de la página para que esa elección sea explícita. Sin una configuración regional, los ajustes predeterminados del entorno de ejecución deciden el orden.

Las comparaciones simples con < siguen comparando códigos de caracteres. Restar palabras produce NaN, que actúa como una comparación de igualdad al ordenar; no crea un orden alfabético.

Establece opciones de comparación útiles

Con { numeric: true }, las secuencias de dígitos se comparan numéricamente. Ordenar ["file10", "file2", "file1"] con (a, b) => a.localeCompare(b, "en", { numeric: true }) da ["file1", "file2", "file10"]. Una ordenación de texto sencilla coloca «file10» antes de «file2».

En inglés, { sensitivity: "base" } trata como iguales las variantes de mayúsculas y acentos, como «a», «A» y «á». Estas reglas dependen del idioma: el sueco trata «a» y «ä» como letras base diferentes. Usa la configuración regional prevista tanto para buscar coincidencias como para ordenar.

Para muchas comparaciones, reutiliza un comparador:

const collator = new Intl.Collator("en", { numeric: true });
const sorted = files.toSorted(collator.compare);

collator.compare ya es una función de comparación. Crearla una vez evita configurar repetidamente las mismas opciones regionales durante una ordenación grande.

Ordena las fechas antes de darles formato

Las cadenas YYYY-MM-DD de anchura fija colocan el año antes del mes y del día. Así, la ordenación de texto sigue el orden de las fechas: ["2026-03-15", "2025-11-02", "2026-01-20"].sort() da ["2025-11-02", "2026-01-20", "2026-03-15"].

El texto que empieza por el día, como «15/03/2026» y «20/01/2025», compara primero el día, por lo que puede colocar primero el año posterior. Almacena y ordena estas fechas en formato ISO y después produce el texto para mostrarlas al final.

Construye listas y números legibles

join(", ") usa el mismo separador en todas partes. Intl.ListFormat añade el conector final del idioma:

const list = new Intl.ListFormat("en-US", {
  style: "long", type: "conjunction"
});
list.format(["Ana", "Ben", "Cleo"]);
// "Ana, Ben, and Cleo"

«en-GB» produce «Ana, Ben and Cleo»; «nl» produce «Ana, Ben en Cleo». Una disyunción usa «or» en inglés. Dos nombres dan «Ana and Ben» sin coma.

(1234.5).toLocaleString("en-US") da «1,234.5», mientras que «de-DE» da «1.234,5». Estos resultados son cadenas. Ordena los datos numéricos antes de aplicar toLocaleString con map; dar formato primero sustituye los valores numéricos por texto cuya puntuación afecta a la ordenación de texto.

Puntos clave

  • Usa localeCompare o un Intl.Collator reutilizable para ordenar según el idioma.
  • Usa el signo del resultado de la comparación, no un -1 o 1 exacto.
  • numeric: true ordena de forma natural las secuencias de dígitos dentro de los nombres.
  • Las cadenas de fecha ISO de anchura fija se ordenan cronológicamente como texto.
  • Intl.ListFormat añade un conector apropiado para el idioma.
  • Ordena primero los números y dales formato al final.

5.3 Copia arrays sin compartir cambios accidentales

Una variable de array contiene una referencia a un array. Asignar esa variable a otro nombre comparte el array. La sintaxis de propagación puede crear un array exterior nuevo, combinar listas o pasar elementos como argumentos separados de una función.

Distingue la asignación de la copia
const a = [1, 2, 3];
const b = a;
b.push(4);
// a and b both refer to [1, 2, 3, 4].
console.log(a === b); // true

Hay un array con dos nombres. const no impide que se use cualquiera de los dos nombres para mutarlo. Un array exterior nuevo necesita una operación de copia real:

const c = [...a];
c.push(5);
// c is [1, 2, 3, 4, 5]; a stays [1, 2, 3, 4].
console.log(c === a); // false

Los tres puntos despliegan los elementos de a dentro de un literal de array nuevo. Omitirlos tiene un efecto distinto: [a] crea un array de un elemento cuyo elemento es el array completo a. [...a] contiene los elementos de a por separado.

Combina e inserta

[...[1, 2], ...[3, 4]] da [1, 2, 3, 4], igual que [1, 2].concat([3, 4]). [...first, 99, ...second] coloca un elemento adicional entre dos listas. [...list, "new"] crea un array ampliado, mientras que list.push("new") modifica el existente. La propagación conserva el orden de los elementos de cada entrada.

Reconoce una copia superficial
const grid = [[1, 2], [3, 4]];
const copy = [...grid];
copy[0].push(9);
// grid[0] and copy[0] are both [1, 2, 9].

Los arrays exteriores son distintos, pero sus elementos de fila siguen apuntando a los mismos arrays interiores. Esta es una copia superficial. Sustituir copy[0] por una fila nueva cambiaría solo el array exterior copiado; mutar la fila existente modifica la fila compartida. structuredClone(grid) crea una copia profunda independiente de estos arrays anidados.

Propaga valores en una llamada

Math.max(...[3, 9, 4]) proporciona tres argumentos separados y devuelve 9. Pasar el array directamente, Math.max([3, 9, 4]), proporciona un array y da NaN. Propagar un array vacío da Math.max(...[]) === -Infinity y Math.min(...[]) === Infinity.

Los arrays muy grandes pueden superar el límite de argumentos de un motor al propagarse en una llamada. No existe un número universal de elementos que sea seguro. Usa un bucle o reduce para encontrar un valor extremo en una entrada grande. La propagación en un literal de array no crea una lista de argumentos de función.

Propaga cadenas y actualiza copias

[..."hello"] produce cinco cadenas de letras. La propagación de cadenas visita puntos de código Unicode: [..."a😀"] tiene dos elementos, mientras que "a😀".split("") tiene tres unidades de código UTF-16. Algunos símbolos visibles combinan varios puntos de código, así que la propagación no es una forma general de contar caracteres visibles. Un número no es iterable; [...5] lanza un TypeError.

En una lista de parámetros, function total(...nums) usa resto para reunir argumentos en un array. La propagación en una llamada hace lo contrario: proporciona argumentos separados.

Para actualizaciones basadas en copias, [10, 20, 30].with(1, 25) da [10, 25, 30] y .toSpliced(1, 1) da [10, 30]. toSorted y toReversed también conservan el original. Son copias superficiales, así que se aplica la misma regla de que los arrays interiores se comparten.

Puntos clave

  • La asignación comparte un array; la propagación en un literal de array crea un array exterior nuevo.
  • Omitir la propagación anida un array como un solo elemento.
  • La propagación puede combinar arrays e insertar elementos adicionales sin mutarlos.
  • Una copia superficial sigue compartiendo los arrays interiores; structuredClone copia estos arrays anidados de forma profunda.
  • La propagación en una llamada proporciona argumentos separados y no es adecuada para entradas de tamaño ilimitado.
  • La propagación de cadenas visita puntos de código; los parámetros de resto reúnen argumentos.
  • with y toSpliced crean copias modificadas.

Ejemplos de Bucles y arrays en JavaScript

5 Lecciones Interactivas

1

Sigue un bucle desde su primera comprobación hasta la salida

12 pasos
Sigue un contador y una suma acumulada, compara bucles que comprueban antes y después, y controla una búsqueda anidada.
  1. 1
    IntroducciónSigue lo que cambia

    Un bucle repite un cuerpo, pero su resultado depende del orden de las comprobaciones y los cambios. Seguiremos una pequeña suma una iteración cada vez, después elegiremos un bucle basado en una condición (while comprueba primero, do...while tras una ejecución) y controlaremos una búsqueda anidada con break y continue para salir o saltar.

    Mantén separadas dos preguntas: ¿qué valor llega al cuerpo y qué valor hace que falle la siguiente comprobación? La última comprobación fallida forma parte del flujo de control aunque no ejecute el cuerpo.

  2. 2
    EjemploPrepara una suma acumulada

    Queremos la suma de 2, 4 y 6. El contador selecciona cada número, mientras que un acumulador independiente conserva su suma.

    let total = 0;
    for (let n = 2; n <= 6; n += 2) {
      total += n;
    }
    

    La inicialización establece n en 2 una vez. La primera comprobación, 2 <= 6, se cumple. La primera ejecución del cuerpo suma dos a cero y deja total en 2. Después, la actualización cambia n a 4.

  3. 3
    EjemploSigue las comprobaciones restantes

    La siguiente comprobación acepta 4, así que el total pasa a ser 2 + 4, o 6. La actualización lleva el contador a 6, que sigue cumpliendo n <= 6. Al sumar ese último valor, el total pasa a ser 12.

    Después, la actualización cambia n a 8. Ahora 8 <= 6 es falso y el bucle se detiene. El cuerpo se ejecutó tres veces y la condición se comprobó cuatro veces. No se sumó ocho al total.

  4. 4
    DesafíoCambia un extremo

    Si el bucle anterior usara n < 6 en lugar de n <= 6, ¿cuál sería su total final y por qué?

    ---reveal---

    El total sería 6: solo 2 y 4 llegan al cuerpo. En n = 6, la condición ya es falsa, así que nunca se suma seis. La actualización sí llega a seis, pero alcanzar un valor en la cabecera no garantiza una iteración que lo use.

  5. 5
    ExplicaciónDeja que un resultado decida cuándo detenerse

    Supón que el tamaño de un lote empieza en 5 y se duplica hasta alcanzar al menos 30. Un bucle while puede expresar directamente el trabajo pendiente.

    let size = 5;
    let rounds = 0;
    while (size < 30) {
      size *= 2;
      rounds++;
    }
    

    Los tamaños pasan a ser 10, 20 y 40. El bucle termina con tres rondas, porque cuarenta es el primer tamaño alcanzado para el que no hace falta otra duplicación.

  6. 6
    Idea claveDecide si se necesita una primera ejecución

    Un bucle while comprueba antes de hacer nada. Si el tamaño inicial ya es 40, el bucle anterior se ejecuta cero veces. Un bucle do...while lo duplicaría una vez antes de descubrir que no hace falta otra ejecución.

    Usa esa comprobación posterior cuando una ejecución forme parte de la tarea. Contar cifras eliminando una cada vez requiere contar el cero como un número de una cifra, lo que hace útil una primera ejecución del cuerpo.

  7. 7
    DesafíoLee un bucle que comprueba después

    ¿Cuánto valen n y runs después de este código?

    let n = 1;
    let runs = 0;
    do {
      n *= 3;
      runs++;
    } while (n < 8);
    

    ---reveal---

    n es 9 y runs es 2. El primer cuerpo produce tres y la comprobación se cumple. El segundo produce nueve y su comprobación falla. La prueba ocurre después de cada multiplicación, por lo que el valor final puede superar el límite.

  8. 8
    EjemploOmite un valor sin terminar el bucle

    Este bucle muestra solo los valores permitidos del contador.

    for (let n = 1; n <= 5; n++) {
      if (n === 3) continue;
      console.log(n);
    }
    

    Muestra 1, 2, 4, 5. En tres, continue omite la salida, pero la actualización de la cabecera avanza igualmente hasta cuatro. Con break, en cambio, todo el bucle se detendría en tres y no se mostraría ningún valor posterior.

  9. 9
    DesafíoEncuentra una actualización que se omite

    ¿Por qué este código deja de avanzar en n = 2?

    let n = 0;
    while (n < 4) {
      if (n === 2) continue;
      n++;
    }
    

    ---reveal---

    Continue salta directamente a la condición de while y omite n++. En dos, todas las comprobaciones posteriores son verdaderas y cada ejecución del cuerpo vuelve a omitir la actualización. Incrementa en esa rama antes de continuar o usa un bucle for cuya cabecera realice la actualización.

  10. 10
    EjemploSigue una búsqueda interior

    Para cada valor exterior, un bucle interior vuelve a empezar.

    for (let a = 1; a <= 3; a++) {
      for (let b = 1; b <= 4; b++) {
        if (a * b === 6) break;
        console.log(a, b);
      }
    }
    

    En a = 2, alcanzar b = 3 termina ese bucle interior antes de mostrar el par. El bucle exterior sigue avanzando hasta tres. Un break normal controla solo el bucle más interno.

  11. 11
    DesafíoTermina toda la búsqueda anidada

    La búsqueda anidada debe detenerse por completo en su primer producto de seis. ¿Qué cambio lo consigue y qué par lo activa?

    ---reveal---

    Añade la etiqueta outer: al bucle exterior y sustituye el break por break outer;. El primer par que coincide es a = 2, b = 3: la primera fila no tiene ningún producto de seis y después la segunda lo alcanza en su tercera columna. Ambos bucles terminan en ese punto, así que la tercera fila nunca se ejecuta.

  12. 12
    RepasoLee la ruta de ejecución

    Sigue la inicialización una vez y después cada condición, cuerpo y actualización en orden. Cuenta como iteraciones solo las entradas al cuerpo en las que se cumple la condición.

    Un bucle while puede omitir el cuerpo por completo; un bucle do...while no. Continue permite que haya una siguiente iteración, pero puede saltarse una actualización de un bucle while. Break termina su bucle y una etiqueta puede extender esa salida a una búsqueda exterior. En cada caso, identifica la siguiente sentencia a la que llega la ejecución.

2

Sigue un array y el resultado de cada método

11 pasos
Lee datos indexados, sigue una inserción y una eliminación, y después convierte una lista en la que has buscado en texto para mostrar.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónSigue dos resultados de una modificación
  2. 2
    EjemploRelaciona valores e índices
  3. 3
    DesafíoLee un plan anidado
  4. 4
    EjemploAñade una tarea y conserva su valor de retorno
  5. 5
    EjemploSustituye una tarea con splice
  6. 6
    DesafíoCopia un intervalo
  7. 7
    ExplicaciónBusca una posición de forma explícita
  8. 8
    DesafíoDivide y une texto
  9. 9
    Idea claveDistingue el texto numérico de los números
  10. 10
    DesafíoBusca antes de eliminar
  11. 11
    RepasoDistingue posiciones, modificaciones y texto
3

Convierte un bucle en un resultado útil

10 pasos
Elige un recorrido, calcula una suma y un conteo, y después construye los cambios entre lecturas vecinas.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónElige lo que necesita el cuerpo
  2. 2
    ExplicaciónLee valores directamente
  3. 3
    DesafíoVisita una de cada dos posiciones
  4. 4
    EjemploSuma un total y cuenta los viajes largos
  5. 5
    EjemploUsa el total calculado
  6. 6
    DesafíoEncuentra un valor extremo sin inventar el cero
  7. 7
    EjemploConstruye diferencias entre elementos vecinos
  8. 8
    DesafíoConserva solo los aumentos
  9. 9
    ConsejoElimina desde el final cuando los índices se desplazan
  10. 10
    RepasoElige un inicio para cada resultado
4

Sigue una cadena de funciones de devolución de llamada

15 pasos
Devuelve valores desde funciones de devolución de llamada, selecciona y transforma lecturas, búscalas y sigue una reducción.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónDeja que el método gestione las visitas
  2. 2
    ExplicaciónDevuelve una expresión o el resultado de un bloque
  3. 3
    DesafíoElige un método para mostrar resultados
  4. 4
    EjemploConserva las lecturas seleccionadas
  5. 5
    EjemploTransforma los valores seleccionados
  6. 6
    DesafíoConserva los ceros válidos
  7. 7
    ExplicaciónBusca un valor o su posición
  8. 8
    DesafíoReconoce una coincidencia de cero
  9. 9
    Idea claveLas comprobaciones de alguno y todos se resuelven en momentos distintos
  10. 10
    EjemploInicia una reducción de forma explícita
  11. 11
    ConsejoMantén un siguiente acumulador en cada ruta
  12. 12
    DesafíoSigue una suma filtrada
  13. 13
    DesafíoDiagnostica una función de devolución de llamada de conversión
  14. 14
    DesafíoElige entre todas las coincidencias o una
  15. 15
    RepasoInterpreta cada forma de resultado
5

Conserva los datos mientras los ordenas y les das formato

13 pasos
Elige reglas de comparación, ordena los datos numéricos antes de darles formato y sigue el comportamiento de las copias superficiales.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónDecide por separado el orden y la identidad
  2. 2
    EjemploComprueba el orden predeterminado
  3. 3
    ExplicaciónUsa el signo del comparador
  4. 4
    DesafíoProtege el orden original
  5. 5
    EjemploDeja que el idioma decida el orden del texto
  6. 6
    DesafíoOrdena etiquetas numeradas
  7. 7
    ConexiónTermina los cálculos antes de mostrar los datos
  8. 8
    EjemploDa un segundo nombre al mismo array
  9. 9
    EjemploCopia la lista exterior
  10. 10
    DesafíoEncuentra una fila interior compartida
  11. 11
    ConsejoPasa argumentos sin construir una llamada enorme
  12. 12
    DesafíoCombina ordenación, copia y formato
  13. 13
    RepasoSigue lo que se comparte y lo que se devuelve

Ejercicios de Bucles y arrays en JavaScript

40 Preguntas de Práctica en 4 sets

Set 1: Sigue bucles y lee posiciones de arrays10 Preguntas de Práctica

Pregunta 1 de 10

¿Cuántas veces se ejecuta el cuerpo de este bucle?

for (let i = 2; i < 7; i++) {
  console.log(i);
}
  1. 4 veces
  2. 6 veces
  3. 5 veces
  4. 7 veces
Mostrar respuestaOcultar respuesta
Respuesta: C
El cuerpo se ejecuta con los valores del contador 2, 3, 4, 5 y 6, lo que da cinco iteraciones. En 7, la condición es falsa antes de que pueda ejecutarse el cuerpo. Contar seis iteraciones incluiría esa comprobación fallida como si fuera otra ejecución del cuerpo.

Pregunta 2 de 10

¿Qué devuelve ["oak", "pine", "elm", "fir"].at(-2)?
  1. "elm"
  2. "pine"
  3. "fir"
  4. undefined
Mostrar respuestaOcultar respuesta
Respuesta: A
Un índice negativo en at cuenta hacia atrás: -1 es el último elemento, «fir», y -2 es «elm». «pine» está en el índice positivo 1; tratar el índice negativo como una posición positiva ordinaria selecciona el extremo equivocado de la lista.

Pregunta 3 de 10

¿Qué valor se muestra?

let n = 8;
do {
  n -= 3;
} while (n > 6);
console.log(n);
  1. 8
  2. 2
  3. 6
  4. 5
Mostrar respuestaOcultar respuesta
Respuesta: D
El cuerpo se ejecuta antes de la primera comprobación y resta tres de ocho, dejando cinco. La condición 5 > 6 es entonces falsa, así que la ejecución se detiene. Ocho sería el resultado de tratar incorrectamente el bucle como un while que comprueba antes y en el que nunca se entra.

Pregunta 4 de 10

¿Qué valor contiene total después?

let total = 0;
for (let n = 3; n <= 9; n += 3) {
  total += n;
}
  1. 9
  2. 18
  3. 12
  4. 15
Mostrar respuestaOcultar respuesta
Respuesta: B
El contador visita 3, 6 y 9; el total pasa a ser 3, después 9 y luego 18. La condición <= incluye el nueve final. Un total de nueve suma solo los dos primeros valores visitados y omite el extremo en vez de conservar las tres contribuciones.

Pregunta 5 de 10

¿Qué números se muestran, en orden?

for (let n = 2; n <= 7; n++) {
  if (n === 4) continue;
  if (n === 6) break;
  console.log(n);
}
  1. 2, 3
  2. 2, 3, 5, 6
  3. 2, 3, 5, 7
  4. 2, 3, 5
Mostrar respuestaOcultar respuesta
Respuesta: D
En cuatro, continue omite la salida, pero permite que se actualice el contador. Después se muestra cinco; en seis, break termina el bucle antes de mostrarlo. La secuencia que termina en tres confunde continue con una salida anticipada, mientras que un siete posterior requeriría que el bucle continuara después de break.

Pregunta 6 de 10

¿Qué par de valores resulta de grid.length y grid[1][2]?

const grid = [[6, 2, 8], [9, 5, 1]];
  1. 3 y 1
  2. 2 y 1
  3. 2 y 5
  4. 6 y 8
Mostrar respuestaOcultar respuesta
Respuesta: B
El array exterior contiene dos arrays de filas, así que su longitud es dos. El índice 1 selecciona [9, 5, 1] y el índice 2 dentro de esa fila selecciona uno. Indicar una longitud de tres usa la longitud de una fila para el array exterior y mezcla los dos niveles.

Pregunta 7 de 10

¿Cuántas iteraciones se ejecutan antes de que termine este bucle?

let size = 3;
let rounds = 0;
while (size < 20) {
  size *= 2;
  rounds++;
}
  1. 3 iteraciones
  2. 2 iteraciones
  3. 4 iteraciones
  4. 6 iteraciones
Mostrar respuestaOcultar respuesta
Respuesta: A
Los tamaños sucesivos después de cada iteración son 6, 12 y 24. Los dos primeros aún permiten otra iteración, pero 24 < 20 es falso, así que el conteo final es tres. Dos iteraciones se detendrían en doce aunque la condición del bucle aún exige más trabajo.

Pregunta 8 de 10

¿Cuántas veces se ejecuta count++?

let count = 0;
for (let a = 0; a < 4; a++) {
  for (let b = a + 1; b < 4; b++) {
    if (b === 3) break;
    count++;
  }
}
  1. 2 veces
  2. 4 veces
  3. 3 veces
  4. 6 veces
Mostrar respuestaOcultar respuesta
Respuesta: C
Para a = 0, el incremento se ejecuta con b = 1 y 2; para a = 1, se ejecuta con b = 2. En b = 3, cada bucle interior se interrumpe antes de incrementar, y a = 3 no tiene iteraciones interiores. Seis cuenta todos los pares distintos, pero pasa por alto las salidas anticipadas.

Pregunta 9 de 10

Esta conversión debería mostrar los mismos valores que un bucle de conteo que omite 2. ¿Cómo se puede corregir manteniendo la forma while?

let i = 0;
while (i < 4) {
  if (i === 2) continue;
  console.log(i);
  i++;
}
  1. Usar if (i === 2) { break; }.
  2. Usar if (i === 2) { i++; continue; }.
  3. Mover i++ justo antes de console.log(i).
  4. Cambiar la condición a i <= 4.
Mostrar respuestaOcultar respuesta
Respuesta: B
En dos, el código actual salta a la condición sin actualizar y se queda bloqueado. Incrementar dentro de esa rama antes de continuar omite el dos y permite mostrar el tres, dando 0, 1, 3. Sustituir continue por break termina en dos y pierde el valor posterior requerido.

Pregunta 10 de 10

¿Qué devuelve [9, 2, 9].lastIndexOf(9)?
  1. 0
  2. 3
  3. 2
  4. 9
Mostrar respuestaOcultar respuesta
Respuesta: C
El último nueve ocupa el índice dos contando desde cero, así que lastIndexOf devuelve dos. Cero es la posición del primer nueve y sería el valor devuelto por indexOf. El método indica una posición, no el valor coincidente ni la longitud del array.
Set 2: Modifica arrays y construye resultados con bucles10 Preguntas de Práctica

Guarda esta unidad para ver todas las respuestas y practicar cada set.

Pregunta 1 de 10

¿Qué contiene size después de estas sentencias?

const tags = ["new", "open"];
const size = tags.push("done");
  1. ["new", "open", "done"]
  2. 3
  3. "done"
  4. 2
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

¿Cuánto valen cut y data después?

const data = [4, 8, 12, 16];
const cut = data.splice(1, 2, 7);
  1. cut = [8]; data = [4, 7, 12, 16]
  2. cut = [4, 7, 16]; data = [8, 12]
  3. cut = [8, 12]; data = [4, 8, 12, 16]
  4. cut = [8, 12]; data = [4, 7, 16]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Una búsqueda debe reconocer un valor en el índice cero y rechazar un valor ausente. ¿Qué condición debería sustituir a if (items.indexOf(target))?
  1. if (items.indexOf(target) !== -1)
  2. if (items.indexOf(target) > 0)
  3. if (items.indexOf(target) !== 0)
  4. if (items.indexOf(target) === 1)
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

¿Qué cabecera de bucle proporciona en orden cada valor de tipo cadena de labels?
  1. for (const label in labels)
  2. for (const label of labels.length)
  3. for (const label of labels)
  4. for (const label in labels.length)
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

¿Cuál es el valor final de count?

let count = 0;
for (const n of [11, 6, 14, 9]) {
  if (n >= 10) count++;
}
  1. 2
  2. 4
  3. 25
  4. 3
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

¿Qué queda en values después de este código?

const values = [3, 6, 8, 9];
for (let i = 0; i < values.length; i++) {
  if (values[i] % 3 === 0) values.splice(i, 1);
}
  1. [8]
  2. [6, 8, 9]
  3. [3, 8]
  4. [6, 8]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

¿Qué valor resulta de "7;12;5".split(";").join(" / ")?
  1. [7, 12, 5]
  2. "7 / 12 / 5"
  3. "7;12;5"
  4. "7 / 12 / 5 / "
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

¿Qué array se construye?

const readings = [9, 4, 8, 3];
const rises = [];
for (let i = 1; i < readings.length; i++) {
  const change = readings[i] - readings[i - 1];
  if (change > 0) rises.push(change);
}
  1. [-5, 4, -5]
  2. [8]
  3. [4]
  4. [5, 5]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

¿Cuáles son la longitud y el último elemento de a después?

const a = [2, 4];
a[5] = 12;
  1. Longitud 3; último elemento 12.
  2. Longitud 5; último elemento 12.
  3. Longitud 6; último elemento undefined.
  4. Longitud 6; último elemento 12.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Un máximo debe ser un elemento de un array numérico no vacío, incluso cuando todos los valores son negativos. ¿Por qué empezar en 0 puede producir un resultado incorrecto?
  1. Cero hace que cada comparación sea falsa para datos positivos.
  2. Cero puede superar todos los elementos y nunca ser sustituido.
  3. Cero hace que el bucle se detenga en el primer elemento negativo.
  4. Cero se suma a cada elemento antes de realizar la comparación.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Set 3: Transforma, busca y reduce arrays10 Preguntas de Práctica

Guarda esta unidad para ver todas las respuestas y practicar cada set.

Pregunta 1 de 10

¿Qué devuelve [4, 7].map(n => { n + 3; })?
  1. [7, 10]
  2. undefined
  3. [4, 7]
  4. [undefined, undefined]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

¿Qué array resulta de esta expresión?

[5, 16, 9, 22].filter(n => n > 10).map(n => n - 2)
  1. [3, 14, 7, 20]
  2. [14, 20]
  3. [16, 22]
  4. [14]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

¿Qué devuelve [8, 0, 6].find(n => n < 2) y cómo debe comprobarse si se encontró una coincidencia en este array numérico?
  1. undefined; comprobar result === undefined.
  2. 0; comprobar Boolean(result).
  3. 0; comprobar result !== undefined.
  4. 1; comprobar result !== -1.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

¿Qué valor devuelve esta reducción?

[6, 3, 5].reduce((total, n) => total + n, 4)
  1. 18
  2. 14
  3. 10
  4. 24
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

¿Qué valores se muestran y qué se asigna a result?

const result = [2, 5, 8].forEach(n => {
  if (n === 5) return;
  console.log(n);
});
  1. Muestra 2; result es undefined.
  2. Muestra 2, 8; result es [2, 8].
  3. Muestra 2, 8; result es undefined.
  4. Muestra 2, 5, 8; result es undefined.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Las lecturas válidas incluyen el cero; solo null significa que falta una lectura. ¿Qué expresión convierte todas las lecturas válidas a metros?

const km = [0, null, 1.2, 0.4];
  1. km.filter(n => n).map(n => n * 1000)
  2. km.map(n => n * 1000).filter(n => n !== null)
  3. km.filter(n => n !== null).map(n => n * 100)
  4. km.filter(n => n !== null).map(n => n * 1000)
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

¿Qué devuelve el código?

[64, 40, 91].reduce((count, score) => {
  if (score >= 60) return count + 1;
}, 0)
  1. NaN
  2. 2
  3. 1
  4. undefined
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Un informe debe ser verdadero solo cuando exista al menos una puntuación y todas sean al menos 70. ¿Qué expresión maneja todos los tamaños de entrada?
  1. scores.every(s => s >= 70)
  2. scores.length > 0 && scores.every(s => s >= 70)
  3. scores.length > 0 && scores.some(s => s >= 70)
  4. scores.length > 0 || scores.every(s => s >= 70)
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

¿Qué produce esta expresión?

["6", "15", "4"].map(Number)
  .filter(n => n % 2 === 0)
  .map((n, i) => n + i)
  1. [6, 5]
  2. [6, 6]
  3. [6, 4]
  4. ["60", "42"]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Una lista numérica no vacía necesita su valor máximo incluso cuando todos los valores son negativos. ¿Qué reducción cumple ese requisito?
  1. nums.reduce((best, n) => n > best ? n : best, 0)
  2. nums.reduce((best, n) => n < best ? n : best, Infinity)
  3. nums.reduce((best, n) => n > best ? n : best, -Infinity)
  4. nums.reduce((best, n) => n > best, -Infinity)
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Set 4: Ordena, copia y combina resultados de forma segura10 Preguntas de Práctica

Guarda esta unidad para ver todas las respuestas y practicar cada set.

Pregunta 1 de 10

¿Qué devuelve [8, 30, 4].toSorted()?
  1. [4, 8, 30]
  2. [30, 4, 8]
  3. [8, 4, 30]
  4. [8, 30, 4]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

¿Qué arrays contienen a y c después?

const a = [6, 2];
const b = a;
const c = [...a];
b.push(9);
c[0] = 1;
  1. a = [1, 2, 9]; c = [1, 2, 9]
  2. a = [6, 2]; c = [1, 2]
  3. a = [6, 2, 9]; c = [1, 2, 9]
  4. a = [6, 2, 9]; c = [1, 2]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

¿Cómo se puede ordenar readings de mayor a menor conservando su secuencia original?
  1. readings.toSorted((a, b) => b - a)
  2. readings.sort((a, b) => b - a)
  3. readings.toReversed()
  4. readings.toSorted((a, b) => a - b)
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

¿Qué expresión coloca "part12", "part3" y "part1" en un orden natural según los números de sus nombres sin modificar parts?
  1. parts.toSorted((a, b) => a.localeCompare(b, "en"))
  2. parts.toSorted((a, b) => a - b)
  3. parts.toSorted((a, b) => a.localeCompare(b, "en", { numeric: true }))
  4. parts.toSorted((a, b) => b.localeCompare(a, "en", { numeric: true }))
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

¿Cuánto valen rows[0] y copy[1] después?

const rows = [[5], [8]];
const copy = [...rows];
copy[0].push(6);
copy[1] = [2];
  1. rows[0] = [5]; copy[1] = [2]
  2. rows[0] = [5, 6]; copy[1] = [8, 2]
  3. rows[0] = [5, 6]; copy[1] = [2]
  4. rows[0] = [5]; copy[1] = [8, 2]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Un programa da formato a [1200, 25, 4] con numbers.map(n => n.toLocaleString("de-DE")).toSorted(). ¿Cómo debería ordenar los valores y darles formato para conservar numbers y mostrar un orden numérico ascendente?
  1. toSorted numérico y después formato: ["4", "25", "1.200"].
  2. Formato y después toSorted predeterminado: ["1.200", "25", "4"].
  3. toSorted predeterminado y después formato: ["1.200", "25", "4"].
  4. sort numérico y después formato: ["4", "25", "1.200"].
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

¿Qué array se devuelve?

["lion", "ox", "bear", "ant"]
  .toSorted((a, b) => a.length - b.length)
  .toReversed()
  1. ["lion", "bear", "ant", "ox"]
  2. ["bear", "lion", "ox", "ant"]
  3. ["ox", "ant", "lion", "bear"]
  4. ["bear", "lion", "ant", "ox"]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

¿Qué contiene view después?

const values = [7, 2, 5];
const i = values.findIndex(n => n < 0);
values.splice(i, 1);
const view = values.toReversed();
  1. [5, 2, 7]
  2. [2, 7]
  3. [7, 2]
  4. [5, 2]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

¿Cuál es la longitud de joined?

const left = [4, 6];
const right = [8, 10, 12];
const joined = [...left, right];
  1. 5
  2. 2
  3. 4
  4. 3
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Estas cadenas de fecha no se ordenan cronológicamente de forma correcta: ["08/02/2027", "19/01/2026", "03/12/2026"], en formato día/mes/año. ¿Qué cadenas almacenadas dan un orden cronológico como texto para las mismas fechas?
  1. ["2026-01-19", "2026-12-03", "2027-02-08"]
  2. ["2026-03-12", "2026-19-01", "2027-08-02"]
  3. ["03/12/2026", "08/02/2027", "19/01/2026"]
  4. ["2027-02-08", "2026-12-03", "2026-01-19"]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

¿Te atascas con una pregunta tuya? Ayuda con Tareas

Términos Clave

71 Términos Clave, cada uno con su definición

A

Actualización
Una actualización cambia el estado del bucle entre iteraciones; un bucle for realiza la actualización de su cabecera después de su cuerpo.
La actualización i += 5 hace que el siguiente valor del contador sea cinco mayor que el anterior.
Acumulador
Un acumulador es una variable o un valor de una función de devolución de llamada que lleva un resultado creciente de un elemento procesado al siguiente.
Un total de temperaturas conserva la suma anterior antes de añadir la lectura actual en cada paso.
Array (arreglo)
Un array es una colección ordenada de valores con posiciones indexadas, almacenada y accesible mediante una sola referencia.
El array [18, 21, 19, 24] contiene cuatro lecturas de temperatura diarias bajo un nombre de variable.
Array anidado
Un array anidado es un array almacenado como elemento dentro de otro array, lo que permite crear estructuras como filas de valores.
En grid[1][0], el primer índice selecciona una fila y el segundo selecciona un valor dentro de esa fila.

B

Bucle anidado
Un bucle anidado es un bucle dentro de otro; su secuencia interior vuelve a ejecutarse en cada iteración que llega a ella.
Un recorrido de tres filas y cuatro columnas ejecuta su cuerpo interior doce veces cuando se visitan todas las posiciones.
Bucle do...while
Un bucle do...while ejecuta su cuerpo antes de comprobar la condición, por lo que su primera iteración ocurre incluso si después falla la comprobación.
Un bucle do...while que cuenta cifras procesa el cero una vez y lo cuenta como un número de una cifra.
Bucle for...in
Un bucle for...in visita nombres de propiedades enumerables, por lo que no es adecuado como bucle habitual para recorrer los valores de arrays.
En un array proporciona nombres de índices como cadenas y también puede visitar propiedades añadidas que no son elementos.
Bucle for...of
Un bucle for...of recibe en orden cada valor proporcionado por un iterable, sin requerir un contador numérico explícito.
for (const fruit of fruits) lee directamente los nombres de frutas para que el cuerpo pueda procesar cada nombre.
Bucle infinito
Un bucle infinito sigue repitiéndose sin terminar porque su ejecución nunca llega a una salida efectiva.
Un contador que nunca cambia puede hacer que while (n < 3) muestre el mismo valor indefinidamente.
Bucle while (ciclo while)
Un bucle while comprueba su condición antes de cada iteración y se repite mientras esa condición sea verdadera en contexto booleano; puede ejecutarse cero veces.
Un cálculo de crecimiento usa while (balance < 1500) para repetir hasta que se alcance el objetivo.
Búsqueda de índice
Una búsqueda de índice devuelve una posición coincidente o una marca de ausencia de coincidencia; indexOf y lastIndexOf usan menos uno para indicar que no se encontró.
[3, 7, 3].lastIndexOf(3) devuelve 2, que apunta al último elemento coincidente.

C

Cadena de fecha en formato ISO
Una cadena de fecha en formato ISO con la forma YYYY-MM-DD de anchura fija coloca el año, el mes y el día en un orden que se ordena cronológicamente como texto.
La cadena «2025-11-02» se ordena antes que «2026-01-20» porque primero se compara el año.
Cadena de métodos
Una cadena de métodos usa el valor devuelto por una llamada como receptor de la siguiente, lo que permite leer una secuencia de procesamiento de datos de izquierda a derecha.
Una cadena de filter y map conserva primero los números seleccionados y después transforma solo esos números.
Comparador de cadenas según la configuración regional
Un comparador de cadenas según la configuración regional reúne reglas de comparación en una instancia reutilizable de Intl.Collator con una función de comparación lista para usar.
Un comparador con numeric: true ordena nombres que contienen dígitos en una secuencia numérica natural.
Condición del bucle
Una condición del bucle es la comprobación que decide si puede ejecutarse otra iteración; una comprobación previa falsa impide que se ejecute el cuerpo.
Con i < 10, llegar a i = 10 termina el bucle antes de otra ejecución del cuerpo.
Configuración regional
Una configuración regional identifica las convenciones de idioma o región que se usan para operaciones como la comparación de texto y el formato de números.
La configuración regional «sv» coloca «ä» después de «z», mientras que la comparación alemana la coloca antes de «z».
Contador
Un contador registra cuántos eventos o coincidencias han ocurrido; normalmente empieza en cero y aumenta en uno por cada coincidencia.
Un contador de días cálidos aumenta solo cuando la temperatura actual cumple la condición elegida.
Copia profunda
Una copia profunda duplica los datos anidados además de su contenedor exterior, de modo que las modificaciones de las filas copiadas no afectan a las originales.
Para una cuadrícula de arrays numéricos, structuredClone crea copias independientes de las filas interiores.
Copia superficial
Una copia superficial crea un array exterior nuevo y conserva los mismos valores de los elementos, incluidas las referencias a cualquier array anidado.
Añadir un elemento a una fila de una cuadrícula copiada mediante propagación modifica la fila compartida con la cuadrícula original.

E

Efecto secundario
Un efecto secundario es una acción que realiza una función además de proporcionar su valor de retorno, como mostrar texto o modificar datos compartidos.
Una función de devolución de llamada de forEach puede mostrar un nombre aunque el propio método devuelva undefined.
Elemento
Un elemento es un valor almacenado en una posición de un array; puede ser un número, una cadena u otro array, entre otros tipos de valores.
En ["red", "green", "blue"], la cadena «green» es el elemento almacenado en el índice 1.
Error de desfase de una unidad
Un error de desfase de una unidad hace que un cálculo de límites o un bucle incluya una posición adicional u omita una posición prevista.
Usar i <= arr.length lee un índice más allá del último elemento al recorrer un array.
Etiqueta de bucle
Una etiqueta de bucle da nombre a un bucle para que un break o continue con etiqueta pueda dirigir el control a ese bucle que lo contiene.
Escribir break outer; en una coincidencia puede terminar ambos bucles cuando el bucle exterior tiene la etiqueta outer.

F

Formato de listas
El formato de listas convierte elementos de tipo cadena en texto legible con separadores y conectores elegidos según la configuración regional del lector.
Intl.ListFormat puede añadir «and» antes del último nombre de una lista en inglés estadounidense.
Formato de números
El formato de números convierte un número en texto para mostrarlo usando convenciones como los separadores decimales y de agrupación de la configuración regional.
Dar formato a 1234.5 con «de-DE» produce «1.234,5», una cadena que se muestra después de la ordenación numérica.
Función de comparación
Una función de comparación devuelve un número negativo, cero o positivo para determinar el orden relativo de dos valores durante la ordenación.
El comparador (a, b) => a - b coloca los valores numéricos menores antes que los mayores.
Función de devolución de llamada (callback)
Una función de devolución de llamada es una función que se pasa a otra que la invoca como parte de su trabajo, a menudo con cada elemento de un array.
Map llama a su función de devolución de llamada con un elemento y usa el valor devuelto en el array nuevo.
Función flecha
Una función flecha usa la sintaxis de flecha para definir una función, a menudo de forma compacta como parámetros seguidos de una expresión que se devuelve.
La función de devolución de llamada n => n * 2 recibe un número y devuelve un valor del doble.

I

Identidad del array
La identidad del array distingue un array de otro, incluso cuando ambos contienen actualmente los mismos valores en el mismo orden.
[1, 2] === [1, 2] es falso porque los literales crean dos arrays distintos.
Indicador booleano
Un indicador booleano es un valor booleano que registra si se ha cumplido una condición, como encontrar una coincidencia o detectar un fallo.
Un indicador de que todos aprobaron empieza en verdadero y cambia a falso cuando aparece una puntuación no aprobada.
Inicialización
La inicialización establece el estado inicial de un bucle; en un bucle for se ejecuta una vez antes de la primera comprobación de la condición.
En for (let i = 1; i <= 5; i++), la inicialización crea i con el valor inicial 1.
Inversión del orden
Una inversión del orden da la vuelta a la secuencia actual, del último al primero, sin comparar valores para establecer un orden numérico o alfabético.
Invertir [3, 1, 2] da [2, 1, 3], que no es una secuencia ordenada numéricamente.
Iterable
Un iterable proporciona una secuencia de valores que operaciones como for...of y la propagación pueden visitar en orden.
Los arrays y las cadenas son iterables, pero propagar el número 5 en un array lanza un TypeError.
Iteración
Una iteración es una ejecución del cuerpo de un bucle, que ocurre después de una comprobación satisfactoria de la condición en un bucle de conteo.
Mostrar los números desde 1 hasta 5, con una salida por cada ejecución del cuerpo, requiere cinco iteraciones.

Í

Índice
Un índice identifica una posición en un array; los elementos indexados ordinarios se cuentan desde cero hasta uno menos que la longitud.
El tercer elemento se lee con colors[2] porque los índices empiezan en cero, antes del índice uno.

L

Longitud del array
La longitud del array es el número de posiciones indexadas hasta el final del array, incluidos los huecos entre elementos asignados.
Asignar un valor al índice 4 en un array más corto hace que su longitud sea al menos cinco, aunque haya posiciones anteriores vacías.

M

Método entries
El método entries proporciona pares de índice y valor para recorrer un array, lo que permite leer ambas partes de la información juntas.
for (const [i, name] of names.entries()) puede mostrar etiquetas numeradas usando i + 1.
Método every
El método every devuelve verdadero cuando ningún elemento comprobado falla; se detiene ante un fallo y devuelve verdadero para un array vacío.
Combina una comprobación de longitud positiva con every cuando un resultado de que todos aprobaron deba incluir al menos una puntuación.
Método filter
El método filter devuelve los elementos originales cuya comprobación mediante una función de devolución de llamada es verdadera en contexto booleano y conserva su orden original.
Una comprobación t => t > 20 selecciona lecturas cálidas sin sustituirlas por valores booleanos.
Método find
El método find devuelve el primer elemento de un array que cumple la comprobación de una función de devolución de llamada, o undefined cuando no se encuentra ninguna coincidencia.
Buscar un número inferior a uno en [3, 0, 5] devuelve cero, una coincidencia válida pero falsa en contexto booleano.
Método findIndex
El método findIndex devuelve la primera posición de un array que cumple la comprobación de una función de devolución de llamada, o menos uno cuando ninguna la cumple.
Una posición encontrada se puede usar para eliminar después de comprobar que no sea el valor de ausencia de coincidencia -1.
Método join
El método join produce una cadena colocando un separador elegido entre las formas de texto de los elementos de un array.
["2026", "03", "15"].join("-") produce la cadena de fecha «2026-03-15».
Método localeCompare
El método localeCompare indica el orden relativo del texto según reglas regionales mediante el signo de su resultado numérico.
Un resultado negativo de a.localeCompare(b, "en") coloca a antes de b en esa comparación.
Método map
El método map almacena los resultados de una función de devolución de llamada en un array nuevo con la misma longitud que el array original.
Transformar distancias con km => km * 1000 construye las medidas correspondientes en metros.
Método reduce
El método reduce lleva un acumulador a través de las llamadas a una función de devolución de llamada y devuelve el resultado acumulado final.
Una reducción para sumar que empieza en cero añade cada temperatura y devuelve un total numérico.
Método slice
El método slice devuelve una copia superficial de un intervalo de un array sin modificar el original y excluye el índice final.
values.slice(1, 3) copia los valores de los índices uno y dos en un array nuevo.
Método some
El método some devuelve verdadero cuando al menos una comprobación de su función de devolución de llamada se cumple y se detiene en cuanto encuentra ese acierto.
Comprobar si alguna puntuación es inferior a cincuenta devuelve verdadero en la primera puntuación no aprobada.
Método splice
El método splice elimina o inserta elementos de un array in situ y devuelve un array con los elementos eliminados.
La llamada days.splice(2, 0, "Wed") inserta un día en el índice dos sin eliminar ningún día existente.
Método split
El método split crea un array de partes de texto al dividir una cadena donde aparece un separador especificado.
Dividir «4,8,15» por una coma produce tres cadenas que aún necesitan convertirse para sumarlas como números.
Métodos push y pop
Los métodos push y pop añaden y eliminan elementos del final de un array; push devuelve la nueva longitud, mientras que pop devuelve el elemento eliminado.
Una lista puede añadir un nombre al final con push y después eliminar ese último nombre con pop.
Métodos shift y unshift
Los métodos shift y unshift eliminan y añaden elementos al principio de un array, cambiando los índices de los elementos que permanecen.
Usar queue.shift() elimina el primer nombre de la cola y mueve el siguiente al índice cero.
Mutación
La mutación cambia el contenido o el orden de un array existente y hace que el cambio sea visible a través de todas las referencias a ese array.
Llamar a scores.push(95) muta scores incluso cuando la variable se declaró con const.

O

Orden ascendente
El orden ascendente coloca los valores de menor a mayor según la comparación elegida, como un comparador numérico basado en la resta.
Ordenar [10, 9, 1] numéricamente en orden ascendente da [1, 9, 10].
Ordenación estable
Una ordenación estable conserva el orden relativo original de los elementos que la función de comparación trata como iguales.
Las palabras de igual longitud conservan su orden anterior cuando se ordenan usando solo una comparación de longitud.
Ordenación in situ
Una ordenación in situ cambia el orden en el array existente y devuelve ese mismo array en lugar de crear uno independiente.
Después de const ordered = scores.sort(...), ordered y scores hacen referencia al mismo array.

P

Parámetro
Un parámetro es una entrada con nombre en la definición de una función; su posición determina qué argumento proporcionado recibe.
En una función de devolución de llamada de map (value, i), el segundo parámetro recibe el índice del elemento actual.
Parámetro de resto (rest)
Un parámetro de resto reúne en un array los argumentos restantes proporcionados a una función; la propagación en una llamada despliega valores en la dirección opuesta.
En function total(...nums), nums recopila los argumentos separados en un array.
Paso de reducción
Un paso de reducción usa el acumulador actual y un elemento para devolver el acumulador que recibe la siguiente llamada a la función de devolución de llamada.
Un paso de conteo devuelve count + 1 o el conteo sin cambios según la comprobación.
Posición vacía
Una posición vacía es un hueco indexado sin ningún elemento almacenado; contribuye a la longitud del array y se lee como undefined.
new Array(3) crea tres posiciones vacías, mientras que [3] crea un elemento almacenado explícitamente.
Predicado
Un predicado es una función usada como comprobación; su resultado decide si un elemento cumple una condición o debe conservarse.
El predicado n => n !== null conserva las lecturas válidas de cero y rechaza las lecturas null.
Prueba de pertenencia
Una prueba de pertenencia pregunta si un valor aparece en una colección y devuelve un booleano en lugar de una posición coincidente.
drinks.includes("tea") responde si esa cadena exacta en minúsculas está presente en el array.

R

Recorrido por índices
Un recorrido por índices visita un array mediante posiciones numéricas, lo que permite controlar la dirección, el tamaño del paso y el acceso a elementos vecinos.
Un recorrido hacia atrás empieza en arr.length - 1 y disminuye el índice mientras sea al menos cero.
Redondeo en coma flotante
El redondeo en coma flotante se produce cuando un número no puede almacenarse exactamente en binario, lo que afecta a los cálculos y a las comprobaciones de igualdad.
Sumar 0.1 diez veces produce 0.9999999999999999, así que se puede pasar por alto un extremo exacto de un bucle.
Referencia
Una referencia identifica un array compartido para que varias variables puedan acceder al mismo contenido sin que cada una tenga una copia independiente.
Después de const b = a, llamar a b.push(4) también cambia el array que se lee mediante a.

S

Sentencia break
Una sentencia break sale inmediatamente del bucle que la contiene, o de un bucle especificado mediante una etiqueta, y continúa la ejecución después de él.
Una búsqueda de la primera coincidencia usa break para que no se comprueben valores posteriores una vez almacenada la coincidencia.
Sentencia continue
Una sentencia continue omite el resto del código del cuerpo de la iteración actual y continúa por la ruta del siguiente paso del bucle.
Una comprobación de números pares puede usar continue para omitir la salida mientras el contador de un bucle for sí se actualiza.
Sintaxis de propagación (spread)
La sintaxis de propagación despliega los valores de un iterable en un literal de array o como argumentos separados en una llamada a función.
La expresión [...first, ...second] coloca los valores de ambos arrays en un array exterior nuevo.

T

Tabla de seguimiento
Una tabla de seguimiento registra los valores que cambian en pasos sucesivos de ejecución para poder seguir y comprobar el comportamiento de un bucle.
Las columnas de la lectura actual y la suma acumulada muestran exactamente qué iteración produce por primera vez un total incorrecto.
Terminación anticipada
La terminación anticipada finaliza un recorrido una vez determinado su resultado y evita comprobaciones posteriores que no pueden cambiar la respuesta.
Una búsqueda con find se detiene en su primera coincidencia, mientras que every se detiene en su primera comprobación fallida.

V

Valor de retorno
Un valor de retorno es el resultado que una función devuelve a quien la llamó; un cuerpo de bloque sin sentencia de retorno da undefined.
Una función de devolución de llamada de map con { n * 2; } calcula un producto, pero no lo devuelve para almacenarlo.
Valor inicial
Un valor inicial proporciona a reduce su acumulador inicial y se devuelve sin cambios cuando la entrada no tiene elementos que procesar.
Proporcionar 0 hace que una reducción de suma vacía devuelva cero en lugar de lanzar un TypeError.

Sobre esta unidad

Por StudeliInformar de un error

Crea tus propios Materiales de Estudio

Convierte tus notas, diapositivas y documentos en Guías de Estudio, Preguntas de Práctica, Flashcards y 6 herramientas más.

Comenzar