JavaScript - Coerción de datos

Se podría decir que coerción es la acción de forzar a que un objeto se comporte como si fuera de otro tipo. Sin lugar a dudas, éste es uno de los aspectos más interesantes de JavaScript. Al ser un lenguaje débilmente tipado y dinámico, no es necesario especificar el tipo de dato para las variables porque el tipo está asociado al valor (duck typing*), esto hace que en tiempo de ejecución podamos cambiar el valor de las variables sin ningún problema.
3 + 3 //6
3 + "3" //33
"hello" + " world" //"hello world"
"It's " + false //"It's false"
"cafe" + {tipo: "cortado"} //"cafe" [object Object]
Una de las ventajas de esta característica, es que podemos comprobar la existencia de un objeto mediante su valor, por lo que JavaScript permite implementar muy fácil algunos principios OOP como la sobrecarga de métodos (overload), sobrescritura de métodos (override) y polimorfismo.

Duck Typing
El Duck Typing, en los lenguajes de programación, es una técnica para determinar si un objeto es una instacia de una determinada clase basándose únicamente en los métodos que implementa.
La idea tras este paradigma es sencillo: si el objeto analizado posée un cierto conjunto de propiedades características (o exclusivas) de un objeto determinado, es muy probable que se trate de ese mismo objeto.
«Si parece un pato, anda como un pato y hace ‘cuack’ como los patos, es un pato.»
Una de las herramientas que ofrece el lenguaje para aproximarnos es el comando typeof(), cuya sintaxis es la siguiente:
typeof operando;
// o
typeof (operando);
El operador typeof devuelve una cadena indicando el tipo de datos del operando.
Operador de igualdad ( == )
Este operador compara los valores que hay al lado izquierdo y derecho de el, cuando son del mismo tipo compara los valores y de ser iguales retorna true y de lo contrario false.
| x | y | resultado |
| null | undefined | true |
| undefined | null | true |
| number | string | x == toNumber(y) |
| string | number | toNumber(x) == y |
| boolean | any | toNumber(x) == y |
| any | boolean | x == toNumber(y) |
| string, number, or symbol | Object | x == toPrimitive(y) |
| Object | string, number, or symbol | toPrimitive(x) == y |
| otros casos | false |
ejemplos:
3 == "3" // true
true == 1 // true
2 == "two" // false
Operador de adición y sustracción
En el caso de la adición (+) si ambos lados de la operación son números, se realizará la operación matemática suma, de lo contrario, se concatenarán los valores de ambos lados como Strings. En el caso de la sustracción (-) siempre realizará la operación matemática restar, en el caso de que ambos lados no sean números, los strings y booleans son convertidos a números y se realiza la operación matemática, en otros casos el resultado será NaN (Not a Number).
Truthy y falsy
Un valor truthy es aquel que evaluado en un contexto booleano da como resultado true, del mismo modo, un valor falsy es aquel que evaluado en un contexto booleano da como resultado false, en JavaScript todos los valores son true excepto:
- false
- 0
- ""
- ''
- null
- undefined
- NaN
Objetos
Caso {} + [] = 0
En este caso, lo que sucede es que los brackets vacíos al inicio {} son interpretados como bloque de código vacío, por lo cual son ignorados por JS.
{} + []
+[] //JS ignora el lado izquierdo de la operación
Number([]) //El lado restante es convertido a número
0 //Valor resultante
Caso [] + {}
[] + {}
String([]) + String({}) //Ambos lados de la operación son convertidos a string para ser concatenados
'' + '[object Object]' //Se concatenan los resultados
'[object Object]' //Valor resultante



