Transición de C++ a JavaScript

Guía de Analogía para Estudiantes de Programación Estructurada

💡 Principales diferencias a tener en cuenta:

1. Tipos de Datos Primitivos y Variables

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.

C++ (Tipado Estático)

#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;
}

JavaScript (Tipado Dinámico)

// 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.`);

✏️ Ejercicios de Consolidación — Sección 1

  1. Pregunta de Análisis: En C++, si ejecutas 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é?
    Ver Respuesta En JS obtendrás 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.
  2. Ejercicio Práctico: Declara en JavaScript tres variables con 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.
    Ver Respuesta
    const nombre = "Gabriel";
    const anioActual = 2026;
    let matriculado = true;
    
    console.log(`Estudiante: ${nombre} | Año: ${anioActual} | Activo: ${matriculado}`);

2. Estructuras Condicionales y Selectivas

JavaScript mantiene la misma estructura lógica que C++ para tomar decisiones, incorporando condicionales compuestas, selectivas y ternarias.

A. Estructura Condicional `if - else if - else`

C++

int nota = 85;

if (nota >= 90) {
    std::cout << "Excelente\n";
} else if (nota >= 51) {
    std::cout << "Aprobado\n";
} else {
    std::cout << "Reprobado\n";
}

JavaScript

let nota = 85;

if (nota >= 90) {
    console.log("Excelente");
} else if (nota >= 51) {
    console.log("Aprobado");
} else {
    console.log("Reprobado");
}

B. Operador Ternario (`? :`)

C++

int edad = 18;
std::string estado = (edad >= 18) ? "Mayor" : "Menor";
std::cout << estado << std::endl;

JavaScript

let edad = 18;
const estado = (edad >= 18) ? "Mayor" : "Menor";
console.log(estado);

C. Estructura Selectiva `switch`

C++

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";
}

JavaScript

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");
}

✏️ Ejercicios de Consolidación — Sección 2

  1. Pregunta de Diferenciación: ¿Qué imprime el siguiente código JS y por qué difiere de la coerción de tipos tradicional? let x = "5"; if (x === 5) { console.log("Iguales"); } else { console.log("Diferentes"); }
    Ver Respuesta Imprime "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 ===.
  2. Ejercicio Práctico: Reescribe una condición 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.
    Ver Respuesta
    let temperatura = 32;
    let clima = (temperatura > 30) ? "Calor" : "Fresco";
    console.log(clima);

3. Estructuras Iterativas (Bucles) y Sentencias de Control

JavaScript implementa las tres estructuras iterativas clásicas aprendidas en C++ (for, while, do-while) manteniendo el soporte para break y continue.

A. Bucle `for`

C++

for (int i = 0; i < 5; i++) {
    std::cout << "Iteración: " << i << "\n";
}

JavaScript

// Solo reemplazas 'int' por 'let'
for (let i = 0; i < 5; i++) {
    console.log(`Iteración: ${i}`);
}

B. Bucle `while` y sentencia `break`

C++

int i = 0;
while (i < 10) {
    if (i == 5) {
        break; // Interrumpe el ciclo
    }
    std::cout << i << " ";
    i++;
}

JavaScript

let i = 0;
while (i < 10) {
    if (i === 5) {
        break; // Interrumpe el ciclo
    }
    console.log(i);
    i++;
}

C. Bucle `do-while` y sentencia `continue`

C++

int contador = 0;
do {
    contador++;
    if (contador == 3) {
        continue; // Salta a la siguiente iteración
    }
    std::cout << contador << " ";
} while (contador < 5);

JavaScript

let contador = 0;
do {
    contador++;
    if (contador === 3) {
        continue; // Salta a la siguiente iteración
    }
    console.log(contador);
} while (contador < 5);

✏️ Ejercicios de Consolidación — Sección 3

  1. Pregunta Conceptual: ¿Existe alguna diferencia funcional entre el comportamiento de do-while en C++ y en JavaScript en cuanto a la garantía de ejecución?
    Ver Respuesta No, en ambos lenguajes el bucle 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.
  2. Ejercicio Práctico: Escribe un bucle 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.
    Ver Respuesta
    for (let i = 1; i <= 10; i++) {
        if (i % 2 !== 0) {
            continue; // Salta si es impar
        }
        console.log(i);
    }

4. Cadenas (Strings) y Arreglos (Arrays)

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.

C++ (Vector dinámico)

#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

JavaScript (Array nativo)

// Arreglo dinámico por defecto
let numeros = [10, 20, 30];
numeros.push(40); // Insertar

let longitud = numeros.length;
console.log(numeros[0]); // Acceso

✏️ Ejercicios de Consolidación — Sección 4

  1. Pregunta de Análisis: En C++, un arreglo estático 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);?
    Ver Respuesta En JavaScript el arreglo redimensiona dinámicamente su espacio en memoria, añade el valor `4` al final y actualiza automáticamente su propiedad `length` a 4.
  2. Ejercicio Práctico: Dado el arreglo let frutas = ["Manzana", "Banana"];, agrega "Naranja" al final usando el método adecuado e imprime la longitud total del arreglo en la consola.
    Ver Respuesta
    let frutas = ["Manzana", "Banana"];
    frutas.push("Naranja");
    console.log(`Cantidad de frutas: ${frutas.length}`);

5. Funciones, Paso de Parámetros y Recursividad

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

A. Paso de Parámetros por Valor

Al pasar un tipo primitivo (números, booleanos, strings), se pasa una **copia** del valor. Las modificaciones internas no afectan la variable externa.

C++ (Paso por Valor)

#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;
}

JavaScript (Paso por Valor - Primitivos)

function duplicar(x) {
    x = x * 2; // Modifica solo la copia local
}

let num = 10;
duplicar(num);
console.log(num); // Imprime 10

B. Parámetros por Defecto

C++

#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;
}

JavaScript

function saludar(nombre, saludo = "Hola") {
    console.log(`${saludo}, ${nombre}!`);
}

saludar("Carlos");            // Imprime: "Hola, Carlos!"
saludar("Ana", "Bienvenida"); // Imprime: "Bienvenida, Ana!"

C. Recursividad

La lógica de llamadas recursivas y caso base es exactamente idéntica a la estudiada en C++.

C++ (Factorial Recursivo)

int factorial(int n) {
    // Caso base
    if (n <= 1) return 1;
    // Caso recursivo
    return n * factorial(n - 1);
}

JavaScript (Factorial Recursivo)

function factorial(n) {
    // Caso base
    if (n <= 1) return 1;
    // Caso recursivo
    return n * factorial(n - 1);
}

✏️ Ejercicios de Consolidación — Sección 5

  1. Pregunta Teórica: Si pasas un número 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++.
    Ver Respuesta No cambia. Al ser un tipo primitivo (number), JavaScript realiza un paso de parámetro por valor, creando una copia en un marco de pila distinto. Su comportamiento es exactamente idéntico al paso por valor estándar de C++.
  2. Ejercicio Práctico de Recursividad: Escribe una función recursiva en JavaScript llamada potencia(base, exponente) que calcule $base^{exponente}$ asumiendo exponentes enteros $\ge 0$. (Nota: Caso base cuando exponente === 0 retorna 1).
    Ver Respuesta
    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
🚀 Próximo Paso en el Curso: Programación Orientada a Objetos (POO)

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.