Все значения falsey в JavaScript

каковы значения в JavaScript, которые являются "falsey", что означает, что они оценивают как false в таких выражениях, как if(value), value ? и !value?


здесь некоторые обсуждения цели значений falsey на переполнении стека уже, но нет исчерпывающего полного ответа с перечислением всех значений falsey.

я не смог найти полный список в MDN JavaScript Reference, и я был удивлен найдите, что лучшими результатами при поиске полного, авторитетного списка значений falsey в JavaScript были статьи в блогах, некоторые из которых имели очевидные упущения (например, NaN), и ни один из которых не имел формата, подобного переполнению стека, где комментарии или альтернативные ответы могли быть добавлены, чтобы указать на причуды, сюрпризы, упущения, ошибки или предостережения. Казалось, смысл его делать.

3 ответов


Falsey значения в JavaScript

"Falsey" просто означает, что внутренний JavaScript ToBoolean возвращает функция false. ToBoolean в основе !value, value ? ... : ...; и if (value). Вот его официальная спецификация (2018 рабочий проект) (единственное изменение с самая первая спецификация ECMAscript в 1997 добавление ES6 в это Символы, которые всегда честная):

Undefined: Return false. Null: Return false. Boolean: Return argument. Number: If argument is +0, -0, or NaN, return false; otherwise return true. String: If argument is the empty String (its length is zero), return false; otherwise return true. Symbol: Return true. Object: Return true.


сравнения с == (свободное равенство)

стоит говорить о фальшивых ценностях'свободные сравнения с ==, который использует 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, который всегда возвращает непустую строку, например:

  • любой объект (кроме этого "умышленного нарушения" document.all в браузерах; помните, что null на самом деле не объект, несмотря на typeof предполагая, иное). В том числе:

    • {}
    • []
    • function(){} или () => {} (любая функция, включая пустые функции)
    • Error и любой экземпляр Error
    • любое регулярное выражение
    • все, что создано с new (включая new Number(0) и new Boolean(false))
  • любой символ

true, 1, "1" и [1] возвращение true по сравнению друг с другом ==.


Не забывайте о непустой строке "false" который оценивает в 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.