Transmissão de tipo JavaScript

Considere a matriz JavaScript vazia:

var a = [];
alert(a == false); // shows true
alert(!a); // shows false!

Como explicar isso? Quais são as regras?