Guía de Analogía para Estudiantes de Programación Estructurada
const (para constantes) y let (para variables reasignables).===): A diferencia de C++, JS posee el operador de igualdad estricta que compara tanto el valor como el tipo de dato.En C++ declaras el tipo de dato de forma estática (int, double, bool, char). En JavaScript, la variable se adapta dinámicamente al valor asignado.
#include <iostream>
#include <string>
int main() {
int edad = 20;
double nota = 95.5;
bool aprobado = true;
std::string nombre = "Ana";
std::cout << nombre << " tiene " << edad << " años.\n";
return 0;
}
// Sin incluye ni función main
let edad = 20;
const nota = 95.5;
let aprobado = true;
const nombre = "Ana";
// Interpolación con template literals (` `)
console.log(`${nombre} tiene ${edad} años.`);
int x = 5 / 2; obtienes 2 debido a la división entera. ¿Qué resultado obtienes en JavaScript al ejecutar let x = 5 / 2; y por qué?
2.5, ya que todos los números en JS pertenecen al tipo primitivo number (representados como punto flotante de 64 bits IEEE 754), eliminando la división entera implícita.
const y let para almacenar tu nombre, el año actual y si estás matriculado en el curso. Imprímelas en consola con una sola cadena mediante template literals.
const nombre = "Gabriel";
const anioActual = 2026;
let matriculado = true;
console.log(`Estudiante: ${nombre} | Año: ${anioActual} | Activo: ${matriculado}`);
JavaScript mantiene la misma estructura lógica que C++ para tomar decisiones, incorporando condicionales compuestas, selectivas y ternarias.
int nota = 85;
if (nota >= 90) {
std::cout << "Excelente\n";
} else if (nota >= 51) {
std::cout << "Aprobado\n";
} else {
std::cout << "Reprobado\n";
}
let nota = 85;
if (nota >= 90) {
console.log("Excelente");
} else if (nota >= 51) {
console.log("Aprobado");
} else {
console.log("Reprobado");
}
int edad = 18;
std::string estado = (edad >= 18) ? "Mayor" : "Menor";
std::cout << estado << std::endl;
let edad = 18;
const estado = (edad >= 18) ? "Mayor" : "Menor";
console.log(estado);
int opcion = 2;
switch(opcion) {
case 1:
std::cout << "Iniciando...\n";
break;
case 2:
std::cout << "Cargando...\n";
break;
default:
std::cout << "Opción no válida\n";
}
let opcion = 2;
// Nota: En JS el switch evalúa con igualdad estricta (===)
switch(opcion) {
case 1:
console.log("Iniciando...");
break;
case 2:
console.log("Cargando...");
break;
default:
console.log("Opción no válida");
}
let x = "5"; if (x === 5) { console.log("Iguales"); } else { console.log("Diferentes"); }
"Diferentes". El operador === verifica tanto valor como tipo de dato (string vs number). Si hubieras usado == habría impreso "Iguales" debido a la conversión automática de tipos de JS, razón por la cual se recomienda siempre usar ===.
if-else simple que determine si una variable temperatura es mayor a 30 grados (retornando "Calor") o no (retornando "Fresco") utilizando el operador ternario en JavaScript.
let temperatura = 32;
let clima = (temperatura > 30) ? "Calor" : "Fresco";
console.log(clima);
JavaScript implementa las tres estructuras iterativas clásicas aprendidas en C++ (for, while, do-while) manteniendo el soporte para break y continue.
for (int i = 0; i < 5; i++) {
std::cout << "Iteración: " << i << "\n";
}
// Solo reemplazas 'int' por 'let'
for (let i = 0; i < 5; i++) {
console.log(`Iteración: ${i}`);
}
int i = 0;
while (i < 10) {
if (i == 5) {
break; // Interrumpe el ciclo
}
std::cout << i << " ";
i++;
}
let i = 0;
while (i < 10) {
if (i === 5) {
break; // Interrumpe el ciclo
}
console.log(i);
i++;
}
int contador = 0;
do {
contador++;
if (contador == 3) {
continue; // Salta a la siguiente iteración
}
std::cout << contador << " ";
} while (contador < 5);
let contador = 0;
do {
contador++;
if (contador === 3) {
continue; // Salta a la siguiente iteración
}
console.log(contador);
} while (contador < 5);
do-while en C++ y en JavaScript en cuanto a la garantía de ejecución?
do-while es una estructura de control post-condicional, lo que garantiza que el bloque de código se ejecute **al menos una vez** antes de evaluar la condición.
for en JavaScript que recorra los números del 1 al 10 y muestre solo los números pares utilizando la sentencia continue para omitir los impares.
for (let i = 1; i <= 10; i++) {
if (i % 2 !== 0) {
continue; // Salta si es impar
}
console.log(i);
}
A diferencia de los arreglos estáticos de C++, los arreglos en JavaScript son estructuras dinámicas equivalentes a un std::vector flexible que puede cambiar de tamaño en tiempo de ejecución.
#include <vector>
#include <iostream>
std::vector<int> numeros = {10, 20, 30};
numeros.push_back(40); // Insertar
int longitud = numeros.size();
std::cout << numeros[0]; // Acceso
// Arreglo dinámico por defecto
let numeros = [10, 20, 30];
numeros.push(40); // Insertar
let longitud = numeros.length;
console.log(numeros[0]); // Acceso
int arr[3] = {1, 2, 3}; no permite agregar un cuarto elemento. ¿Qué sucede en JavaScript si tienes let arr = [1, 2, 3]; y ejecutas arr.push(4);?
let frutas = ["Manzana", "Banana"];, agrega "Naranja" al final usando el método adecuado e imprime la longitud total del arreglo en la consola.
let frutas = ["Manzana", "Banana"];
frutas.push("Naranja");
console.log(`Cantidad de frutas: ${frutas.length}`);
En JS las funciones se definen con la palabra clave function. Los tipos de datos primitivos en JS siempre se pasan **por valor**, imitando el paso por valor por defecto de C++.
Al pasar un tipo primitivo (números, booleanos, strings), se pasa una **copia** del valor. Las modificaciones internas no afectan la variable externa.
#include <iostream>
void duplicar(int x) {
x = x * 2; // Modifica solo la copia local
}
int main() {
int num = 10;
duplicar(num);
std::cout << num; // Imprime 10
return 0;
}
function duplicar(x) {
x = x * 2; // Modifica solo la copia local
}
let num = 10;
duplicar(num);
console.log(num); // Imprime 10
#include <iostream>
void saludar(std::string nombre, std::string saludo = "Hola") {
std::cout << saludo << ", " << nombre << "!\n";
}
int main() {
saludar("Carlos"); // Usa valor por defecto
saludar("Ana", "Bienvenida"); // Reemplaza valor
return 0;
}
function saludar(nombre, saludo = "Hola") {
console.log(`${saludo}, ${nombre}!`);
}
saludar("Carlos"); // Imprime: "Hola, Carlos!"
saludar("Ana", "Bienvenida"); // Imprime: "Bienvenida, Ana!"
La lógica de llamadas recursivas y caso base es exactamente idéntica a la estudiada en C++.
int factorial(int n) {
// Caso base
if (n <= 1) return 1;
// Caso recursivo
return n * factorial(n - 1);
}
function factorial(n) {
// Caso base
if (n <= 1) return 1;
// Caso recursivo
return n * factorial(n - 1);
}
let a = 15; a una función que modifica ese parámetro en JavaScript, ¿cambia el valor de la variable a fuera de la función? Explica la razón por analogía con C++.
potencia(base, exponente) que calcule $base^{exponente}$ asumiendo exponentes enteros $\ge 0$. (Nota: Caso base cuando exponente === 0 retorna 1).
function potencia(base, exponente) {
// Caso base
if (exponente === 0) {
return 1;
}
// Caso recursivo
return base * potencia(base, exponente - 1);
}
console.log(potencia(2, 3)); // Resultado: 8
Con el dominio de la sintaxis estructurada y las analogías respecto a C++, en los siguientes temas entraremos de lleno a la creación de clases con class, métodos constructores, instanciación de objetos y el manejo del contexto this en JavaScript.