Какие значения в JavaScript являются «ложными» , что означает, что они оцениваются как ложные в выражениях типа if(value)
, value ?
и !value
?
Есть некоторые дискуссии о назначении значений Falsey для переполнения стека , но нет исчерпывающего полного ответа, в котором перечислены все значения Falsey.
Я не смог найти полный список в Справочнике по MDN JavaScript , и с удивлением обнаружил, что лучшими результатами при поиске полного, достоверного списка значений Falsey в JavaScript были статьи в блогах, некоторые из которых имели очевидные упущения (например, NaN
), и ни один из которых не имел такого формата, как переполнение стека, в котором можно было бы добавить комментарии или альтернативные ответы, чтобы указать на причуды, неожиданности, упущения, ошибки или предостережения. Таким образом, казалось, имеет смысл сделать один.
источник
if()
вкладка для правдивости.[[]] == ""
но[] != []
? У меня болит голова ...Ответы:
Ложные значения в JavaScript
false
Number
типа:0
а также-0
,0.0
и шестигранная форма0x0
( благодаря RBT )BigInt
типа:0n
и-0n
(новое в 2020 году, спасибо GetMeARemoteJob )""
,''
И``
- строки длины 0null
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
.ToBoolean
лежит в основе!value
,value ? ... : ...;
иif (value)
. Вот его официальная спецификация (рабочий проект 2020 года) (единственными изменениями с самой первой спецификации ECMAscript в 1997 году являются добавление символов ES6 , которые всегда соответствуют действительности, иBigInt
, как уже упоминалось выше:Сравнения с
==
(слабое равенство)Стоит поговорить о ложных сравнениях с
==
ложными значениями , которые используютToNumber()
и могут вызвать некоторую путаницу из-за основных различий. Они эффективно образуют три группы:false, 0, -0, "", ''
все соответствуют друг другу с==
false == ""
,'' == 0
и, следовательно,4/2 - 2 == 'some string'.slice(11);
null, undefined
совпадать с==
null == undefined
ноundefined != false
typeof null
возвращается'object'
,null
это не объект, это давняя ошибка / причуда , которая не была установлена для того , чтобы обеспечить совместимость. Это не настоящий объект, и объекты являются правдивыми (за исключением того "преднамеренного нарушения",document.all
когда Javascript реализован в HTML)NaN
ничего не соответствует, с==
или===
даже сам по себе неNaN != NaN
,NaN !== NaN
,NaN != false
,NaN != null
При «строгом равенстве» (
===
) таких группировок нет. Толькоfalse
===
false
.Это одна из причин, по которой многие разработчики и многие руководства по стилю (например, standardjs ) предпочитают
===
и почти никогда не используют==
.Истинные ценности, которые на самом деле
== false
«Правда» означает, что внутренняя
ToBoolean
функция JavaScript возвращаетсяtrue
. Причудливый Javascript, о котором нужно знать (и еще одна веская причина, чтобы предпочесть===
более==
): это возможно значение , которое должно быть truthy (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 равенства )Еще несколько правдивых ценностей
Это всего лишь несколько ценностей, которые некоторые люди могут считать ложными, но на самом деле они правдивы.
-1
и все ненулевые отрицательные числа' '
," "
,"false"
,'null'
... все непустые строки, в том числе строк, которые только пробельныеВсе
typeof
, что от , которое всегда возвращает непустую строку, например:typeof null
(возвращает строку'object'
из-за давней ошибки / причуды )typeof undefined
(возвращает строку'undefined'
)Любой объект (кроме этого «преднамеренного нарушения»
document.all
в браузерах; помните, что наnull
самом деле это не объект, несмотря наtypeof
предположение об обратном). Включая:{}
[]
function(){}
или() => {}
(любая функция, включая пустые функции)Error
и любой случайError
new
(в том числеnew Number(0)
иnew Boolean(false)
)true
,1
,"1"
И[1]
возвращениеtrue
по сравнению друг с другом==
.источник
!
,if
и?..:
имеют в общем , что они называют внутреннююToBoolean
функцию по значению. Как эти ценности ведут себя в контексте!
,if
и т.д., уже подразумевает их название: они «falsy» значения. Я немного боюсь , что другие будут читать ответ и думают : «О , так в этом контексте (!
,if
,?...:
), то значениеfalse
, но!!
, этоtrue
» , но не понимаю основную концепции. Два других момента: 1)v ? true : false
это просто многословный способ!!v
. 2)typeof
всегда возвращает непустую строку, что является правдой.typeof null
илиtypeof undefined
конкретно. Вы могли бы просто сказать, что непустые строки правдивы.document.all
это тоже обман .x == false
вызовToNumber(x)
будет просто очень отличается отToBoolean(x)
. Возможно, стоит объяснить. Также я только что заметил, что уже прокомментировал этот ответ давным-давно: DНе забывайте о непустой строке,
"false"
которая оценивается какtrue
источник
:-)
Просто чтобы добавить в список ложных значений @ user568458:
В дополнение к целому числу 0 десятичное число 0,0, 0,00 или любое такое нулевое число также является ложным значением.
Вышеупомянутые фрагменты кода
I am a falsy value
Аналогично, шестнадцатеричное представление числа 0 также является ложным значением, как показано в следующем фрагменте кода:
Над фрагментом кода снова печатается
I am a falsy value
.источник
0
,0x0
,0.0
И0.00
просто разные литералов для одной и той же IEEE-754 64-битного нулевого значения с плавающей запятой.В дополнение к теме, с ES2020 у нас есть новое значение, которое ложно, это BigInt ноль (0n):
Таким образом, теперь у нас есть всего 7 «ложных» значений (не считая document.all, как упоминалось пользователем выше, поскольку он является частью DOM, а не JS).
источник