¿Por qué la conversión de tipo para [] y !![] no devuelve el mismo resultado?
console.log([] == false); // true console.log(!![] == false); // falsePara la primera salida: https://262.ecma-international.org/5.1/#sec-11.9.3
[] == false se evalúa como ToPrimitive([]) == ToNumber(false) que es ToNumber([]) == ToNumber(false) y finalmente 0 == 0 .
La cadena de conversión paso a paso:
Empezamos con [] == false .
Paso 1:
- Si Type(y) es booleano, devuelve el resultado de la comparación x == ToNumber(y).
Ahora, tenemos [] == 0 .
Paso 2:
- Si Type(x) es Object y Type(y) es String o Number, devuelva el resultado de la comparación ToPrimitive(x) == y.
Algunos ejemplos de esta cadena de conversión:
console.log(Number([])); console.log(Number(false)); console.log([0] == false); console.log(['0'] == false); console.log([1] == true); console.log(['1'] == true); console.log(['0'] == 0); console.log([1] == '1'); console.log([1,2,3] == '1,2,3'); Para la segunda salida: una matriz (incluso vacía) es verdad . ![] devuelve falso. !false devuelve true .
Algunos ejemplos:
console.log(Boolean([])); console.log(![]); console.log(!![]);