Conversión automática de tipos de datos
Como ya sabes, las cadenas en JavaScript deben encerrarse entre comillas. Puede ocurrir que todos los caracteres de la cadena sean dígitos:
let a = '123';
En este caso, la variable a también es
una cadena, pero con un matiz.
La esencia del matiz es la siguiente: si se realiza una operación matemática sobre una cadena con dígitos, esta operación se ejecutará como si realmente tuviéramos números, no cadenas:
alert('2' * '3'); // mostrará 6
En este caso, JavaScript ve que estamos intentando ejecutar una operación no válida para cadenas, pero sí válida para números.
También ve que, en realidad, nuestras cadenas son números entre comillas. Por lo tanto, JavaScript convierte automáticamente estas cadenas a números y realiza la operación matemática correspondiente con ellos.
Esto funciona si nuestras cadenas solo contienen
dígitos. Si hay al menos una letra,
JavaScript considerará la operación incorrecta
y dará como resultado el valor NaN:
alert('2' * '3s'); // mostrará NaN
Además, la conversión automática ocurre si la operación es matemáticamente correcta, pero no válida para cadenas.
Por ejemplo, las cadenas no se pueden (pero los números sí) multiplicar, dividir, restar, por lo que en todas esas operaciones habrá una conversión automática de cadenas con dígitos a números.
Sin embargo, las cadenas, al igual que los números, se suman
con el operador +. Esto significa
que, en el caso de la suma, no habrá conversión automática:
let a = '1' + '2';
alert(a); // mostrará '12' - ocurrió una concatenación de cadenas
Si uno de los sumandos es un número y el otro es una cadena, siempre gana la cadena:
let a = 1 + '2';
alert(a); // mostrará '12'
En tales casos, JavaScript, por el contrario, convierte automáticamente los números a cadenas y realiza la concatenación de cadenas.
Sin embargo, hay matices cuando hay más de dos sumandos: en este caso, la conversión a un tipo específico depende del orden de ejecución de las operaciones.
En el siguiente ejemplo, primero 2 y 3
se sumarán como números, y luego el resultado se sumará
a la cadena '1' pero como la cadena '5',
lo que finalmente dará la cadena '15':
let a = '1' + (2 + 3);
alert(a); // mostrará '15'
Si se quitan los paréntesis, todo se sumará
de izquierda a derecha. Es decir, primero al número '1'
se le sumará el número 2 y como resultado
se obtendrá la cadena '12'. Luego a esta
cadena se le sumará el número 3 y como resultado
se obtendrá la cadena '123':
let a = '1' + 2 + 3;
alert(a); // mostrará '123'
Pero en el siguiente ejemplo, los números 2
y 3 están escritos al principio, por lo que primero
se sumarán como números, dando como resultado
el número 5, y luego a este número se le sumará
la cadena '1', dando finalmente la cadena '51':
let a = 2 + 3 + '1';
alert(a); // mostrará '51'
Sin ejecutar el código, determina qué se mostrará en pantalla:
let a = '5' + '2';
alert(a);
Sin ejecutar el código, determina qué se mostrará en pantalla:
let a = '5' + 2;
alert(a);
Sin ejecutar el código, determina qué se mostrará en pantalla:
let a = 5 + '2';
alert(a);
Sin ejecutar el código, determina qué se mostrará en pantalla:
let a = 5 + 2;
alert(a);
Sin ejecutar el código, determina qué se mostrará en pantalla:
let a = '5' * '2';
alert(a);
Sin ejecutar el código, determina qué se mostrará en pantalla:
let a = '5' - '2';
alert(a);
Sin ejecutar el código, determina qué se mostrará en pantalla:
let a = '5' / '2';
alert(a);
Sin ejecutar el código, determina qué se mostrará en pantalla:
let a = '5' % '2';
alert(a);
Sin ejecutar el código, determina qué se mostrará en pantalla:
let a = '5s' * '2';
alert(a);
Sin ejecutar el código, determina qué se mostrará en pantalla:
let a = '5s' + '2';
alert(a);
Sin ejecutar el código, determina qué se mostrará en pantalla:
let a = (-'5') + (-'2');
alert(a);
Sin ejecutar el código, determina qué se mostrará en pantalla:
let a = '5' * 1 + '2' * 1;
alert(a);
Sin ejecutar el código, determina qué se mostrará en pantalla:
let a = '5' * '1' + '2' * '1';
alert(a);
Sin ejecutar el código, determina qué se mostrará en pantalla:
let a = '' + 3 + 1;
alert(a);