Все значения 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 nullundefinedNaN-
document.all(только в браузерах HTML)- это странно.
document.allобъект falsey, сtypeofasundefined. Это была функция 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.
