Locura aparente de Javascript [duplicar]

Posible duplicado:
Valores booleanos en conflicto de una matriz de JavaScript vacía

¿Cuál es la razón detrás del hecho de que

<code>[ ([] == false), ([] ? 1 : 2) ]
</code>

devoluciones[true, 1]?

En otras palabras, una lista vacía es lógicamente verdadera en un contexto booleano, pero es igual afalse.

Sé que usando=== resuelve el problema, pero ¿cuál es la explicación detrás de esta elección aparentemente totalmente ilógica?

En otras palabras, esto se considera un error en el lenguaje, algo no intencional que acaba de suceder y que no puede solucionarse porque es demasiado tarde o realmente en el diseño del lenguaje que alguien pensó que era genial tener este tipo de locura aparente. Seguro que es bastante confuso para muchos programadores?

La explicación técnica de cómo sucede esto es al mismo tiempo sorprendente y aterradora, sin embargo, estaba más interesado en lo que hay detrás de este diseño.

Editar

Acepté una explicación muy detallada de Nick Retallack, incluso si se trata solo de las razones técnicas de por qué[]==false Es cierto: Sorprendentemente, sucede porque[] convertida en cadena es una cadena vacía y el valor numérico de la cadena vacía tiene un valor especial para ser 0 en lugar de la lógica aparentemente más lógicaNaN. Con un objeto vacío por ejemplo la comparación.({}) == false devuelve falso porque la representación de cadena de un objeto vacío no es la cadena vacía.

Mi curiosidad aún permanece sobre todo esto siendo imprevisto (y ahora, lamentablemente, solidificado en un estándar).

Respuestas a la pregunta(2)

Su respuesta a la pregunta