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