Я бы точно знал, почему выражение, указанное в заголовке
[] == ![]
оценивается как true.
Вы не можете сравнивать массивы как строки. Я понимаю. Если
[] == []
будет оцениваться как false, потому что ссылки разные. Хотя, если у нас есть следующее утверждение.
var arr = [];
arr == arr // this evaluates to true simply because references are the same.
Чтобы A == B вернул true, либо A, либо B должны быть ложными или истинными. A ==! B, чтобы вернуть true A, может быть истинным, а B может быть ложным или наоборот, но в этом случае A и B являются одинаковыми значениями, поэтому я не получаю его.