Loucura aparente de Javascript [duplicado]

Duplicata Possível:
Valores booleanos conflitantes de um array JavaScript vazio

Qual é a razão por trás do fato de que

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

devolve[true, 1]?

Em outras palavras, uma lista vazia é logicamente verdadeira em um contexto booleano, mas é igual afalse.

Eu sei que usando=== resolve a questão, mas qual é a explicação por trás dessa escolha aparentemente totalmente ilógica?

Em outras palavras, isso é considerado um erro na linguagem, algo não intencional que acabou de acontecer e que não pode ser consertado porque é tarde demais ou realmente no design da linguagem alguém achou legal ter esse tipo de loucura aparente que eu sou com certeza é bastante confuso para muitos programadores?

A explicação técnica de como isso acontece é ao mesmo tempo incrível e assustadora, mas eu estava mais interessado no que está por trás desse design.

Editar

Eu aceitei uma explicação muito detalhada de Nick Retallack, mesmo que seja apenas sobre as razões técnicas do porquê[]==false é verdade: surpreendentemente, isso acontece porque[] convertido em string é uma string vazia e o valor numérico da string vazia é especial para ser 0 em vez do aparentemente mais lógicoNaN. Com um objeto vazio, por exemplo, a comparação({}) == false retorna false porque a representação de string de um objeto vazio não é a string vazia.

Minha curiosidade ainda permanece sobre tudo isso sendo apenas imprevisto (e agora, infelizmente, solidificado em um padrão).

questionAnswers(2)

yourAnswerToTheQuestion