¿Qué es exactamente la coerción de tipos en Javascript?

Resuelto gespinha asked hace 11 años • 9 respuestas

¿Qué es exactamente la coerción de tipos en Javascript?

Por ejemplo, sobre el uso de ==en lugar de ===?

gespinha avatar Nov 12 '13 03:11 gespinha
Aceptado

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: falsese convierte 0en true1. 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 falsey 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" / 5se 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 .

Barmar avatar Nov 11 '2013 21:11 Barmar

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” + 5entrar 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:

  1. Di "¡Oye, eso no está bien!" e inmediatamente bloquea su programa.
  2. 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.

linstantnoodles avatar Jul 08 '2016 03:07 linstantnoodles

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 10convierte 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.

Claudiu avatar Nov 11 '2013 20:11 Claudiu

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 1234una 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 23es 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.

PRagh avatar Apr 05 '2018 19:04 PRagh

¿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 trueexcepció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
Expandir fragmento

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.

Willem van der Veen avatar Sep 07 '2018 08:09 Willem van der Veen