¿Qué es exactamente la coerción de tipos en Javascript?
¿Qué es exactamente la coerción de tipos en Javascript?
Por ejemplo, sobre el uso de ==
en lugar de ===
?
La coerción de tipo significa que cuando los operandos de un operador son de diferentes tipos, uno de ellos se convertirá en un valor "equivalente" del tipo del otro operando. Por ejemplo, si lo hace:
boolean == integer
el operando booleano se convertirá en un número entero: false
se convierte 0
en true
1. Luego se comparan los dos valores.
Sin embargo, si utiliza el operador de comparación sin conversión ===
, no se produce dicha conversión. Cuando los operandos son de diferentes tipos, este operador devuelve false
y solo compara los valores cuando son del mismo tipo.
La coerción no la realizan únicamente los operadores de comparación, aunque son los únicos que tienen variantes tanto "estrictas" como "flexibles". La mayoría de los operadores aritméticos convertirán automáticamente argumentos no numéricos en números, por ejemplo, "50" / 5
se trata como 50 / 5
. También hay muchas funciones y métodos integrados que requieren argumentos de cadena; si les das algo más, automáticamente los obligarán a convertirse en cadenas.
Pero tenga cuidado: +
es tanto el operador de suma aritmética como el operador de concatenación de cadenas; si lo hace string + number
, convierte el número en una cadena y la concatena, en lugar de convertir la cadena en un número y sumar. Esta es la fuente de muchos errores cometidos al realizar aritmética en la entrada del usuario, ya que la entrada es una cadena a menos que la convierta explícitamente.
Puede encontrar una buena explicación de las reglas de coerción de JavaScript en You Don't Know JS y más documentación orientada a referencia en MDN .
Comencemos con una breve introducción a los sistemas de tipos que creo que le ayudará a comprender la idea general de coerción de tipos.
El sistema de tipos de un idioma define reglas que nos dicen qué tipos de datos existen en ese idioma y cómo se pueden combinar usando diferentes operadores. Por ejemplo, una de esas reglas podría especificar que el operador más (+) solo actúa sobre números. Estas reglas existen principalmente para evitar que usted se dispare en el pie. Pero ¿qué pasa cuando el programador infringe esa regla en el programa? No hay nada que impida al programador escribir {} + {}
o “hello” + 5
entrar en un programa, incluso si el lenguaje no cree que esas expresiones tengan ningún sentido.
Lo que finalmente suceda en esas situaciones depende de cuán estricto sea el lenguaje con respecto a sus reglas de tipos.
Un sistema de tipos de idiomas a menudo tiene una de dos posiciones sobre si usted rompe sus reglas:
- Di "¡Oye, eso no está bien!" e inmediatamente bloquea su programa.
- Diga "No puedo hacer nada con {}... pero puedo hacer algo con números" e intente convertir {} en un número.
Los lenguajes con sistemas de tipos que ocupan la primera posición respecto de sus reglas se denominan coloquialmente lenguajes "fuertemente tipificados". Son estrictos en cuanto a no permitirte romper sus reglas. Aquellos que adoptan el segundo enfoque (como JavaScript) se denominan lenguajes de “tipo débil” o “de tipo libre”. Claro, puedes romper las reglas, pero no te sorprendas cuando convierta el tipo de datos que describiste en tu programa a la fuerza para cumplir con sus reglas. Esa conducta se conoce como… (redoble de tambores)… tipo coerción .
Ahora veamos algunos ejemplos en JavaScript. Primero, comencemos con una expresión que no conduzca a coerción de tipos.
5 + 5
Usar el operador + con dos números que es perfectamente válido. El programa considerará que + significa "sumar" y felizmente sumará los dos números. No es necesaria ninguna conversión.
Pero que pasa …
[] + 5
UH oh. En JavaScript, +
puede significar sumar dos números o concatenar dos cadenas. En este caso, no tenemos ni dos números ni dos cadenas. Sólo tenemos un número y un objeto. Según las reglas de tipos de JavaScript, esto no tiene sentido lógico. Dado que te perdona si rompes sus reglas, en lugar de fallar, intenta encontrarle sentido de todos modos. Entonces, ¿qué hace JavaScript? Bueno, sabe cómo concatenar cadenas, por lo que convierte [] y 5 en cadenas y el resultado es el valor de cadena "5".
¿ Cuál es el problema con los operadores de comparación ==
y ===
? ¿Por qué hay dos operadores de comparación?
==
no es inmune al comportamiento de conversión de tipos de JavaScript. Expresiones como 5 == “5”
se evaluarán como verdaderas porque JavaScript intentará convertir una de ellas para comparar el mismo tipo de datos.
En muchos casos, eso no es deseable porque probablemente quieras saber si algunos datos con los que estás comparando son de un tipo diferente para poder decidir qué hacer al respecto. Ahí es donde ===
entra en juego el operador. Cuando utilice ===
, no se realizará ninguna conversión de tipos. Por lo tanto, la expresión 5 === “5”
se evaluará como falsa.
En Python, si intentas agregar, digamos, cadenas y números enteros, obtienes un error:
>>> "hi" + 10
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
Sin embargo, en JavaScript, no es así. Se 10
convierte en una cadena:
> "hi" + 10
"hi10"
"Coerción de tipo" es sólo un nombre elegante e inapropiado para lo anterior. En realidad, ninguno de los lenguajes tiene "tipos" en el sentido de Java o C u otros lenguajes con sistemas de tipos estáticos. La forma en que los lenguajes tratan las interacciones entre los diversos valores no tipados estáticamente es una cuestión de elección y convención.
Déjame explicarte el tipo de coerción con el siguiente ejemplo.
Type Coercion significa que Javascript convierte automáticamente (sobre la marcha) una variable de un tipo de datos a otro
Ej: 123 + "4"
generalmente genera un error pero en Javascript debido a la coerción de tipos, da como resultado 1234
una cadena
if(23 == "23"){
console.log(" this line is inside the loop and is executed ");
}
En el código anterior, debido a la coerción de tipos, JavaScript piensa que 23
(número) y "23"
(cadena) son lo mismo. esto hace que la condición sea verdadera e imprime el archivo console.log
En el otro caso
if(23 === "23"){
console.log(" this line is inside the loop and is NOT executed");
}
En ===
caso de que Javascript no realice Type Coercion, y dado que 23
es un número y "23"
es una cadena, debido a que ===
estos dos tipos de datos son diferentes, eso conduce a una condición falsa. No imprime el console.log
En palabras simples
En este caso =
es un operador de asignación, que asigna valores como var a = 3;
, etc.
(Los operadores a continuación son para comparar)
En este caso, ==
Javascript convierte/coacciona el tipo de datos a otro y luego lo compara.
En este caso ===
, Javascript no convierte/coacciona el tipo de datos
Para evitar errores y con fines de depuración ===
se utiliza principalmente
Por favor, hágame saber la exactitud de la información anterior.
¿Qué es la coerción?
La coerción de tipos en javascript ocurre cuando el motor Javascript tiene que realizar una determinada operación para la cual necesita que los datos sean de un determinado tipo. Cuando el motor encuentra datos de un determinado tipo que no son aplicables para la operación, los obliga a convertirlos en un determinado tipo. Esto es necesario porque las variables en JavaScript se escriben dinámicamente, lo que significa que a una variable determinada se le puede asignar un valor de cualquier tipo.
Ejemplo:
if(1){
// 1 gets coerced to true
}
if(4 > '3') {
// 3 gets coerced into a number
}
44 == "44" // true, the string 44 gets converted to a nr
Coerción booleana:
En la coerción de JavaScript, todos los valores se convierten a true
excepción de los siguientes valores a los que se fuerza false
:
console.log(!!""); // false
console.log(!!0); // false
console.log(!!null); // false
console.log(!!undefined); // false
console.log(!!NaN); // false
console.log(!!false); // false
Observe también que en el ejemplo anterior el doble ! Se utiliza el operador. El ! El operador de marca convierte un valor en un valor booleano con el valor opuesto. Podemos usar este operador dos veces para convertir cualquier valor en booleano.