Все значения falsey в JavaScript
каковы значения в JavaScript, которые являются "falsey", что означает, что они оценивают как false в таких выражениях, как if(value)
, value ?
и !value
?
здесь некоторые обсуждения цели значений falsey на переполнении стека уже, но нет исчерпывающего полного ответа с перечислением всех значений falsey.
я не смог найти полный список в MDN JavaScript Reference, и я был удивлен найдите, что лучшими результатами при поиске полного, авторитетного списка значений falsey в JavaScript были статьи в блогах, некоторые из которых имели очевидные упущения (например, NaN
), и ни один из которых не имел формата, подобного переполнению стека, где комментарии или альтернативные ответы могли быть добавлены, чтобы указать на причуды, сюрпризы, упущения, ошибки или предостережения. Казалось, смысл его делать.
3 ответов
Falsey значения в JavaScript
false
-
0
и другие формы числового нуля, такие как-0
,0.0
и0x0
(кредит RBT для шестнадцатеричной формы) -
""
,''
и``
- строки длиной 0 null
undefined
NaN
-
document.all
(только в браузерах HTML)- это странно.
document.all
объект falsey, сtypeof
asundefined
. Это была функция Microsoft-proprietory в IE до IE11 и была добавлена в HTML spec как "умышленное нарушение спецификации JavaScript" чтобы сайты, написанные для IE, не ломались при попытке доступа, например,document.all.something
; это ложь, потому чтоif (document.all)
раньше был популярным способом обнаружения IE перед условными комментариями. См.почему документ.все ложь? дополнительные сведения
- это странно.
"Falsey" просто означает, что внутренний JavaScript ToBoolean
возвращает функция false
. ToBoolean
в основе !value
, value ? ... : ...;
и if (value)
. Вот его официальная спецификация (2018 рабочий проект) (единственное изменение с самая первая спецификация ECMAscript в 1997 добавление ES6 в это Символы, которые всегда честная):
сравнения с ==
(свободное равенство)
стоит говорить о фальшивых ценностях'свободные сравнения с ==
, который использует ToNumber()
и может вызвать некоторую путаницу из-за основных различий. Они эффективно образуют три группы:--150-->
-
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
"Truthy" просто означает, что внутренний JavaScript ToBoolean
возвращает функция true
. причуда Javascript, чтобы быть в курсе (и еще одна веская причина предпочесть ===
над ==
): это возможно для значения, чтобы быть правдивым (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
- любые подобные конструкции, которые дают вам значение false-equaling, завернутое в тип, который является истинным
-
[]
,[[]]
и[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
по сравнению друг с другом ==
.
просто добавьте в список @ user568458 ложных значений:
-
В дополнение к целому числу 0, то десятичное число 0.0, 0.00 или любой такой zeroish-это тоже ложь значение.
var myNum = 0.0; if(myNum){ console.log('I am a truthy value'); } else { console.log('I am a falsy value'); }
над фрагментом кода печатает
I am a falsy value
-
аналогично шестнадцатеричное представление числа 0 также является ложным значением, как показано ниже фрагмента кода:
var myNum = 0x0; //hex representation of 0 if(myNum){ console.log('I am a truthy value'); } else { console.log('I am a falsy value'); }
над фрагментом кода снова печатает
I am a falsy value
.