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

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


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

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

Ответ 1

Значения Falsey в JavaScript

"Falsey" просто означает, что внутренняя функция ToBoolean JavaScript возвращает false. !value ToBoolean !value, 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() и может вызвать некоторую путаницу из-за основных различий. Они эффективно образуют три группы:

  • 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, которое всегда возвращает непустую строку, например:

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

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

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

Ответ 2

Не забывайте о непустой строке "false", которая оценивается как true

Ответ 3

Просто добавьте в @user568458 список значений фальши:

  • В дополнение к целому числу 0 десятичное число 0,0, 0,00 или любое такое нулевое число также является фальшивым значением.

    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.