Возможный дубликат:
Конфликт булевых значений пустого массива JavaScript
В чем обоснование того факта, что
[ ([] == false), ([] ? 1 : 2) ]
возвращает [true, 1]
?
Другими словами, пустой список логически истинен в булевом контексте, но равен false
.
Я знаю, что использование ===
решает проблему, но каково объяснение этого, по-видимому, совершенно нелогичного выбора?
Техническое объяснение того, как это происходит, в то же время удивительно и пугает, меня больше интересовало то, что стоит за этим дизайном.
Изменить
Я принял очень подробное объяснение Ника Реталлака, даже если это касается только технических причин, почему []==false
истинно: на удивление достаточно, что это происходит потому, что []
, преобразованный в строку, является пустой строкой, а пустым строковым числовым значением является специальным обведенным как 0 вместо более логичного NaN
. С пустым объектом, например, сравнение ({}) == false
возвращает false, потому что строковое представление пустого объекта не является пустой строкой.
Мое любопытство по-прежнему остается тем, что все это просто непредвиденное (и теперь, к сожалению, затвердело в стандарте).