- Aprender
- Informática
- Programación
- Programación en JavaScript
- Variables y tipos en JavaScript
Variables y tipos en JavaScript: primeros pasos
let y const, y calcula con números, cadenas de caracteres y booleanos. Aprende cómo JavaScript convierte entre tipos para que resultados como "5" + 2, que da "52", dejen de sorprenderte. Toma decisiones con comparaciones, operadores lógicos, if/else y switch, y encuentra y corrige errores con la consola y el depurador del navegador.PrincipianteUnidad 1 de 9 del curso Curso de Programación en JavaScript
Lo que aprenderás
- Conecta JavaScript a una página HTML, controla cuándo se ejecuta el código y usa la consola del navegador para ejecutar código y ver su salida.
- Añade JavaScript a una página HTMLIncorpora scripts con el elemento
<script>, integrados en HTML o desde un archivo independiente, y elige dónde colocarlos y cómo cargarlos. - Escribe sentencias y usa la consolaEscribe sentencias y comentarios, ejecuta código en la consola del navegador y muestra resultados con
console.logy los cuadros de diálogo integrados del navegador.
- Añade JavaScript a una página HTML
- Declara variables con nombres claros, elige entre
letyconst, y predice dónde se puede usar cada variable.- Declara variables y asígnales nombresCrea variables con
letyconst, dales nombres válidos y legibles, y actualiza las que cambian. - Predice el ámbito y los errores que generan let y constPredice en qué parte del código se puede usar una variable, y reconoce y corrige los errores que producen
letyconst.
- Declara variables y asígnales nombres
- Identifica los tipos de datos de JavaScript, calcula correctamente con números y construye y modifica texto con cadenas de caracteres y literales de plantilla.
- Identifica tipos de datos con typeofNombra los tipos de datos de JavaScript, distingue
nulldeundefinedy comprueba el tipo de cualquier valor contypeof. - Calcula con números y operadores aritméticosUsa los operadores aritméticos y de asignación, aplica la precedencia de operadores, redondea resultados y reconoce los límites de la coma flotante y los valores numéricos especiales.
- Crea y modifica cadenas de caracteresEscribe literales de cadena de caracteres, incluye comillas y caracteres especiales, y usa la longitud, las posiciones de índice y los métodos comunes de las cadenas.
- Construye texto con literales de plantillaInserta valores y expresiones en texto con cadenas entre acentos graves, escribe texto de varias líneas y da formato a números dentro de mensajes.
- Identifica tipos de datos con typeof
- Convierte valores de forma explícita con
Number(),String()yBoolean(), y predice las conversiones automáticas que JavaScript realiza en operadores y condiciones.- Convierte valores de forma explícitaConvierte texto en números y otros valores en cadenas de caracteres o booleanos, y comprueba si una conversión funcionó.
- Predice la conversión implícita de tiposPredice los resultados de aplicar operadores a tipos mezclados y usa de forma deliberada valores verdaderos y falsos en contexto booleano.
- Convierte valores de forma explícita
- Compara valores correctamente, combina condiciones con operadores lógicos y elige qué código se ejecuta con
if,else, el operador condicional yswitch.- Compara valoresUsa los operadores de comparación para producir
trueofalse, y predice comparaciones de cadenas de caracteres, tipos mezclados,null,NaNy decimales. - Combina condiciones con operadores lógicosUne e invierte condiciones con
&&,||y!, usa la evaluación en cortocircuito y proporciona valores predeterminados con||y??. - Elige rutas de ejecución con if, else, el operador condicional y switchEscribe cadenas de condiciones
if,else ifyelse, elige valores con el operador condicional y maneja casos fijos conswitch.
- Compara valores
- Lee mensajes de error, sigue valores mediante la salida de la consola y pausa el código en el depurador del navegador para ver exactamente qué hace.
- Lee mensajes de error y sigue los valores con la consolaDistingue los errores de sintaxis, de ejecución y lógicos, interpreta lo que dice un mensaje de error y usa los valores mostrados para encontrar dónde se produce un resultado incorrecto.
- Pausa y ejecuta el código paso a paso con el depuradorEstablece puntos de interrupción, ejecuta el código línea por línea e inspecciona los valores de las variables mientras el código está pausado.
- Lee mensajes de error y sigue los valores con la consola
Guía de estudio de Variables y tipos en JavaScript
1Ejecuta un script y observa su salida
Un navegador puede ejecutar un cálculo en cuanto cargas una página, pero el código necesita un lugar donde estar y una forma de mostrar su resultado. Conecta un script a HTML, elige cuándo se ejecuta y usa la consola para ver sus mensajes. Pequeños experimentos en la consola te ayudarán a aprender el lenguaje antes de modificar los elementos de la página. También conocerás la diferencia entre el valor de una expresión y un mensaje mostrado por un programa.
1.1 Conecta JavaScript a HTML
HTML da estructura a una página, CSS controla su aspecto y JavaScript añade comportamiento. El motor de JavaScript de un navegador ejecuta las instrucciones de un script. A menos que una decisión cambie la ruta, esas instrucciones se ejecutan de arriba abajo.
Coloca código en la página o en un archivo independiente
Un script integrado en HTML contiene JavaScript entre las etiquetas de apertura y cierre:
<script>
console.log("Hello from the page");
</script>
Un script externo guarda el JavaScript en un archivo .js independiente. Este HTML lo carga:
<script src="js/app.js"></script>
El archivo externo contiene console.log("Hello from the page"); sin etiquetas <script>. Separar los archivos mantiene el HTML legible, permite que varias páginas compartan código y que el navegador guarde el script en caché. Cuando src está presente, se ignora el código dentro del mismo elemento. Usa un solo método por elemento y escribe siempre la etiqueta de cierre </script>: un <script ... /> de cierre automático no cierra el elemento en HTML.
Elige cuándo se ejecuta el script
Un script clásico sin atributo de carga detiene el análisis sintáctico de HTML mientras el navegador lo carga y ejecuta. En <head>, se ejecuta antes de que se haya construido el contenido posterior del cuerpo. Colocarlo justo antes de </body> sitúa el contenido de la página antes que él.
Para un script clásico externo en <head>, defer es una opción predeterminada útil:
<script src="js/app.js" defer></script>
El navegador descarga el script mientras sigue analizando el HTML. Ejecuta el script cuando termina el análisis. Varios scripts diferidos se ejecutan en su orden en el HTML, por lo que un segundo script puede usar valores establecidos por el primero.
| Opción de carga | Cuándo se ejecuta el script | Orden de varios scripts |
|---|---|---|
| Clásico, sin atributo | Cuando el análisis llega a él, después de la carga | Orden del HTML |
defer | Después del análisis de HTML | Orden del HTML |
async | En cuanto termina su descarga | Orden de finalización de las descargas |
Usa async para código independiente que no dependa de que la página esté lista ni de otro script. Añadir defer a un script clásico integrado en HTML no tiene efecto.
Carga un módulo
<script type="module" src="js/main.js"></script>
Un módulo se difiere por defecto y se ejecuta en modo estricto. Puede compartir código mediante import y export. Para cargar módulos en Chrome o Firefox, sirve el proyecto con un servidor de desarrollo local, como la función de servidor en vivo de un editor. Abrir la página en una dirección file:// provoca restricciones en la carga de módulos.
Comprueba la conexión
Supón que index.html está junto a una carpeta js que contiene greet.js. Pon console.log("Page ready"); en ese script y <script src="js/greet.js" defer></script> en el head del HTML. Abre la página y luego su consola: el mensaje es «Page ready».
La ruta relativa comienza en la carpeta del archivo HTML. Con esta organización, src="greet.js" apunta al lugar equivocado. Un mensaje de archivo no encontrado significa que no hay ningún script que ejecutar en esa dirección. Si copiaste las etiquetas HTML en el archivo JavaScript, el motor indica un error de sintaxis en el marcado.
Puntos clave
- Un script externo usa
src; su archivo JavaScript contiene código sin etiquetas HTML. - Una ruta relativa de script comienza en la carpeta del archivo HTML.
- Un script clásico externo diferido se ejecuta después del análisis; los scripts diferidos conservan el orden del HTML.
- Un script async se ejecuta en cuanto está listo, por lo que los scripts dependientes necesitan otra opción de carga.
- Los módulos se difieren por defecto y usan el modo estricto.
- Un elemento script necesita una etiqueta de cierre
</script>.
1.2 Escribe instrucciones e inspecciona la consola
La consola del navegador muestra mensajes, errores y los resultados del código que escribes. Abre la consola de la página que estás probando. En Chrome o Edge, usa Ctrl+Shift+J en Windows/Linux o Cmd+Option+J en Mac. En Firefox, usa Ctrl+Shift+K o Cmd+Option+K. F12 abre las herramientas de desarrollo completas en Chrome y Edge.
Sentencias y expresiones
Una expresión produce un valor: 4 + 5 produce 9. Una sentencia da una instrucción, como almacenar ese valor o mostrarlo:
let total = 4 + 5;
console.log("Total:", total);
La primera línea se ejecuta antes que la segunda, que muestra «Total: 9». Un punto y coma termina una sentencia. JavaScript puede insertar muchos puntos y comas omitidos, pero los saltos de línea no siempre funcionan como separadores. Termina las sentencias con punto y coma para dejar clara la estructura deseada.
Escribe 2 + 3 en la consola y pulsa Enter para ver 5. Usa Shift+Enter para una línea nueva sin ejecutar lo escrito. Si introduces let x = 5;, la consola puede mostrar undefined como resultado de esa sentencia. Esto no significa que x contenga undefined: al introducir x a continuación se muestra 5. Del mismo modo, una llamada a console.log() muestra su mensaje y devuelve undefined.
Nombres y comentarios
JavaScript distingue entre mayúsculas y minúsculas. console.log("Hi"); funciona, pero Console.log("Hi"); se refiere a un nombre diferente y genera ReferenceError. console.Log("Hi"); encuentra console, pero falla con TypeError porque no existe un método Log al que se pueda llamar.
Los comentarios están dirigidos a quienes leen el código. El motor los omite:
// Keep the starting value for the next calculation.
let total = 4;
/* A comment can also
continue on another line. */
console.log(total);
Poner // antes de una sentencia desactiva temporalmente esa línea. Un comentario útil explica una razón que el código por sí solo no aclara.
Mensajes, advertencias y experimentos
console.log("Total:", 9); muestra sus argumentos separados por espacios. console.warn() marca una advertencia; console.error() marca un mensaje de error. Mostrar un mensaje con console.error() no genera por sí mismo una excepción. console.clear() limpia la pantalla.
Las entradas de la consola son experimentos, no ediciones guardadas. Al recargar se vuelven a ejecutar los scripts guardados de la página. Puedes inspeccionar en la consola las variables de nivel superior de los scripts clásicos; las variables de nivel superior de un módulo permanecen dentro de ese módulo.
Cuadros de diálogo sencillos y modo estricto
alert("Saved!"); muestra un mensaje. confirm("Continue?") devuelve true para Aceptar y false para Cancelar. prompt("Quantity?", "1") devuelve la cadena de caracteres introducida, o null para Cancelar. Escribir 12 da "12", no 12. Estos cuadros de diálogo pausan la interacción mientras están abiertos.
Pon "use strict"; al inicio de un script clásico para que ciertos errores se notifiquen. Por ejemplo, totl = 5; sin declaración genera ReferenceError en modo estricto; en un script clásico sin modo estricto puede crear una variable global accidental. Un módulo ya usa el modo estricto. Comprueba la escritura y declara los nombres antes de asignarles valores.
Puntos clave
- La entrada en la consola evalúa expresiones y
console.log()muestra mensajes. - El
undefinedmostrado por una declaración es distinto del valor almacenado en su variable. - Los nombres distinguen entre mayúsculas y minúsculas; los comentarios se omiten durante la ejecución.
prompt()devuelve texto onull, yconfirm()devuelve un booleano.- El modo estricto notifica como errores las asignaciones a nombres no declarados.
2Almacena valores y controla dónde funcionan los nombres
Las variables dan nombres a los valores que el resto del programa puede usar. Elegir const o let indica a quien lee el código si se reasignará un nombre. También importa dónde declares una variable: un valor creado dentro de un bloque puede no estar disponible fuera de él. Sigue un pequeño total acumulado y después recorre bloques anidados para ver a qué variable se refiere cada nombre y por qué los errores de declaración producen mensajes distintos.
2.1 Declara, asigna y actualiza valores
Una variable es un nombre que hace referencia a un valor. Puedes declarar primero el nombre y asignar su valor después, o hacer ambas cosas en una sentencia. El operador de asignación = almacena el valor de la derecha en el nombre de la izquierda.
Elige let o const
let score;
console.log(score); // undefined
score = 10;
score = score + 2;
console.log(score); // 12
let score; declara la variable. Hasta que una asignación le dé otro valor, contiene undefined. La siguiente asignación almacena 10. En score = score + 2;, JavaScript lee la puntuación anterior, suma 2 y después almacena 12. Esta es una instrucción de actualización, por lo que no tiene por qué tener sentido como ecuación matemática. La reasignación usa el nombre existente sin volver a escribir let.
Una declaración const debe incluir su valor inicial:
const BOILING_POINT_C = 100;
La declaración const rate; es un error de sintaxis porque carece de un inicializador. Intentar asignar un valor nuevo a BOILING_POINT_C más adelante genera un TypeError.
| Declaración | ¿Necesita un valor inicial? | ¿Se puede reasignar el nombre? |
|---|---|---|
let | No | Sí |
const | Sí | No |
Usa const por defecto. Elige let para un total acumulado, un contador o un resultado que asignarán sentencias posteriores. Un valor calculado a partir de otros valores también puede usar const si el programa nunca reasigna ese nombre.
Da al nombre un significado claro
Los nombres pueden contener letras, dígitos, _ y $; no pueden empezar por un dígito. place1 es válido, pero 1stPlace no lo es. Los espacios están prohibidos y un guion se interpreta como una resta, por lo que total-price no nombra una sola variable. Las palabras reservadas como if, return y class no pueden ser nombres de variables.
Usa la notación camelCase para nombres comunes: itemCount, firstName o priceWithTax. Los nombres booleanos como isLoggedIn y hasDiscount describen un valor de sí o no. Incluye unidades cuando eviten confusiones: distanceKm y durationMin. Los valores fijos conocidos antes de ejecutar el programa suelen usar UPPER_SNAKE_CASE, como MAX_LOGIN_ATTEMPTS. Las mayúsculas y minúsculas importan: total y Total son nombres distintos.
Sigue un total acumulado
const TAX_RATE = 0.2;
let total = 0;
total = total + 12.5;
total = total + 7.5;
const totalWithTax = total * (1 + TAX_RATE);
console.log(totalWithTax); // 24
El total comienza en 0, pasa a 12.5 y después a 20. El multiplicador 1 + TAX_RATE es 1.2, por lo que el importe final es 24. Solo total necesita reasignarse. La tasa del impuesto y el importe final calculado usan const.
Si escribes let total = 7.5; una segunda vez en el mismo ámbito, estás intentando declarar una segunda variable, no actualizar la primera. Usa total = 7.5; para sustituir el valor.
Reconoce declaraciones antiguas
El código antiguo suele usar var. Sigue funcionando, pero sus variables pertenecen a una función o un script en vez de a un bloque anidado ordinario. Permite declaraciones repetidas y las lecturas antes de la declaración producen undefined. Los modernos let y const detectan estos errores. Ten presentes sus reglas cuando leas un tutorial antiguo que use var.
Puntos clave
=calcula el lado derecho y después almacena su valor bajo el nombre de la izquierda.- Usa
constpor defecto yletcuando el código vaya a reasignar el nombre. - Una declaración
constrequiere un valor inicial. - Reasigna una variable existente sin repetir la palabra clave de su declaración.
- Los nombres descriptivos en camelCase pueden mostrar el significado y las unidades.
2.2 Sigue el ámbito y diagnostica errores de declaración
Un bloque es el código entre llaves, como el cuerpo de un if. El ámbito de una variable es la región donde su nombre se refiere a esa variable. Tanto let como const tienen ámbito de bloque, incluidos los bloques anidados dentro del bloque en que se declaran.
Mantén un resultado donde se necesite
const temperatureC = 31;
let label;
if (temperatureC > 30) {
label = "hot";
} else {
label = "mild";
}
console.log(label); // hot
label se declara fuera de las ramas, por lo que la última línea puede leerla. Cada rama asigna un valor a la variable existente. Si en su lugar declaras const label = "hot"; dentro de la primera rama, esa variable no se puede leer después del bloque. Si no hay otra label en el ámbito, la lectura final genera ReferenceError.
Una declaración de nivel superior en un script clásico tiene ámbito global: pueden usarla el código posterior de ese script y los demás scripts clásicos de la página. En un módulo, las variables de nivel superior pertenecen a ese módulo. Mantén una variable en el ámbito más pequeño que la necesite para reducir los conflictos de nombres.
Distingue el sombreado de variables de la reasignación
let x = 1;
{
let x = 2;
console.log(x); // 2
}
console.log(x); // 1
La declaración interna crea una variable independiente. Esto es sombreado de variables: dentro del bloque interno, x se refiere a la variable interna. La variable externa sigue siendo 1. En cambio, eliminar el let interno asignaría 2 a la variable externa. Los nombres distintos hacen que esta diferencia sea más fácil de leer.
Lee antes de la inicialización
Un enlace con ámbito de bloque abarca todo su bloque, pero no se puede acceder a él antes de que la declaración lo inicialice. La región anterior a la inicialización es la zona muerta temporal:
console.log(price);
let price = 5;
Esto genera ReferenceError: Cannot access 'price' before initialization. El nombre existe en el ámbito, pero no está listo. En comparación, price is not defined significa que no se encuentra allí ningún enlace con ese nombre. Una declaración interna también sombrea un nombre externo antes de la línea de declaración interna; el valor externo no puede eludir la zona muerta temporal de la variable interna.
Relaciona cada error con una solución
| Problema | Tipo de error | Solución |
|---|---|---|
const rate; | SyntaxError | Proporciona un valor inicial |
Un segundo let total en un mismo ámbito | SyntaxError | Asigna sin otro let |
| Leer antes de la inicialización | ReferenceError | Inicializa antes de la lectura |
| Leer un nombre desconocido o fuera de ámbito | ReferenceError | Corrige el nombre o mueve su declaración |
Reasignar un const | TypeError | Usa let si se necesita reasignación |
Los errores de sintaxis impiden que ese script comience. Un error en tiempo de ejecución detiene la ejecución actual cuando llega a la sentencia que falla. Chrome permite otra declaración let en una entrada de consola independiente por comodidad; esto no hace que las declaraciones duplicadas sean válidas en un script.
Const fija la referencia
Los valores primitivos como los números y las cadenas de caracteres no pueden cambiar directamente. El contenido de un objeto puede cambiar incluso cuando su nombre usa const:
const settings = { theme: "dark" };
settings.theme = "light"; // allowed
El nombre sigue haciendo referencia al mismo objeto. Asignar settings = {}; intenta sustituir esa referencia y genera TypeError.
Puntos clave
- Los nombres declarados con
letyconsttienen el ámbito del bloque que los contiene. - Declara un resultado compartido antes de las ramas que le asignan un valor.
- El sombreado de variables crea una variable independiente; la reasignación cambia la existente.
- Una lectura en la zona muerta temporal falla aunque el enlace exista en ese ámbito.
- Las declaraciones duplicadas son errores de sintaxis, mientras que la reasignación de un
constes unTypeErroren tiempo de ejecución. - El contenido de un objeto
constpuede modificarse sin reasignar el nombre.
3Calcula con valores y construye texto
El tipo de un valor ayuda a explicar qué hará una operación. Los números permiten hacer cálculos, las cadenas de caracteres contienen texto y los booleanos contienen true o false. Aprende a inspeccionar esos tipos, controlar el orden de las operaciones aritméticas y almacenar los resultados de los métodos de cadenas. Después, los literales de plantilla te permiten combinar valores en mensajes legibles. La salida exacta de la consola mostrará las diferencias de comportamiento entre texto, números, redondeo y formato.
3.1 Identifica el tipo de un valor
Los valores 7, "7" y true tienen tipos diferentes. Pueden aparecer en lugares similares de una página, pero JavaScript aplica reglas distintas a cada uno. Un tipo describe el valor que contiene actualmente una variable, no una restricción permanente de esta.
Empieza por los tres tipos principales
Un número representa valores numéricos enteros y decimales: 42, -7 y 3.75 tienen el mismo tipo. La notación científica también es numérica: 1e3 significa 1000. Una cadena de caracteres contiene texto entre comillas, por lo que "42" es texto aunque sus caracteres sean dígitos. Un booleano es exactamente true o false, sin comillas. Las comparaciones producen booleanos que un programa puede usar para tomar decisiones.
Usa typeof para inspeccionar un valor. Devuelve una cadena de caracteres que indica el tipo:
console.log(typeof 7); // number
console.log(typeof "7"); // string
console.log(typeof true); // boolean
console.log(typeof undefined); // undefined
Los comentarios muestran las palabras que se imprimen; los resultados en sí son cadenas de caracteres como "number".
Reconoce valores ausentes
let city;
let middleName = null;
console.log(city); // undefined
console.log(middleName); // null
undefined suele significar que JavaScript no ha recibido un valor, como ocurre con un let sin inicializar. null suele asignarse deliberadamente para indicar «vacío» o «sin valor». Comprueba si un valor está vacío de forma deliberada con middleName === null.
No uses typeof value === "object" para comprobar si un valor es null. typeof null da "object" debido a un comportamiento histórico del lenguaje, aunque null es un valor primitivo.
Conoce la lista completa de tipos
JavaScript tiene siete tipos primitivos: number, string, boolean, undefined, null, bigint y symbol. El octavo tipo es object, que se usa para valores estructurados. Las funciones son objetos a los que se puede llamar, aunque typeof devuelve "function" para ellas.
Un bigint es un número entero escrito con una n al final, como 9007199254740993n. Permite representar enteros grandes de forma exacta. No mezcles un bigint y un number en operaciones aritméticas: 1n + 2 genera TypeError. Un symbol es un identificador único; typeof Symbol("id") da "symbol". typeof 42n da "bigint".
NaN es otro resultado especial que debes reconocer: a pesar de su nombre, «no es un número», typeof NaN es "number". Es un valor numérico que indica un resultado numérico no válido. Su nombre por sí solo no identifica un tipo distinto.
Sigue una variable que cambia
let data = 42;
console.log(typeof data); // number
data = "forty-two";
console.log(typeof data); // string
Esto es tipado dinámico. La reasignación puede sustituir un número por una cadena de caracteres. Esa flexibilidad hace útil mostrar tanto el valor como su tipo cuando un resultado sorprende:
const input = "7";
console.log(input, typeof input); // 7 string
console.log(input + 1); // 71
console.log(7 + 1); // 8
La primera suma une texto; la segunda suma números. Los valores primitivos no pueden cambiar directamente: una operación crea un valor nuevo. Actualizar una variable cambia el valor al que se refiere.
Puntos clave
- Los valores tienen tipos; una variable
letpuede contener distintos tipos después de una reasignación. typeofdevuelve una cadena de caracteres que indica el tipo de un valor.undefinedsuele significar que no se asignó un valor;nullsuele indicar una ausencia deliberada.typeof nulles"object", ytypeof NaNes"number".
3.2 Controla las operaciones aritméticas y los resultados numéricos
JavaScript usa un único tipo numérico ordinario para valores enteros y decimales. La división conserva la parte fraccionaria: 10 / 4 da 2.5. Tanto el operador que eliges como el orden en que se ejecuta afectan al resultado.
Calcula en el orden deseado
| Operador | Significado | Ejemplo |
|---|---|---|
+, - | Sumar, restar | 8 - 3 da 5 |
*, / | Multiplicar, dividir | 7 / 2 da 3.5 |
% | Resto | 17 % 5 da 2 |
** | Potencia | 2 ** 3 da 8 |
Las potencias se ejecutan antes que la multiplicación, la división y el resto; estas operaciones se ejecutan antes que la suma y la resta. Los operadores del mismo nivel se ejecutan de izquierda a derecha, salvo las potencias, que se agrupan de derecha a izquierda: 2 ** 3 ** 2 es 2 ** 9, o 512. Los paréntesis cambian ese orden: 2 + 3 * 4 da 14, pero (2 + 3) * 4 da 20.
Para calcular la media de 72, 85 y 90, suma todo el grupo antes de dividir:
const average = (72 + 85 + 90) / 3;
console.log(average); // 82.33333333333333
Sin paréntesis, 72 + 85 + 90 / 3 solo divide 90 y da 187.
Separa las unidades enteras y los restos
Math.trunc(7 / 2) elimina la parte fraccionaria y da 3. Para una longitud positiva de 245 cm, Math.floor(245 / 100) da 2 metros, y 245 % 100 da 45 centímetros restantes. Del mismo modo, 3725 segundos dan 1 hora con Math.floor(3725 / 3600), 2 minutos con Math.floor((3725 % 3600) / 60) y 5 segundos con 3725 % 60. Para un entero, n % 2 === 0 comprueba si es par. Un resto tiene el signo del operando izquierdo: -7 % 3 da -1.
Actualiza un número
x += 5 significa x = x + 5. Los operadores -=, *=, /=, %= y **= siguen el mismo patrón. Partiendo de 10, las actualizaciones += 5, *= 2, -= 4 y luego /= 2 dan 15, 30, 26 y luego 13.
++ aumenta en uno y -- disminuye en uno. Con let a = 5; let b = a++;, a pasa a ser 6, pero b recibe 5: el incremento posfijo devuelve el valor anterior. Con let b = ++a;, partiendo de nuevo de a = 5, ambos pasan a ser 6. Una actualización en su propia línea evita depender del resultado de esa expresión.
Redondea y da formato de forma deliberada
| Herramienta | Regla del resultado | Ejemplo |
|---|---|---|
Math.round() | Entero más cercano; mitades hacia el infinito positivo | Math.round(-2.5) da -2 |
Math.floor() | Hacia abajo, hacia el infinito negativo | Math.floor(-2.5) da -3 |
Math.ceil() | Hacia arriba, hacia el infinito positivo | Math.ceil(2.1) da 3 |
Math.trunc() | Elimina la fracción hacia cero | Math.trunc(-2.7) da -2 |
Math.round(13.456 * 100) / 100 da el número 13.46. En cambio, (3.14159).toFixed(2) da la cadena de caracteres "3.14", y (19.999).toFixed(2) da "20.00". Da formato al final: añadir un número a una cadena con formato une texto.
Reconoce los límites numéricos
Los números usan coma flotante binaria de 64 bits. La mayoría de las fracciones decimales son aproximadas, por lo que 0.1 + 0.2 es 0.30000000000000004. Redondea para mostrar el resultado, compara con una tolerancia pequeña adecuada o calcula en unidades enteras como centavos o milímetros.
Algunas operaciones no válidas devuelven un valor en vez de generar un error: 5 / 0 es Infinity, -5 / 0 es -Infinity, y 0 / 0 o "abc" * 2 es NaN. La mayoría de las operaciones aritméticas con NaN siguen dando NaN; NaN ** 0 es una excepción y da 1.
Todos los enteros hasta Number.MAX_SAFE_INTEGER, 9007199254740991, son exactos. Más allá, solo se pueden representar algunos enteros: 9007199254740992 + 1 sigue dando 9007199254740992. Los bigints permiten representar enteros exactos más grandes.
Puntos clave
- Los paréntesis permiten usar toda una suma como entrada de una división.
%da un resto; la división por sí sola conserva la fracción.- El incremento posfijo devuelve el valor anterior; el incremento prefijo devuelve el nuevo.
- Floor, ceil, round y trunc difieren para valores negativos.
toFixed()produce texto para mostrar.- Las operaciones decimales pueden ser aproximadas, incluso con entradas que parecen sencillas.
NaNy los infinitos son valores especiales del tipo number.
3.3 Lee, busca y transforma texto
Una cadena de caracteres almacena texto entre comillas simples, comillas dobles o acentos graves que coinciden. Para texto sin más, las tres formas pueden representar el mismo valor. Las comillas marcan dónde comienza y termina el texto; no forman parte de ese valor.
Comillas, secuencias de escape y unión
Usa el otro tipo de comillas para incluir una comilla: "It's late". Una secuencia de escape usa una barra invertida, como en 'It\'s late'. \n representa un salto de línea, \t un tabulador y \\ una barra invertida. La secuencia de escape \n ocupa una posición en la cadena, aunque se escriba con dos símbolos. "It's".length es 4; "Line 1\nLine 2".length es 13.
El operador + concatena cadenas de caracteres. "Hello" + " " + "world" da "Hello world"; no se inserta ningún espacio a menos que uno de los fragmentos lo contenga. Con let msg = "Hi"; msg += " there";, el valor actualizado es "Hi there".
Las posiciones empiezan en cero
const language = "JavaScript";
console.log(language.length); // 10
console.log(language[0]); // J
console.log(language[4]); // S
console.log(language[9]); // t
console.log(language.at(-1)); // t
console.log(language[10]); // undefined
El último índice es length - 1. Un argumento negativo para at() cuenta desde el final. length es una propiedad, no un método: language.length() genera TypeError. Más precisamente, las posiciones de las cadenas y length usan unidades de código UTF-16, las unidades que JavaScript usa para almacenar texto. Cada una de estas letras inglesas ordinarias ocupa una unidad; algunos símbolos y emojis ocupan más.
Guarda la cadena nueva
Las cadenas de caracteres son inmutables: su contenido no puede editarse directamente. Asignar word[0] = "b" cuando word es "cat" no crea "bat"; en modo estricto genera un error. Los métodos que transforman texto devuelven una cadena nueva:
let name = "ana";
name.toUpperCase();
console.log(name); // ana
name = name.toUpperCase();
console.log(name); // ANA
Llamar al método no basta para conservar su resultado. Escribir name.toUpperCase sin paréntesis ni siquiera lo llama.
Elige la operación de texto adecuada
toLowerCase() y toUpperCase() cambian entre mayúsculas y minúsculas; trim() elimina espacios en blanco en ambos extremos. El encadenamiento aplica cada método al resultado anterior: " Ana@Example.com ".trim().toLowerCase() da "ana@example.com".
includes(), startsWith() y endsWith() devuelven booleanos. Por ejemplo, "report.pdf".endsWith(".pdf") da true. indexOf() da la primera posición que coincide o -1: "JavaScript".indexOf("S") da 4, pero buscar "s" da -1. Las búsquedas distinguen entre mayúsculas y minúsculas. "JavaScript".includes("script") es false; convierte a minúsculas antes de esa búsqueda para obtener true.
slice(start, end) devuelve texto desde el índice inicial hasta el índice final, sin incluirlo. "JavaScript".slice(0, 4) da "Java"; .slice(4) y .slice(-6) dan "Script".
"a-b-c".replace("-", "+") da "a+b-c"; replaceAll() con los mismos argumentos da "a+b+c". "ab".repeat(3) da "ababab", y "5".padStart(3, "0") da "005". Para const city = "paris";, city[0].toUpperCase() + city.slice(1) produce "Paris" al unir una primera letra mayúscula al resto sin modificar.
Puntos clave
- Las cadenas de caracteres necesitan comillas que coincidan, y la concatenación no añade espacios por sí sola.
- El primer índice es cero y el índice de la última letra ordinaria es
length - 1. lengthes una propiedad; los métodos se llaman con paréntesis.- Los métodos de transformación producen cadenas de caracteres nuevas, así que guarda sus resultados.
- Las búsquedas en cadenas de caracteres distinguen entre mayúsculas y minúsculas.
slice()excluye su índice final.
3.4 Inserta valores en mensajes legibles
Un literal de plantilla coloca texto entre acentos graves. Dentro de él, ${...} marca un marcador de posición cuya expresión se evaluará e insertará en el texto. Esto es útil cuando un mensaje combina varios valores con signos de puntuación, espacios o cálculos.
Interpreta un marcador de posición como una expresión
const name = "Ana";
const greeting = `Hello, ${name}!`;
console.log(greeting); // Hello, Ana!
El motor lee name, obtiene "Ana" y lo coloca entre el saludo y el signo de exclamación. Los acentos graves y los símbolos del marcador de posición describen la cadena de caracteres; no aparecen en el mensaje resultante.
Con concatenación, la misma idea es "Hello, " + name + "!". Un mensaje más largo como "Hello, " + name + "! You have " + count + " new messages." requiere varios fragmentos entre comillas por separado. Una plantilla mantiene toda la frase unida: `Hello, ${name}! You have ${count} new messages.`. Los espacios siguen teniendo que escribirse donde los quieras.
Calcula y luego da formato dentro del marcador
const name = "Ana";
const tickets = 3;
const price = 4.5;
const receipt = `${name} bought ${tickets} tickets for ${(tickets * price).toFixed(2)} in total.`;
console.log(receipt);
La salida es «Ana bought 3 tickets for 13.50 in total.». Primero, tickets * price produce 13.5. Los paréntesis hacen que todo ese producto sea el objeto receptor de .toFixed(2), que produce "13.50". El marcador de posición inserta ese texto en la frase. Las variables numéricas price y tickets permanecen sin cambios.
Sin formato, un marcador de posición muestra la forma textual habitual del número. `${0.1 + 0.2}` da "0.30000000000000004". Darle formato dentro del marcador, `${(0.1 + 0.2).toFixed(2)}`, da "0.30".
Las expresiones sirven; las sentencias no
Un marcador de posición puede contener un valor, un cálculo, una llamada a un método o una expresión que elige un valor. Con birthYear = 1990, `You turn ${2026 - birthYear} this year.` da «You turn 36 this year.».
El operador condicional puede seleccionar texto en singular o plural:
const count = 1;
console.log(`You have ${count} ${count === 1 ? "item" : "items"}`);
// You have 1 item
La comparación elige una cadena de caracteres para insertar. Una sentencia if no puede sustituir esa expresión dentro de ${...} porque un marcador de posición necesita una expresión que produzca un valor.
Conserva la puntuación exacta
Solo los acentos graves activan los marcadores de posición. Con const n = 5;, "n + 1 = ${n + 1}" es texto normal y deja ${n + 1} sin cambios. La plantilla `n + 1 = ${n + 1}` da «n + 1 = 6». Un acento grave es un carácter distinto de una comilla simple.
Los saltos de línea escritos entre acentos graves se convierten en saltos de línea en la cadena resultante. Los espacios de sangría también pasan a formar parte de ella. Los valores ausentes se insertan como texto: `${undefined}` da "undefined", mientras que `${null}` da "null". Si un mensaje contiene inesperadamente «undefined», inspecciona la variable insertada y dónde se le asignó un valor.
Puntos clave
- Los acentos graves activan los marcadores de posición
${...}. - Un marcador de posición evalúa una expresión e inserta su forma textual.
- Da formato a un número calculado dentro de su marcador de posición cuando el mensaje necesite decimales fijos.
- Las cadenas entre comillas dejan los símbolos de los marcadores de posición sin cambios.
- Los saltos de línea y la sangría de una plantilla pasan a formar parte de la cadena de caracteres.
4Convierte datos de entrada y predice cambios automáticos
El texto introducido por un usuario a menudo debe convertirse en número para que un cálculo funcione. JavaScript también convierte valores por sí mismo, y su regla de suma puede convertir un total esperado en texto unido. Aprende a elegir una conversión, comprobar si faltan datos o no son válidos y seguir una expresión en el orden de evaluación. Después, esos mismos valores tendrán sentido cuando se usen como condiciones en vez de números.
4.1 Convierte datos de entrada sin perder su significado
La conversión explícita significa que escribes la conversión tú mismo, con una herramienta como Number(), String() o Boolean(). Esto hace visible el tipo deseado en el punto donde un valor entra en el cálculo.
Elige una conversión numérica
Number() lee todo el texto como un número e ignora los espacios en blanco que lo rodean. Number("1.5") da 1.5, y Number(" 12 ") da 12. Number("12px") da NaN porque no toda la cadena de caracteres es numérica. El código usa un punto decimal: Number("1,5") también da NaN.
parseInt() y parseFloat() leen un inicio numérico y se detienen cuando el texto deja de encajar. parseInt("12px", 10) da 12; parseFloat("3.75 kg") da 3.75. El analizador de enteros se detiene en el punto decimal, por lo que parseInt("0.5", 10) da 0. parseInt("abc", 10) da NaN porque no hay un inicio numérico. Pasa una base a parseInt(): parseInt("08", 10) da 8, mientras que parseInt("ff", 16) lee hexadecimal y da 255.
El operador más unario también convierte texto numérico ordinario: +"42" da 42.
Mantén la entrada ausente separada del cero
Un cuadro de entrada devuelve una cadena de caracteres o null. Cancelar devuelve null, y aceptar un cuadro vacío devuelve "". Ambos se convierten en cero con Number(), al igual que el texto que solo contiene espacios en blanco. Comprueba si falta una respuesta antes de convertir:
const input = prompt("Enter a quantity:");
if (input === null || input.trim() === "") {
console.log("No quantity entered.");
} else {
const quantity = Number(input);
if (Number.isNaN(quantity)) {
console.log("Please type a number.");
} else {
console.log(quantity + 1);
}
}
El operador || omite la llamada a trim() cuando input es null. Escribir «12» lleva al cálculo numérico y muestra 13. Escribir «12px» lleva al mensaje de número no válido. Escribir «0» es una respuesta válida y muestra 1.
Usa Number.isNaN(value) para comprobar si hay un valor NaN real. value === NaN nunca se cumple. La función global más antigua isNaN() convierte primero su argumento: isNaN("hello") es true, pero Number.isNaN("hello") es false porque ese valor sigue siendo una cadena de caracteres.
Convierte a texto o a booleano
String(42) da "42", String(true) da "true" y String(null) da "null". (42).toString() también produce "42", pero llamar a .toString() sobre null o undefined genera TypeError. String() maneja ambos.
Boolean() devuelve false para false, 0, -0, 0n, "", null, undefined y NaN; estos son valores falsos en contexto booleano. Los navegadores también tienen el objeto heredado document.all, que es falso en contexto booleano. Los demás valores son verdaderos en contexto booleano. En particular, "0", "false" y una cadena que contiene un solo espacio son todos verdaderos en contexto booleano. !!value da la misma conversión booleana.
Para dos respuestas de un cuadro de entrada, "12" y "30", a + b produce "1230". Convierte primero ambas entradas: Number(a) + Number(b) da 42.
Puntos clave
Number()espera que toda la cadena de caracteres sea numérica; los analizadores pueden leer un prefijo numérico.- Comprueba si se pulsó Cancelar o la entrada está vacía antes de la conversión numérica para que no se conviertan en cero.
- Usa
Number.isNaN()para detectar un resultado numérico no válido. - Las cadenas de caracteres no vacías como
"false"son verdaderas en contexto booleano. String()puede convertirnullyundefinedsin generar errores.
4.2 Predice la conversión implícita una operación a la vez
La conversión implícita de tipos es la conversión automática de tipos dentro de una operación. Sus reglas dependen del operador. Un cálculo que parece funcionar puede contener un valor de texto que haga fallar un paso posterior.
Sigue la regla de la suma
Para operandos ordinarios de tipo number, string, boolean, null y undefined, + une texto si cualquiera de los operandos es una cadena de caracteres. De lo contrario, realiza una conversión numérica y una suma. "5" + 2 da "52", y 2 + "5" da "25".
Evalúa una cadena de operaciones de izquierda a derecha:
console.log(1 + 2 + "3"); // 33
console.log("3" + 1 + 2); // 312
En la primera expresión, dos números suman 3; al añadir "3" se unen las dos formas textuales en "33". En la segunda, la primera operación ya produce "31", por lo que la operación final añade otro dígito. Los paréntesis pueden cambiar qué operación ocurre primero: "3" + (1 + 2) da "33".
Las demás operaciones aritméticas esperan números
La resta, la multiplicación, la división, el resto y las potencias convierten cadenas de caracteres numéricas en números. "5" - 2 da 3, "5" * "2" da 10 y "10" / "4" da 2.5. Una cadena como "abc" no puede convertirse en un número válido, por lo que "abc" * 2 da NaN. Los bigints tienen reglas aritméticas propias; mezclar uno con un número genera TypeError.
Esta diferencia puede ocultar un error:
const price = "20";
console.log(price * 3); // 60
console.log(price + 5); // 205
La multiplicación convierte el precio, pero no cambia la variable. La suma posterior sigue encontrando una cadena de caracteres. Convierte una vez donde llegan los datos de entrada y sigue trabajando con el resultado numérico.
Sigue pequeñas conversiones automáticas
En operaciones aritméticas numéricas, true se convierte en 1, false en 0 y null en 0. Así, true + true da 2, mientras que null + 1 da 1. undefined se convierte en NaN, por lo que undefined + 1 es NaN. Los operadores más y menos unarios convierten cadenas de caracteres numéricas: +"42" da 42, -"5" da -5 y +"" da 0.
++ siempre solicita una actualización numérica, pero += sigue la regla de la suma:
let count = "5";
count++;
console.log(count, typeof count); // 6 number
let label = "5";
label += 1;
console.log(label, typeof label); // 51 string
Las condiciones aplican una conversión distinta
Una condición if considera un valor verdadero o falso en contexto booleano. "0" es una cadena de caracteres no vacía y cumple la condición; el 0 numérico es falso en contexto booleano y omite el bloque. Si cero es una cantidad válida, una comprobación de su valor en contexto booleano no puede distinguir por sí sola el cero de una respuesta ausente. Para un valor representado por un número o null, quantity !== null comprueba explícitamente si está ausente.
La igualdad también ofrece dos comportamientos: "7" == 7 es true después de la conversión implícita, pero "7" === 7 es false porque la igualdad estricta conserva la distinción de tipos. Usa la igualdad estricta para comparaciones ordinarias.
Cuando un resultado es texto unido o NaN, muestra cada entrada junto a typeof input. Encuentra el primer tipo incorrecto y corrige la conversión ahí. Convertir "205" en número al final daría 205, no la suma deseada 25.
Puntos clave
- Para valores primitivos ordinarios, un operando de tipo cadena de caracteres hace que
+concatene. - Sigue las cadenas de operaciones
+de izquierda a derecha, respetando los paréntesis. - Las demás operaciones aritméticas convierten cadenas de caracteres numéricas sin cambiar las variables originales.
++convierte a número, mientras que+=puede añadir texto.- Ser verdadero en contexto booleano es distinto de ser válido: cero puede ser una entrada válida.
5Compara valores y elige una ruta
Las decisiones convierten valores en acciones: una comparación puede determinar si una medida está dentro de un intervalo, si falta un mensaje o si una opción fija coincide. Combina las comprobaciones con cuidado y después úsalas para elegir un valor o un bloque de código. El orden de las ramas y los tipos que se comparan afectan al resultado. Sigue cada condición con entradas concretas, incluidos cero, una cadena de caracteres vacía y un valor exactamente en un umbral.
5.1 Compara valores sin suposiciones ocultas
Una comparación produce un booleano. 7 > 3 es true, 5 >= 5 incluye la igualdad y es true, y 4 < 2 es false. Almacena un resultado como const isAdult = age >= 18; o úsalo directamente en una condición.
Prefiere la igualdad estricta
=== compara sin convertir tipos. Dos valores primitivos ordinarios deben tener el mismo tipo y valores coincidentes: 7 === 7 es true, mientras que "7" === 7 es false. !== invierte la igualdad estricta, por lo que "7" !== 7 es true.
La igualdad débil, ==, puede convertir los operandos. "7" == 7, 0 == "" y "0" == false son todos true. Su regla especial para valores ausentes hace que null == undefined sea verdadero, pero que null == 0 sea falso. != invierte la igualdad débil. Prefiere === y !==; un uso deliberado de value == null puede comprobar tanto null como undefined.
Distingue el orden textual del orden numérico
Dos cadenas de caracteres se comparan de izquierda a derecha mediante sus valores de código UTF-16. Para palabras inglesas ordinarias con el mismo uso de mayúsculas o minúsculas, "apple" < "banana" es true. Un prefijo coincidente más corto va primero: "apple" < "apples" es true. Entre las letras inglesas sin acento, las mayúsculas van antes que las minúsculas, por lo que "Zebra" < "apple" es true. Convertir ambas cadenas con toLowerCase() elimina esa diferencia de mayúsculas y minúsculas en comparaciones sencillas de letras inglesas.
Las cadenas de dígitos también siguen el orden textual:
console.log("10" < "9"); // true
console.log("10" < 9); // false
En la primera comparación, el carácter «1» va antes que «9». En la segunda, un operando es numérico, por lo que el texto se convierte en el número 10. Convierte los datos numéricos de entrada de forma deliberada antes de comparar su magnitud. "abc" < 5 y "abc" > 5 dan ambos false porque la conversión numérica produce NaN.
Maneja primero los números ausentes y no válidos
NaN no es igual a sí mismo: tanto NaN === NaN como NaN == NaN son false. Usa Number.isNaN() para reconocerlo.
Las comparaciones relacionales convierten null en cero, por lo que null >= 0 es true, pero null > 0 es false. La igualdad tiene una regla distinta, por lo que null == 0 sigue siendo false. undefined se convierte en NaN en las comparaciones relacionales, por lo que undefined > 0 y undefined < 0 son falsos; undefined == 0 también es falso. Comprueba si falta un valor antes de tratarlo como una medida.
Compara decimales e intervalos
El redondeo binario hace que 0.1 + 0.2 === 0.3 sea falso. Para estos valores pequeños, funciona una comprobación con tolerancia:
const closeEnough = Math.abs((0.1 + 0.2) - 0.3) < 0.000001;
console.log(closeEnough); // true
Math.abs() elimina el signo de la diferencia. Elige una tolerancia adecuada para la magnitud y la precisión de los valores, o calcula en unidades enteras como milímetros.
No encadenes comprobaciones de intervalos como en matemáticas. Con x = 50, 0 < x < 10 primero produce true y luego compara ese booleano como 1 < 10, lo que da true. Del mismo modo, 3 > 2 > 1 se convierte en true > 1, o 1 > 1, que es falso. Escribe ambas comparaciones completas: x > 0 && x < 10.
Puntos clave
- La igualdad estricta comprueba los tipos sin conversión implícita.
- Dos cadenas de dígitos se comparan como texto; conviértelas para comparar su magnitud numérica.
- Comprueba los valores ausentes y
NaNantes de hacer comparaciones numéricas. - Los resultados decimales pueden necesitar una tolerancia en vez de igualdad exacta.
- Une dos comparaciones de un intervalo con
&&; no las encadenes.
5.2 Combina comprobaciones y elige valores predeterminados
Los operadores lógicos permiten que una condición exprese varios requisitos. Con operandos booleanos, && significa AND, || significa OR y ! significa NOT. Su orden de evaluación también permite proteger una operación que fallaría ante un valor ausente.
Expresa cada requisito
const temperatureC = 25;
const inRange = temperatureC >= 18 && temperatureC <= 30;
const outside = temperatureC < 18 || temperatureC > 30;
inRange es verdadero porque se cumplen ambos límites. outside es falso porque no se cumple ninguna de las comprobaciones de estar fuera. OR incluye el caso en que ambos lados son verdaderos; no significa «uno, pero nunca ambos».
Escribe cada comparación completa. color === "red" || "green" no comprueba si coincide con cualquiera de los dos colores. Con color = "blue", la primera comparación es falsa, pero la cadena de caracteres no vacía "green" es verdadera en contexto booleano. La comprobación deseada es color === "red" || color === "green".
Agrupa la condición que deseas expresar
NOT se aplica antes que AND, y AND antes que OR. Por tanto, true || false && false es verdadero, pero (true || false) && false es falso.
Supón que el acceso requiere iniciar sesión y tener el rol de administrador o de propietario. Escribe loggedIn && (isAdmin || isOwner). Sin paréntesis, loggedIn && isAdmin || isOwner permite que isOwner haga verdadera toda la expresión incluso con loggedIn = false. Los paréntesis mantienen el requisito de inicio de sesión vinculado a ambos roles.
Invertir una condición compuesta también cambia el conector. !(a && b) tiene el mismo valor de verdad que !a || !b; !(a || b) equivale a !a && !b. Para una temperatura fuera del intervalo que incluye sus extremos, invertir las dos comprobaciones de estar dentro cambia >= por <, <= por > y AND por OR.
Detente cuando se conozca el resultado
AND se detiene en el primer operando falso en contexto booleano; OR se detiene en el primero verdadero en contexto booleano. Esto es evaluación en cortocircuito. El operando omitido no se evalúa:
const input = null;
const hasText = input !== null && input.trim() !== "";
console.log(hasText); // false
La primera comprobación es falsa, por lo que nunca se llama a trim() sobre null. Invertir esas dos comprobaciones intentaría primero la operación insegura.
Estos operadores devuelven un operando, no necesariamente un booleano. "" || "Guest" devuelve "Guest"; "Sam" || "Guest" devuelve "Sam". "Ana" && "ok" devuelve "ok", y null && "x" devuelve null. Un if que los rodee comprueba después si el valor devuelto es verdadero o falso en contexto booleano.
Conserva los valores falsos en contexto booleano que tienen significado
| Expresión | Cuándo el valor de respaldo sustituye la entrada |
|---|---|
| `value | |
value ?? fallback | Solo para null o undefined |
Con quantity = 0, quantity || 1 da 1, pero quantity ?? 1 conserva 0. Con nickname = "", nickname || "Anonymous" da el valor de respaldo, mientras que nickname ?? "Anonymous" conserva la cadena de caracteres vacía. Usa ?? cuando esos valores tengan significado.
Usa paréntesis al mezclar ?? con AND u OR: a || b ?? c es un error de sintaxis, mientras que (a || b) ?? c tiene una agrupación explícita. NOT primero convierte a booleano y después lo invierte: !0 es verdadero y !"0" es falso. La doble negación, !!value, da un booleano.
Puntos clave
- AND requiere que se cumplan ambas comprobaciones; OR requiere al menos una.
- Los paréntesis mantienen los requisitos compartidos vinculados a cada caso permitido.
- La evaluación en cortocircuito omite un operando cuando el resultado ya está decidido.
&&y||devuelven valores de operandos que pueden no ser booleanos.??sustituye solonullyundefined, y conserva el cero y el texto vacío.- Mezclar
??directamente con AND u OR requiere paréntesis.
5.3 Elige ramas, valores y casos fijos
Una sentencia if ejecuta un bloque cuando su condición es verdadera en contexto booleano. Un else se ejecuta cuando esa condición es falsa en contexto booleano. Usa llaves para mostrar exactamente qué sentencias pertenecen a cada rama.
Ordena una cadena de decisiones
Una cadena de condiciones else if comprueba de arriba abajo. Se ejecuta la primera condición que se cumple y se omiten todas las ramas posteriores:
const score = 85;
let grade;
if (score >= 90) {
grade = "A";
} else if (score >= 80) {
grade = "B";
} else if (score >= 70) {
grade = "C";
} else {
grade = "F";
}
La primera comparación no se cumple; la segunda sí, por lo que grade pasa a ser "B". Comprobar primero score >= 70 captaría incluso una puntuación de 95 y asignaría "C". Para umbrales mínimos que se solapan, pon primero el más alto. La variable compartida grade se declara fuera de las ramas para que el código posterior pueda leerla.
Una condición compuesta puede mantener legible una decisión breve. El envío es gratuito para un total de pedido de al menos 50 o para un miembro; de lo contrario cuesta 4,95:
const orderTotal = 45;
const isMember = false;
let shipping;
if (orderTotal >= 50 || isMember) {
shipping = 0;
} else {
shipping = 4.95;
}
console.log(`To pay: ${orderTotal + shipping}`);
// To pay: 49.95
Dos condiciones anidadas sin ramas else a menudo se pueden unir con AND: if (isLoggedIn) { if (isAdmin) { ... } } ejecuta su código más interno bajo las mismas condiciones booleanas que if (isLoggedIn && isAdmin) { ... }.
Evita la puntuación que cambia la ruta
Sin llaves, solo la siguiente sentencia pertenece a un if; la sangría no puede añadirle otra sentencia. Un punto y coma inmediatamente después de la condición crea una sentencia vacía: if (x > 5); { ... } hace que el bloque siguiente se ejecute independientemente de la condición.
if (x = 5) asigna 5 y después comprueba si es verdadero en contexto booleano. Cambia x y cumple la condición porque 5 es verdadero en contexto booleano. Para comparar, usa if (x === 5).
Elige un valor con una expresión condicional
El operador condicional, o ternario, devuelve uno de dos valores:
const age = 17;
const status = age >= 18 ? "adult" : "minor";
console.log(status); // minor
La forma es condition ? valueIfTrue : valueIfFalse. Úsalo para una elección breve dentro de una asignación o un literal de plantilla. Usa if/else para ramas de sentencias. Las expresiones condicionales muy anidadas hacen que las opciones sean difíciles de seguir.
Compara opciones fijas con switch
const day = "Sat";
let kind;
switch (day) {
case "Sat":
case "Sun":
kind = "weekend";
break;
default:
kind = "weekday";
}
switch compara el valor de forma estricta con sus etiquetas de caso. Ambas etiquetas del fin de semana llegan a la misma asignación. break sale del switch; default maneja un valor que no coincide con ningún caso. switch ("2") no coincide con case 2: porque los tipos son distintos.
Después de una coincidencia, la ejecución continúa por los casos posteriores hasta un break o el final. Esta continuación entre casos (fall-through) puede ser deliberada, como con etiquetas consecutivas, o accidental. Si el caso 2 añade una palabra y carece de un break antes de que el caso 3 añada otra, se ejecutan ambas adiciones. Una etiqueta de caso es un punto de entrada, no una condición nueva que se comprueba después de cada sentencia.
Puntos clave
- Una cadena de condiciones
else ifsolo ejecuta la primera rama cuya condición se cumple. - Declara un resultado fuera de las ramas cuando las sentencias posteriores lo necesiten.
- Usa llaves y no pongas un punto y coma directamente después de una condición
if. =asigna un valor;===compara valores.- El operador condicional elige un valor.
switchcompara de forma estricta y necesitabreakpara detener la continuación entre casos.
6Encuentra el primer paso incorrecto
Un mensaje de error puede señalar directamente un fallo, pero un programa también puede ejecutarse correctamente y producir un resultado equivocado. Lee el tipo, el mensaje y la ubicación en la consola, y después sigue los valores que importan. Cuando los registros dejen demasiado a la suposición, pausa la ejecución y avanza paso a paso. Una rutina de depuración pequeña y repetible te ayuda a comprobar una causa a la vez y verificar la corrección en el programa guardado.
6.1 Lee errores y sigue resultados incorrectos
Un programa puede fallar antes de empezar, detenerse durante la ejecución o terminar con un resultado incorrecto. Identifica qué ocurrió antes de cambiar el código. La consola aporta información sobre los errores, mientras que los registros con etiquetas revelan valores del código que se ejecuta.
Distingue tres tipos de problemas
| Tipo | Qué ocurre | Ejemplo |
|---|---|---|
| Error de sintaxis | No se puede analizar el script; no se ejecuta ninguna parte de ese script | Un paréntesis sin cerrar |
| Error en tiempo de ejecución | La ejecución llega a una sentencia que genera un error; las sentencias anteriores ya se han ejecutado | Leer un nombre desconocido |
| Error lógico | El código se ejecuta, pero el resultado es incorrecto | Dividir solo la última parte de una suma |
Un error de sintaxis en un script no deshace otro script que ya se ejecutó. Una excepción no manejada en tiempo de ejecución detiene la ejecución actual en la sentencia que falla.
Lee el mensaje completo
Una entrada de la consola como Uncaught ReferenceError: totl is not defined indica el tipo de error y el nombre que falla. «Uncaught» significa que la excepción no se manejó. Una ubicación como app.js:2 señala el archivo y la línea; al hacer clic se abre ese código.
let total = 0;
total = totl + 5;
console.log(total);
La línea 1 se ejecuta. En la línea 2, JavaScript no puede leer totl, por lo que nunca completa esa asignación ni llega al registro final. Corregir el error de escritura por total hace que el script muestre 5.
Los mensajes de sintaxis habituales mencionan un ) ausente, un elemento inesperado o un elemento no válido. En console.log("hi";, falta el paréntesis de cierre. En if (x > 3 {, a la condición le falta el paréntesis de cierre. La línea indicada es donde el motor detectó el problema; inspecciona también justo encima por si hay una comilla o un delimitador sin cerrar.
Usa el tipo para acotar la causa
Un ReferenceError señala un nombre al que no se puede acceder: un error de escritura, un problema de ámbito o una lectura antes de la inicialización. Un TypeError significa que la operación no corresponde al valor, como "abc".length(), null.trim() o una reasignación a un const. Un RangeError puede deberse a un argumento no admitido, como (1.5).toFixed(101).
La formulación de los errores puede variar según el navegador. El tipo y el valor implicado son más útiles que memorizar toda la frase. Corrige el primer error relevante y vuelve a ejecutar, porque los mensajes posteriores pueden deberse a la misma causa.
Sigue un error lógico
Para una media incorrecta, muestra la suma y el resultado por separado:
const sum = 72 + 85 + 90;
const average = 72 + 85 + 90 / 3;
console.log("sum:", sum); // 247
console.log("average:", average); // 187
La suma correcta acota el fallo al paso de división. Cambia el cálculo a sum / 3, que da 82.33333333333333. Cuando una suma une dígitos inesperadamente, muestra también los tipos: console.log("price:", price, typeof price);. Encuentra el primer valor que difiera de lo que esperas.
Usa console.warn() o console.error() para destacar tus propios mensajes de diagnóstico. Comprueba los filtros de nivel de la consola si parece faltar un registro. Un 404 significa que no se encontró un recurso, así que comprueba la ruta del script; otros fallos de carga requieren leer el mensaje completo. La falta de un registro de inicio también puede deberse a un filtro o a un error de sintaxis.
Reproduce el problema, lee el primer error, comprueba una causa probable con un pequeño cambio o registro, y después vuelve a ejecutar y comprueba el resultado esperado. Elimina los registros temporales cuando se haya corregido el error.
Puntos clave
- Los errores de sintaxis, de ejecución y lógicos requieren distintos tipos de información.
- Lee el tipo de error, el mensaje completo y la ubicación.
- La línea indicada para un error de sintaxis puede estar después del delimitador que falta.
- Muestra valores y tipos para encontrar el primer paso incorrecto.
- Comprueba los fallos de carga y los filtros de la consola cuando falte la salida esperada.
6.2 Pausa la ejecución e inspecciona los valores actuales
Un depurador te permite pausar un script en ejecución e inspeccionar los valores en ese momento exacto. Usa el panel Sources en Chrome o Edge, o el panel Debugger en Firefox. Esto es especialmente útil cuando un resultado incorrecto depende de varias operaciones anteriores.
Pausa antes de que se ejecute la línea
Abre el script en Sources y haz clic en un número de línea para establecer un punto de interrupción. La ejecución se pausa antes de que se ejecute esa línea. Si el código se ejecuta durante la carga de la página, recárgala después de establecer el punto de interrupción. El mero hecho de establecerlo no vuelve a ejecutar el código que ya terminó.
También puedes escribir debugger; en el script. Con un depurador activo, pausa la ejecución; sin él, no tiene efecto. Elimina esta sentencia antes de publicar el código.
Elige la siguiente acción
| Control de Chrome | Atajo | Efecto |
|---|---|---|
| Reanudar | F8 | Continúa hasta el siguiente punto de interrupción o el final |
| Paso a paso por procedimientos | F10 | Ejecuta la sentencia actual sin entrar en una función llamada |
| Entrar en la función | F11 | Entra en una función llamada cuando está disponible para el depurador |
| Salir de la función | Shift+F11 | Termina la función actual y vuelve a pausar donde se llamó |
Algunas llamadas integradas no tienen código fuente JavaScript en el que puedas entrar paso a paso. El paso a paso por procedimientos es útil cuando quieres el resultado de la llamada sin seguir su funcionamiento interno.
Durante la pausa, pasa el cursor sobre un nombre para inspeccionarlo, lee los valores locales en Scope o añade una expresión a Watch. Las entradas de Watch como typeof price y total > 100 se vuelven a evaluar a medida que avanzas. La consola también puede evaluar expresiones usando el ámbito pausado.
Inspecciona un total engañoso
El envío gratuito debería comenzar en 50, pero este código lo concede para un subtotal de 45 más 4 de envío:
const subtotal = "45";
const shipping = 4;
const total = subtotal + shipping;
if (total >= 50) {
console.log("Free shipping");
}
Establece un punto de interrupción en la línea del if y recarga la página. La asignación ya se ha ejecutado. Scope muestra subtotal como la cadena de caracteres "45" y total como "454". Una entrada typeof total en Watch indica "string". La comparación convierte "454" en número, por lo que total >= 50 se cumple.
El fallo está en la suma, antes de la comparación. Cambia el cálculo guardado a const total = Number(subtotal) + shipping;. Vuelve a cargar la página. El total ahora es el número 49 y la condición es falsa. Si pausas en la asignación, esta aún no se ha ejecutado: avanza sobre ella antes de inspeccionar el total inicializado.
Pausa solo donde sea útil
Un punto de interrupción condicional pausa solo cuando su expresión es verdadera, como total > 100. Haz clic derecho en el número de línea para añadir uno. Un punto de registro muestra un mensaje cada vez que se ejecuta su línea, sin pausar ni editar el script. Los puntos de interrupción por excepción pausan donde se genera una excepción, para que puedas inspeccionar los valores en el momento del fallo.
Recorrer paso a paso una cadena de condiciones else if revela a qué rama se llega y qué condición anterior impide las comprobaciones posteriores. Usa registros para unos pocos valores conocidos y el depurador cuando importen el orden o varios valores actuales. Haz la corrección final en el código guardado del proyecto: un cambio experimental en el navegador no es una edición permanente del proyecto. Vuelve a ejecutar el caso que fallaba y comprueba el resultado corregido.
Puntos clave
- Un punto de interrupción de línea pausa antes de ejecutar su sentencia; recarga el código que se ejecuta al cargar la página.
- El paso a paso por procedimientos ejecuta una sentencia; entrar y salir de funciones permite seguir sus llamadas.
- Scope y Watch muestran valores y expresiones actuales durante la pausa.
- Inspecciona un tipo incorrecto antes de la operación que lo usa.
- Un punto de interrupción condicional filtra las pausas; un punto de registro muestra mensajes sin pausar.
- Guarda la corrección en el proyecto y vuelve a ejecutar el caso que fallaba.
Ejemplos de Variables y tipos en JavaScript
1Carga un script y lee sus primeros mensajes
13 pasos
- 1IntroducciónDa al código un lugar donde ejecutarse
Un navegador lee HTML para construir la página y ejecuta JavaScript para llevar a cabo instrucciones. Para ver un primer resultado, necesitas un script conectado y una consola abierta. Seguiremos una pequeña página desde la organización de sus archivos hasta el mensaje que muestra y después usaremos entradas de consola para distinguir los valores almacenados de los resultados de las sentencias.
- 2ExplicaciónElige código integrado en HTML o externo
Un script integrado en HTML contiene código entre sus etiquetas. Un script externo usa
srcpara cargar un archivo JavaScript independiente:<script src="js/greet.js"></script>El archivo externo contiene JavaScript sin etiquetas HTML. El código dentro de este mismo elemento se ignoraría porque
srcestá presente. Conserva la etiqueta de cierre</script>; HTML no trata este elemento como de cierre automático. - 3EjemploAjusta la ruta a las carpetas
Coloca
index.htmljunto a una carpeta llamadajs, congreet.jsdentro de esa carpeta. Elsrc="js/greet.js"de la página parte de la carpeta HTML y entra enjs.En el archivo JavaScript, escribe:
console.log("Page ready");Guarda ambos archivos. Una ruta
greet.jsbuscaría junto al archivo HTML en vez de dentro de su subcarpeta, por lo que no encontraría este script. - 4ExplicaciónEjecuta después de analizar la página
Añade
deferal script clásico externo en el head:<script src="js/greet.js" defer></script>La descarga ocurre al mismo tiempo que el análisis de HTML. La ejecución espera hasta que termina el análisis. Varios scripts clásicos diferidos conservan su orden en el HTML, lo que importa cuando uno usa un valor establecido por otro. Añadir
defera código clásico integrado en HTML no retrasa su ejecución. - 5DesafíoMantén en orden los scripts dependientes
Una página tiene
setup.jsseguido dedisplay.jsen su head. El segundo script usa un valor del primero y ambos necesitan el contenido analizado de la página. ¿Cumpliríaasyncen ambos estos requisitos? ¿Qué opción de carga lo haría?---reveal---
No. Los scripts async se ejecutan cuando termina cada descarga, por lo que no se garantizan su orden ni que la página esté lista. Usa
deferen ambos scripts clásicos externos y mantén setup primero en el HTML. - 6ConexiónReconoce un script de módulo
Un script cargado con
type="module"se difiere por defecto, usa el modo estricto y mantiene sus nombres de nivel superior dentro del módulo. Los módulos pueden compartir código mediante import y export. Carga las páginas con módulos mediante un servidor de desarrollo local en Chrome o Firefox; abrir directamente una dirección de archivo encuentra restricciones de carga de módulos. Estas reglas de carga son distintas de las de un script clásico ordinario. - 7ConsejoAbre la consola de esta página
En Chrome o Edge, abre la consola con
Ctrl+Shift+Jen Windows/Linux oCmd+Option+Jen Mac. Firefox usaCtrl+Shift+KoCmd+Option+K. Recarga la página guardada y busca «Page ready». Un error de archivo no encontrado te lleva de vuelta a la ruta; un error de sintaxis señala código que el motor no pudo analizar. Las entradas de la consola pertenecen a la página actual. - 8EjemploDistingue la salida de la evaluación
Introduce estas líneas como entradas de consola separadas:
let total = 9; total; console.log("Total:", total);La declaración puede mostrar
undefinedcomo resultado. Leertotalsigue dando9. La última llamada muestra «Total: 9» y devuelveundefined. El resultado mostrado de una sentencia no es necesariamente el valor almacenado en la variable ni el mensaje mostrado por esa llamada. - 9DesafíoInterpreta una declaración en la consola
Introduces
let count = 6;y vesundefined. Después introducescount + 2. ¿Qué resultado debes esperar y significaba la primera salida que la declaración había fallado?---reveal---
El resultado es
8. La declaración almacenó 6 correctamente; su propio resultado fue undefined. La expresión posterior lee ese número almacenado y suma 2. No se produce ninguna reasignación, por lo que count sigue conteniendo 6. - 10ExplicaciónUsa nombres exactos y notas claras
JavaScript distingue entre mayúsculas y minúsculas.
console.log()funciona;Console.log()busca un nombre distinto. Usa//para un comentario de una línea o/* ... */para uno más largo. El motor omite el texto de los comentarios.Inicia un script clásico con
"use strict";para detectar asignaciones a nombres no declarados. Un error de escritura comototl = 5;indica entonces un error en vez de crear accidentalmente un nombre global. - 11EjemploInspecciona el tipo de entrada de un cuadro de diálogo
Ejecuta este código de práctica con un cuadro de diálogo:
const input = prompt("Quantity?", "1"); console.log(input, typeof input);Aceptar un 6 escrito da
6 string: los dígitos se devolvieron como texto. Cancelar devuelve null, mientras que aceptar un cuadro vacío devuelve una cadena de caracteres vacía.confirm()devuelve un booleano yalert()muestra un mensaje. Un cuadro de diálogo espera la respuesta antes de que se ejecute la siguiente sentencia. - 12DesafíoRelaciona la carga con la salida
Un script clásico externo cargado con defer contiene
console.log("Started"); const answer = prompt("Code?"); console.log(typeof answer);. El usuario escribe 42 y acepta. ¿Qué aparece, en qué orden, y conservaría la recarga automáticamente esa respuesta?---reveal---
Los mensajes son «Started» y «string». Prompt devuelve texto, incluso para dígitos. Al recargar se vuelve a ejecutar el script guardado y se abre de nuevo el cuadro de entrada; la variable de la ejecución anterior no es una edición guardada del proyecto.
- 13RepasoComprueba un primer script
Para un primer script, comprueba la ruta relativa, elige el comportamiento de carga, guarda y recarga. Lee el mensaje de la consola por separado del resultado de evaluación de la propia consola. Cuando un cuadro de entrada proporcione datos, inspecciona su valor y tipo antes de construir un cálculo con ellos. Un nuevo experimento en la consola cambia la página en ejecución, así que guarda las ediciones permanentes en el proyecto.
2Sigue declaraciones, actualizaciones y ámbitos
11 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónSigue un valor a través de un programa
- 2ExplicaciónElige declaraciones según la reasignación
- 3EjemploLee el valor anterior antes de almacenar el nuevo
- 4EjemploCalcula un valor final una sola vez
- 5DesafíoElige la declaración adecuada
- 6ExplicaciónColoca un resultado compartido fuera de sus ramas
- 7DesafíoDetecta el sombreado de variables
- 8Idea claveUn enlace puede existir antes de estar listo
- 9ConsejoUsa el tipo de error como pista
- 10DesafíoCorrige el resultado sin ocultarlo
- 11RepasoExamina el enlace y después el valor
3Calcula un total y construye su mensaje
18 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónLleva el significado de los valores al texto
- 2ExplicaciónInspecciona un valor antes de usarlo
- 3DesafíoPredice un cambio de tipo
- 4Idea claveInterpreta con cuidado una etiqueta de tipo
- 5EjemploCalcula antes de dar formato
- 6ExplicaciónHaz que toda la suma sea el numerador
- 7DesafíoEncuentra los metros completos
- 8ConsejoElige el redondeo según la dirección
- 9ConexiónSepara la precisión de la presentación
- 10ExplicaciónConserva el resultado de una transformación
- 11EjemploInterpreta índices y un fragmento
- 12DesafíoLimpia primero y luego comprueba
- 13Idea claveIdentifica si un método devuelve texto
- 14EjemploInserta el total calculado
- 15DesafíoElige las comillas necesarias
- 16ExplicaciónDeja que la expresión elija una palabra
- 17DesafíoCombina la limpieza y la presentación numérica
- 18RepasoInspecciona un mensaje de dentro hacia fuera
4Acepta una cantidad sin ocultar la ausencia de entrada
12 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónDistingue la ausencia de un valor numérico
- 2EjemploInspecciona la respuesta original
- 3ExplicaciónComprueba la ausencia antes de convertir
- 4EjemploRechaza una conversión fallida
- 5DesafíoElige un analizador según el significado
- 6Idea claveConvierte a booleano sin interpretar la palabra
- 7EjemploDetecta un cálculo que oculta texto
- 8ExplicaciónEvalúa una cadena de operaciones desde la izquierda
- 9DesafíoSigue dos actualizaciones distintas
- 10ConsejoCorrige la entrada antes del total
- 11DesafíoConserva el cero durante todo el proceso
- 12RepasoValida en el orden en que se dispone de la información
5Construye una decisión que cumpla sus reglas
15 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónConvierte una regla en una decisión predecible
- 2ExplicaciónMantén visibles los tipos en la igualdad
- 3EjemploCompara números almacenados como texto
- 4DesafíoIdentifica los operandos reales de una comparación
- 5ConsejoComprueba la ausencia y la precisión numérica
- 6ExplicaciónHaz explícito cada requisito
- 7EjemploAgrupa un requisito compartido
- 8DesafíoConserva un valor vacío cuando sea válido
- 9Idea claveLa evaluación en cortocircuito controla qué se evalúa
- 10EjemploSigue la primera rama cuya condición se cumple
- 11DesafíoElige un valor o varias sentencias
- 12ExplicaciónInterpreta switch como un punto de entrada
- 13DesafíoPredice el efecto del break ausente
- 14DesafíoCombina la conversión con el orden de las ramas
- 15RepasoComprueba la regla en sus límites
6Localiza y corrige un total engañoso
12 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónEncuentra dónde se vuelve incorrecto el resultado por primera vez
- 2ExplicaciónClasifica el fallo antes de cambiar el código
- 3EjemploLee el nombre que falla y su ubicación
- 4DesafíoDistingue el análisis sintáctico de la ejecución
- 5ConsejoMuestra el primer valor inesperado
- 6EjemploReproduce la decisión incorrecta
- 7ExplicaciónPausa antes de la comparación
- 8Idea claveLa conversión posterior no puede corregir la suma
- 9DesafíoInspecciona antes y después de una asignación
- 10ConsejoElige la pausa que responde a la pregunta
- 11DesafíoVerifica una corrección de tipo mediante una decisión
- 12RepasoVuelve a probar la corrección guardada
Ejercicios de Variables y tipos en JavaScript
Set 1: Ejecuta código y sigue los valores almacenados10 Preguntas de Práctica
Pregunta 1 de 10
ReferenceError: lenght is not defined. ¿Qué debes inspeccionar primero?Mostrar respuestaOcultar respuesta
lenght está mal escrito o no está disponible en el ámbito actual. Una ruta incorrecta impediría que se ejecutara la sentencia de inicio de ese archivo, lo que no coincide con lo observado.Pregunta 2 de 10
scripts que contiene start.js. ¿Qué elemento carga ese archivo después de que termine el análisis de HTML?Mostrar respuestaOcultar respuesta
scripts, y defer retrasa el script clásico externo hasta que termina el análisis. async también descarga durante el análisis, pero puede ejecutarse antes de que este termine. Escribir la ruta como texto integrado no carga un archivo.Pregunta 3 de 10
¿Qué mensaje muestra este código?
// console.log("Old");
console.log("Items:", 6 + 2);
Mostrar respuestaOcultar respuesta
console.log() separa la etiqueta y el resultado con un espacio, produciendo «Items: 8». Unir los dígitos en «62» requeriría concatenar cadenas de caracteres, pero aquí ambos operandos son números.Pregunta 4 de 10
const rate = 0.15; y después ejecuta rate = 0.2;. ¿Qué ocurre en la asignación?Mostrar respuestaOcultar respuesta
const genera un TypeError cuando la ejecución llega a él. Si faltara un inicializador, la propia declaración sería un error de sintaxis.Pregunta 5 de 10
¿Qué valor se muestra?
let balance = 14;
balance = balance + 9;
balance = balance - 4;
console.log(balance);
Mostrar respuestaOcultar respuesta
Pregunta 6 de 10
¿Qué valores se muestran y en qué orden?
let level = 4;
{
let level = 9;
console.log(level);
}
console.log(level);
Mostrar respuestaOcultar respuesta
Pregunta 7 de 10
typeof "28"?Mostrar respuestaOcultar respuesta
"28" sea una cadena de caracteres, aunque sus caracteres sean dígitos. typeof indica el tipo actual del valor y no convierte el texto en número. El resultado "number" describiría el valor 28 sin comillas, no el valor dado aquí.Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Pregunta 9 de 10
"catalog".slice(1, 4)?Mostrar respuestaOcultar respuesta
slice(1, 4) copia las posiciones 1, 2 y 3 y excluye la posición 4, dando "ata". Incluir la posición final añadiría incorrectamente la siguiente letra y produciría "atal".Pregunta 10 de 10
Supón que no hay ninguna declaración cost anterior. ¿Qué se muestra antes de que se detenga este script?
let cost = 8;
{
console.log(cost);
let cost = 12;
}
console.log(cost);
Mostrar respuestaOcultar respuesta
cost abarca todo el bloque y sombrea al externo incluso antes de su declaración. Por tanto, el primer registro lee un enlace interno sin inicializar y genera ReferenceError antes de mostrar nada. No puede recurrir al 8 externo ni leer el enlace interno como undefined.Set 2: Construye texto y convierte datos de entrada10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
¿Qué valor y tipo se muestran?
let amount = "6";
amount += 2;
amount++;
amount -= 4;
console.log(amount, typeof amount);
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
"notes.txt".endsWith(".txt")?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
¿Qué se muestra?
let tag = " mixed ";
tag.trim().toUpperCase();
console.log(tag.length);
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
const trays = 4; const massKg = 1.25;, ¿qué produce `Mass: ${(trays * massKg).toFixed(1)} kg`?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
const name = "Mira";, ¿qué texto almacena const label = "Hello, ${name}";?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Number("18px")?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
Number(input). ¿Qué valor resulta y qué información se ha perdido?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
6 + 2 + "4"?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
const shown = (7.5).toFixed(2);, ¿qué produce shown + 1?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
null. Una cantidad debe estar presente, ser no negativa y numérica; se permite el cero. ¿Qué secuencia de validación cumple todos los requisitos?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 3: Comprueba comparaciones y elige ramas10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
"16" === 16?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
"24" < "8" se evalúa como verdadero?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
0 ?? 5?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
¿Qué se muestra?
const points = 76;
let badge;
if (points >= 60) {
badge = "bronze";
} else if (points >= 75) {
badge = "silver";
} else {
badge = "none";
}
console.log(badge);
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
const active = false;, ¿qué produce active ? "Ready" : "Waiting"?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
¿Qué valor se muestra?
const mode = "2";
let label = "idle";
switch (mode) {
case 2:
label = "fast";
break;
default:
label = "normal";
}
console.log(label);
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
approved = false, isEditor = false e isOwner = true, el código usa approved && isEditor || isOwner. ¿Qué resultado da y qué condición aplica la regla completa?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
¿Qué texto se muestra?
let route = "";
switch (3) {
case 2:
route += "A";
break;
case 3:
route += "B";
case 4:
route += "C";
break;
default:
route += "D";
}
console.log(route);
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
const distance = 42;, ¿cuáles son los valores de 0 < distance < 20 y distance > 0 && distance < 20, respectivamente?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 4: Sigue los errores e inspecciona la ejecución10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
total = total + 7; cuando total es 11. ¿Qué valor aparece antes del paso a paso por procedimientos y cuál aparece después?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
¿Qué ocurre cuando se carga este script?
console.log("Begin");
let size = 4;
let size = 7;
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
base: 13 number, extra: 4 string y total: 134 string. ¿Dónde debe comenzar la corrección?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
raw = "27", fee = 6 y total = "276" justo antes de if (total > 100). ¿Qué cambio corrige la clasificación errónea como total alto?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
¿Qué mensajes se muestran antes de que este código se detenga?
console.log("One");
let current = 5;
current += unknownStep;
console.log("Two");
Supón que unknownStep no tiene ninguna declaración.
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Supón que se inicia una ejecución nueva para cada entrada. ¿Qué ocurre para null y para " 5 "?
const cleaned = input.trim() !== "" && input !== null;
const total = cleaned ? Number(input) + 2 : 0;
console.log(total);
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 5: Corrige cálculos y decisiones10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
¿Qué se muestra?
let stock = 0;
let status = "empty";
if (stock = 3) {
status = "ready";
}
console.log(stock, status);
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
Math.floor(-3.2)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
const count = 2;, ¿qué mensaje produce `Packed ${count} ${count === 1 ? "box" : "boxes"}`?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
const label = "Draft.PDF";, ¿qué expresión reconoce la terminación PDF?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
value. ¿Qué comprobación detecta correctamente que ese valor es NaN?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
¿Qué valores contienen saved y total al final?
let total = 8;
const saved = total++;
total *= 3;
total -= saved;
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
count ?? 3 y count || 3 cuando count es 0, y qué expresión cumple la regla?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Una insignia debe ser «gold» con 90 o más y «silver» de 70 a 89. ¿Qué tiene de incorrecto este resultado y qué cambio corrige los umbrales que se solapan?
const points = 94;
let badge;
if (points >= 70) {
badge = "silver";
} else if (points >= 90) {
badge = "gold";
} else {
badge = "none";
}
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
if (!value) para rechazar entradas numéricas no válidas. El usuario introduce "0", "bad" o "-2". ¿Qué patrón de fallo tiene esta comprobación?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 6: Combina datos de entrada, tipos y flujo de control10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
typeof es "number", pero que nunca es igual a sí mismo. ¿Qué valor es y cómo debes comprobarlo directamente?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
¿Qué se muestra?
const massKg = 2.75;
const message = `Load: ${(massKg * 4).toFixed(2)} kg`;
console.log(message);
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
const cleaned = raw.trim(); y la ejecución se pausa ahí. ¿Cómo obtienes e inspeccionas el valor inicializado de cleaned?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
¿Qué se muestra?
const raw = "18";
const fee = 3;
const total = raw * 2 + fee;
const label = raw + fee * 2;
console.log(total, label);
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Para una entrada que es una cadena de caracteres o null, ¿qué valor asigna este código a label cuando input es " "?
const input = " ";
const cleaned = input !== null && input.trim();
const label = cleaned ?? "Guest";
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
¿Qué se muestra?
const raw = "3";
let result = "";
switch (Number(raw)) {
case 3:
result += "M";
case 4:
result += "N";
break;
default:
result = "X";
}
console.log(result);
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
El registro final debe mostrar una etiqueta de envío para cada rama. ¿Qué corrección conserva el resultado externo deseado?
let label = "pending";
if (true) {
let label = "sent";
}
console.log(label);
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
null, NaN o un número. El intervalo válido incluye 0 y 10. ¿Qué comprobación acepta exactamente los valores numéricos de ese intervalo?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
8 + 12 + 36 / 3. ¿Qué diagnóstico y corrección coinciden con toda la información?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
¿Te atascas con una pregunta tuya? Ayuda con Tareas
Términos Clave
A
Análisis del prefijo numérico
parseFloat("6.2 kg") lee 6.2, mientras que Number("6.2 kg") rechaza toda la cadena de caracteres y da NaN.Asignación
count = count + 1; usa el recuento anterior para calcular el valor que lo sustituye.Asignación compuesta
let code = "7";, code += 2 almacena "72" porque la suma compuesta sigue la regla de unión de texto.Atributo async
async cuando ningún otro script depende de que se ejecute primero.Atributo defer
defer se ejecutan en su orden en el HTML incluso si la segunda descarga termina primero.Á
Ámbito de bloque
const message declarado dentro del cuerpo de un if no puede leerse después de que ese cuerpo termine de ejecutarse.Ámbito global
let count de nivel superior establecido por un script clásico anterior.B
Base numérica
parseInt("11", 10) lee el once decimal, mientras que parseInt("11", 16) lee el diecisiete decimal.Booleano
heightM >= 2 devuelve un booleano que puede determinar si una altura cumple un requisito.C
Cadena de caracteres
"203" forman texto que se puede unir o buscar sin convertirse en el número 203.Cadena de condiciones else if
Caso predeterminado
"normal" en default cuando la entrada no coincide con ninguno de sus modos especiales con nombre.Coalescencia nula
count es 0, count ?? 3 conserva el cero, mientras que count || 3 lo sustituye por el valor de respaldo.Coma flotante (punto flotante)
0.1 + 0.2 puede mostrar dígitos adicionales al final porque las fracciones almacenadas son aproximadas.Comentario
// antes de un registro temporal impide que se ejecute y mantiene el texto disponible para más adelante.Comparación
massKg <= 20 incluye exactamente 20 y puede almacenarse como resultado booleano de una comprobación de límite.Comparación relacional
"30" < "7" es verdadera como texto, pero convertir ambos valores en números invierte ese resultado.Concatenación
"Good" + " " + "morning" incluye un espacio porque la cadena central lo proporciona explícitamente.Conjunción lógica (AND)
&& para que una medida deba cumplir ambos requisitos.Consola
6 * 7 en la consola de la página muestra 42 sin añadir una sentencia al script guardado.Contexto booleano
if, pero una cadena de caracteres vacía no, aunque ambos valores son de tipo string.Continuación entre casos (fall-through)
Conversión explícita
input antes de añadir una tarifa deja claro que el programa espera un total numérico.Conversión implícita de tipos
"8" * 2, la multiplicación convierte implícitamente el texto en un número para el cálculo y produce 16.Conversión numérica implícita
"14" - 2 produce 12 sin cambiar la variable que almacenaba originalmente la cadena de caracteres.D
Declaración
let result; declara una variable antes de que el código posterior decida qué valor almacenar en ella.Depurador
Disyunción lógica (OR)
E
Encadenamiento de métodos
" Note ".trim().toLowerCase() primero elimina los espacios de los extremos y después convierte el resultado a minúsculas.Enlace
const conserva su enlace porque el nombre sigue haciendo referencia al mismo objeto.Error de referencia (ReferenceError)
totl + 5 puede generar ReferenceError aunque exista cerca una variable total escrita correctamente.Error de sintaxis
Error de tipo (TypeError)
text.length() trata una propiedad numérica como una función, por lo que la operación genera un TypeError.Error en tiempo de ejecución
Error lógico
Evaluación en cortocircuito
input !== null en una condición de protección con AND puede evitar una llamada insegura a input.trim() cuando input es null.Expresión
price * count puede proporcionar un valor a una asignación o a un marcador de posición de plantilla.Expresión de seguimiento
typeof total a Watch puede revelar la sentencia exacta donde un valor numérico se convierte en una cadena de caracteres.F
Formato
(6).toFixed(2) dentro de una plantilla muestra "6.00" sin cambiar el valor numérico original.I
Igualdad débil
"12" == 12 es verdadera después de la conversión, por lo que la igualdad estricta ofrece una comprobación de tipos más predecible.Igualdad estricta
"12" === 12 es falsa porque el texto con dígitos coincidentes sigue siendo de un tipo distinto al de un número.Incremento posfijo
let n = 3; const old = n++;, old recibe 3 mientras que la n actualizada pasa a ser 4.Inicialización
const widthM = 4;, el número 4 es el inicializador que deja el enlace listo para su lectura.Inmutabilidad
text = text.trim(); sustituye el valor de la variable por una cadena de caracteres nueva en vez de editar la anterior.Interpolación
name = "Nora", la interpolación en `Hello, ${name}` crea el saludo «Hello, Nora».Í
Índice
"planet", el índice 0 contiene "p" y el índice 5 contiene "t"; el índice 6 está más allá del final.L
Leyes de De Morgan
Literal de plantilla
`Count: ${count}` coloca el recuento actual junto a su etiqueta descriptiva.M
Marcador de posición
${...} de un literal de plantilla donde se evalúa una expresión y se inserta su forma textual.`Mass: ${count * massKg} kg`, el marcador de posición calcula el total antes de insertarlo.Método
label.toLowerCase() produce texto en minúsculas, mientras que omitir los paréntesis no llama al método.Modo estricto
"use strict"; ayuda a detectar una variable mal escrita en su primera asignación.Motor de JavaScript
console.log("Ready"); y la consola muestra «Ready».N
Negación lógica (NOT)
!"0" es falsa porque la cadena de caracteres no vacía es verdadera en contexto booleano antes de invertir su valor booleano.Notación camelCase
firstName y totalMassKg muestran los límites entre palabras y siguen siendo nombres válidos de JavaScript.O
Operador aritmético
massKg * count usa la multiplicación para calcular la masa total a partir de dos valores numéricos.Operador condicional
"open" o "closed" a partir de un booleano sin escribir dos ramas de asignación separadas.Operador más unario
+"31" produce el número 31, mientras que "31" + 1 une texto y produce "311".P
Paso a paso por procedimientos (step over)
Precedencia
4 + 6 * 2, la multiplicación se ejecuta antes que la suma, por lo que el resultado es 16 en vez de 20.Punto de interrupción
Punto de interrupción condicional
total > 200 omite los totales ordinarios menores y pausa cuando es necesario inspeccionar un resultado alto.Punto de registro (logpoint)
R
Rama
else puede asignar una tarifa de entrega cuando la condición de entrega gratuita se ha evaluado como falsa en contexto booleano.Resto (residuo)
478 % 100 da los 78 cm que quedan después de los metros completos.S
Script de módulo
<script type="module" src="js/main.js"></script> para su código de módulo.Script externo
<script src="js/start.js"></script> conecta la página con código de una subcarpeta.Script integrado en HTML
<script>console.log("Hello");</script> puede mostrar un mensaje directamente desde una página HTML.Secuencia de escape
crea un salto de línea dentro del texto incluso cuando el código está escrito en una sola línea.Seguimiento de la ejecución
Sentencia
let score = 8; console.log(score);, la sentencia de declaración se ejecuta antes que la sentencia que muestra el valor.Sentencia switch
"4" omite un case 4: numérico a menos que la entrada se haya convertido antes del switch.Sombreado de variables (shadowing)
let total = 2 dentro de un bloque deja un total externo independiente sin cambios cuando termina el bloque.T
Tipado dinámico
let data = 5; data = "five";, typeof data indica el tipo del nuevo valor de cadena de caracteres.Tipo de dato
9 y "9" se muestran de forma similar, pero sus tipos explican por qué sumar uno da resultados distintos.Tolerancia
V
Validación de datos de entrada
Valor falso en contexto booleano (falsy)
0 omite if (quantity), incluso cuando cero es una respuesta permitida en el programa.Valor indefinido (undefined)
let nickname;, leer el enlace inicializado da undefined hasta que se produzca otra asignación.Valor infinito (Infinity)
8 / 0 devuelve Infinity, por lo que la división por cero no siempre genera una excepción.Valor no numérico (NaN)
"heavy" con Number() produce NaN, que Number.isNaN() puede detectar antes de hacer operaciones aritméticas.Valor nulo (null)
null, que el programa puede comprobar antes de intentar llamar a un método de cadena de caracteres.Valor primitivo
Valor verdadero en contexto booleano (truthy)
"false" y "0" superan las comprobaciones de valor en contexto booleano porque ambas contienen caracteres y no están vacías.Variable
distanceKm mantiene la distancia medida disponible para cálculos y mensajes posteriores.Z
Zona muerta temporal
let price interno impide que una lectura anterior en ese mismo bloque acceda a una variable price externa.Sobre esta unidad
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.