Результаты "правды" и "ложности" сбивают с толку в JavaScript

Я изучаю основы JavaScript. Я смущен результатами "правды" и "ложности". Может ли кто-нибудь объяснить причину этого?

myVariable = undefined ? "truthy" : "falsey";

Результат "falsey" .

myVariable = typeOf someUndefinedVariable ? "truthy" : "falsey";

Результат "правдивый" .

Я ожидал "ложь" вместо второго результата. Почему я стал "правдивым"? Я действительно смущен.

Ответ 1

typeof возвращает имя типа значения, которое всегда является непустой строкой. Непустая строка является правдой.

> typeof someUndefinedVariable
"undefined"
> typeof (typeof someUndefinedVariable)
"string"
> Boolean("undefined")
true

См. также Все значения false в JavaScript

Ответ 2

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

myVariable = undefined ? "truthy" : "falsey";
// result: "falsey"

Здесь вы смотрите на значение undefined и задаете вопрос: он правдивый или ложный? Исходя из этого вы выбираете строку. Затем вы сохраняете эту строку в myVariable. Это действительно то же самое, что и этот код:

var myVariable;
if (undefined) {
    myVariable = 'truthy';
} else {
    myVariable = 'falsey';
}

Так как undefined всегда ложно, в конце myVariable содержит строку 'falsey'.

Вот ваш второй фрагмент кода:

myVariable = typeOf someUndefinedVariable ? "truthy" : "falsey";
// result: "truthy"

Во-первых, я должен указать, что typeOf не является допустимой функцией или оператором в любой исполняемой среде Javascript, о которой я знаю. Я предполагаю, что это была опечатка, и вы хотели использовать typeOf вместо этого. Приведенный выше код, как написано, должен вызывать синтаксическую ошибку. Исправлено, у нас есть...

myVariable = typeOf someUndefinedVariable ? "truthy" : "falsey";
// result: "truthy"

И для ясности перепишите его как if/else:

var myVariable;
if (typeof someUndefinedVariable) {
    myVariable = 'truthy';
} else {
    myVariable = 'falsey';
}

В качестве другого ответчика указал, typeof всегда будет возвращать в качестве строки тип символа, который вы ему даете.

typeof(someUndefinedVariable);
"undefined"

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

В Javascript имеется только 7 значений false.

false               Boolean false
undefined           If a symbol is not defined at all
null                A defined symbol, but it has no value inside
0                   Numeric positive 0
-0                  Numeric negative 0
'' or ""            Empty string
NaN                 Magic value "Not a Number"

Все остальные значения в Javascript являются правдивыми.

  • любая строка, кроме пустой строки
  • любое число, кроме 0
  • любой массив, включая пустой массив
  • любой объект, включая пустой объект
  • Функции
  • и т.д.