Se ([] == false) for verdadeiro, por que ([] || true) resulta em []?

Estava apenas fazendo alguns testes e acho isso estranho:

[] == false

Verdadeiro, isso faz sentido, porque double igual apenas compara o conteúdo e não o tipo e tenta fazer coerção de tipo. Mas se comparar conteúdo e retornar verdadeiro, isso significa [] é falsey (se você fez[] == true você também é falso), o que significa:

[] || false

Deve dar falso, mas dá [], tornando-o verdade? Por quê?

Outro exemplo:

"\n  " == 0

Dá verdade, mas"\n " || false dá"\n "? Existe uma explicação para isso ou é apenas uma estranheza.

Quando tentei isso em C, obtemos:

int x = "\n " == 0;
printf("%d\n", x);

int y = "\n " || 0;
printf("%d\n", y);

Saídas:

0
1

Isso faz sentido, mas, dada a influência de C no Javascript, o comportamento é diferente.

questionAnswers(3)

yourAnswerToTheQuestion