Ответ 1
Значения Falsey в JavaScript
-
false
-
0
и другие формы числового нуля, такие как-0
,0.0
и0x0
(кредит RBT для гексагональной формы) -
""
,''
и''
- строки длины 0 -
null
-
undefined
-
NaN
-
document.all
(только в браузерах HTML)- Это странно.
document.all
- объект с ложью, сtypeof
какundefined
. Это была проприетарная функция Microsoft в IE до IE11 и была добавлена в спецификацию HTML как "преднамеренное нарушение спецификации JavaScript", так что сайты, написанные для IE, не нарушались при попытке доступа, напримерdocument.all.something
; это ложь, потому чтоif (document.all)
раньше был популярным способом обнаружения IE, перед условными комментариями. См. Почему document.all ложь? для подробностей
- Это странно.
"Falsey" просто означает, что внутренняя функция ToBoolean
JavaScript возвращает false
. !value
ToBoolean
!value
, value?... :...;
value?... :...;
и if (value)
. Здесь его официальная спецификация (рабочий проект 2018 года) (единственное изменение с момента первой спецификации ECMAscript в 1997 году - это добавление символов ES6, которые всегда правдивы):
Сравнение с ==
(свободное равенство)
Стоит рассказать о слабых сравнениях фальшивых значений с ==
, который использует ToNumber()
и может вызвать некоторую путаницу из-за основных различий. Они эффективно образуют три группы:
-
false, 0, -0, "", ''
все совпадают друг с другом с==
- например,
false == ""
,'' == 0
и, следовательно,4/2 - 2 == 'some string'.slice(11);
- например,
-
null, undefined
match with==
- например
null == undefined
ноundefined != false
- Также стоит упомянуть, что, хотя
typeof null
возвращает'object'
,null
не является объектом, это давняя ошибка /quirk, которая не была исправлена, чтобы поддерживать совместимость. Это не истинный объект, а объекты правдивы (за исключением этого "преднамеренного нарушения"document.all
когда Javascript реализован в HTML)
- например
-
NaN
ничего не соответствует, с==
или===
, даже не сам- например
NaN != NaN
,NaN !== NaN
,NaN != false
,NaN != null
- например
При "строгом равенстве" (===
) таких группировок нет. Только false
===
false
.
Это одна из причин, почему многие разработчики и многие руководства по стилям (например, standardjs) предпочитают ===
и почти никогда не используют ==
.
Значения Truthy, которые на самом деле == false
"Truthy" просто означает, что внутренняя функция ToBoolean
JavaScript возвращает true
. Причуда Javascript, о которой нужно знать (и еще одна веская причина предпочесть ===
over ==
): возможно, чтобы значение было правдивым (ToBoolean
возвращает true
), но также == false
.
Вы можете подумать, if (value && value == false) alert('Huh?')
Является логической невозможностью, которой этого не может быть, но это будет, для:
-
"0"
и'0'
- это непустые строки, которые являются правдивыми, но Javascript==
сопоставляет числа с эквивалентными строками (например,42 == "42"
). Поскольку0 == false
, если"0" == 0
,"0" == false
. -
new Number(0)
иnew Boolean(false)
- это объекты, которые являются правдивыми, но==
видят их значения, которые== false
. -
0.toExponential();
- объект с числовым значением, равным0
- Любые подобные конструкции, которые дают вам значение с ложным выравниванием, завернутое в тип, который является правдивым
-
[]
,[[]]
и[0]
(спасибо cloudfeet для ссылки JavaScript Equality Table)
Некоторые более правдивые ценности
Это всего лишь несколько ценностей, которые некоторые люди могут ожидать, что они ложны, но на самом деле правдивы.
-
-1
и все ненулевые отрицательные числа -
' '
," "
,"false"
,'null'
... все непустые строки, включая строки, которые являются просто пробелами -
Любое из
typeof
, которое всегда возвращает непустую строку, например:-
typeof null
(возвращает строку'object'
из-за многолетней ошибки /quirk) -
typeof undefined
(возвращает строку'undefined'
)
-
-
Любой объект (за исключением того, что "преднамеренное нарушение"
document.all
в браузерах, помните, чтоnull
не является действительно объектом, несмотря на то, чтоtypeof
предлагает другое). В том числе:-
{}
-
[]
-
function(){}
или() => {}
(любая функция, включая пустые функции) -
Error
и любой экземплярError
- Любое регулярное выражение
- Все, что создано с
new
(включаяnew Number(0)
иnew Boolean(false)
)
-
- Любой символ
true
, 1
, "1"
и [1]
возвращают true
если сравнивать друг с другом с ==
.