APRENDIENDO LOS FUNDAMENTOS
Fundamentos de Javascript: Comprendiendo porqué es un lenguaje DINAMICO y DEBIL
Frontend Roadmap: Javascript Parte II
Antes de empezar a explicar todo el universo de los Tipos de Datos en Javascript, debemos continuar entendiendo la sintaxis o el tipo de lenguaje de programación que es Javascript.
En el último post mencionamos que Javascript es un lenguaje de programación de alto nivel, que básicamente significa que fué diseñado para ser fácil de leer, escribir y comprender para los humanos.
Asi que hoy aprenderemos dos conceptos más relacionados al core de Javascript.
Javascript es un lenguaje dinámico y débil. Pero esto no hace referencia sobre su carácter o personalidad :). Asi que ahondemos un poco más en estos conceptos.
¿Qué significa que Javascript en un lenguaje Dinámico?
Javascript es un lenguaje dinámico y no estático, lo que significa que las variables pueden poseer valores de diferentes tipos de datos durante su ejecución. Tú no necesitas explicitamente declarar el tipo de datos que es esa variable en primera instancia. A diferencia de lenguajes como Typescript o Java.
Por ejemplo:
let x = 5; // x es un número
x = "Hola"; // x es ahora un string
x = [1, 2, 3]; // x es ahora un array
En el ejemplo de arriba, la variable x
tiene como valor un número, un string o un array en diferentes momentos de su ejecución. Javascript permite esta flexibilidad sin requerir ninguna declaracion del tipo de variable que es.
Ahora, si tú sabes lenguajes como Typescript (que en realidad en un super set de Javascript) o Java, aquí te muestro el mismo ejemplo pero usando lenguajes de programación estáticos, la otra cara de la moneda.
Ejemplo en Typescript:
let x: number = 5; // x es explícitamente declarada como número
x = "Hola"; // Error: Type 'string' is not assignable to type 'number'
En Typescript, tú explícitamente declaras el tipo de la variable usando anotaciones de tipo. En este ejemplo x
es explícitamente declarada como número usando : number
como anotación de tipo. Cuando intentas asignar un string a la variable x
, Typescript detecta que el tipo no es igual al inicial declarado y arroja un error de compilación.
Ejemplo en Java:
int x = 5; // x es un int
x = "Hola"; // Error: incompatible types: String cannot be converted to int
En Java, declaras variables con tipos específicos usando palabras clave como int
, string
, etc. De manera similar a TypeScript, cuando intentas asignar una cadena a una variable de tipo entero ( x
), el compilador de Java detecta la incompatibilidad de tipos y genera un error de compilación.
Y ¿qué significa que sea un lenguaje de tipado Débil?
Javascript es también un lenguaje de tipado débil y no fuerte, lo que significa que te permite realizar operaciones entre diferentes tipos de datos sin explícitamente convertirlos previamente.
Por ejemplo:
let num = 5; // num es un número
let s = "10"; // s es un string
let resultado = num + s; // JavaScript realiza la coerción implícita
console.log(resultado); // Output: "510"
En el ejemplo anterior, tenemos el número 5
guardado en la variable num
, y el string "10"
guardado en la variable s
. Normalmente, en otros lenguajes de programación, cuando intentamos sumar un tipo número y un tipo string, se esperaría un error, porque ambos son diferentes tipos de datos. Sin embargo, Javascript implícitamente realiza la coerción, que significa que automáticamente convierte el número en string y realiza la operación.
Entonces, en este caso, Javascript convierte el 5
a string y lo concatena con el string "10"
resultando en el string "510"
. La conversión del número a string ocurre implícitamente, sin requerir ninguna instrucción literal a Javascript para hacerlo.
Sin embargo, realizar esta coerción implícita puede a veces generar resultado inesperados si no eres precavido. Es importante estar atentos de cómo Javascript maneja estas conversiones para así evitar cualquier inintencionada consecuencia en tu código.
Y, al igual que en la sección anterior, si conoces lenguajes como Python o Java, aquí está el mismo ejemplo pero usando un lenguaje de programación de tipado fuerte, la otra cara de la moneda.
Ejemplo en Python:
num = 5 # num es un entero
s = "10" # s es una cadena de texto
result = str(num) + s # Error: TypeError: 'int' object is not callable
print(resultado)
En Python, las variables no tienen declaraciones de tipo explícitas, pero aún tienen un tipo específico asociado a ellas. En este ejemplo, num
es un entero, y s
es una cadena de texto. Cuando intentas concatenar num
y s
, Python genera un TypeError
porque no realiza coerción de tipo implícita. Necesitas convertir explícitamente num
a una cadena de texto usando la función str()
para evitar el error.
int num = 5; // num es un entero
String s = "10"; // s es una cadena de texto
String resultado = Integer.toString(num) + s; // No hay coerción de tipo implícita
System.out.println(resultado);
En Java, las variables tienen tipos explícitos que se declaran al definirlas. En este ejemplo, num
es un int
, y s
es un String
. Al concatenar num
y s
, Java no realiza coerción de tipo implícita. En su lugar, necesitas convertir explícitamente num
a una cadena de texto usando el método Integer.toString()
para asegurarte de que la concatenación funcione como se espera.
Preguntas de Entrevista
¿Qué significa que Javascript es un lenguaje de alto nivel?
Significa que provee de un alto nivel de abstracción, por lo que está diseñado para que sea fácil para humanos de leer, escribir y entender.
¿Qué significa que Javascript sea un lenguaje de tipado dinámico y débil?
Significa, primero, que Javascript puede poseer valores con diferentes tipos de datos en una misma variable durante su ejecución [dinámico], y segundo, que puede realizar operaciones entre diferentes tipos de datos sin explicitamente convertirlos previamente [débil]
PD: Si tú eres un hablante nativo en inglés o prefieres aprender estos conceptos usando el idioma más usado en equipos internacionales, puedes consultar la versión gemela de esta publicación. Mismos conceptos, mismas explicaciones, pero en diferente idioma 😉 cada semana.
PD.2: Si deseas escuchar este mismo contenido, puedes visitar el episodio en mi podcast en Spotify ;)