JavaScript: Truthy and Falsy(Правда и Ложь)

05.02.2019


Логические выражения возвращают или true или false(либо Правду либо Ложь) Простейший пример логического выражения это оператор if.

В выражении может быть переменная, функция или логическое значение, то есть объект первого класса.

if (myVar) {}
if (myFunction) {}

Ложные значения: false, 0, , null, undefined, NaN.

Правдивые значение: Все остальные.

Ниже несколько примеров:

// Код ниже ничего не выведет в консоль
if(false) console.log('true');
if(0) console.log('true');
if('') console.log('true');
if(null) console.log('true');
if(undefined) console.log('true');
if(NaN) console.log('true');

// Код ниже выведет в консоль true
if(!false) console.log('true');
if(!0) console.log('true');
if(!'') console.log('true');
if(!null) console.log('true');
if(!undefined) console.log('true');
if(!NaN) console.log('true');

// Код ниже ничего не выведет в консоль
if(!!false) console.log('true');
if(!!0) console.log('true');
if(!!'') console.log('true');
if(!!null) console.log('true');
if(!!undefined) console.log('true');
if(!!NaN) console.log('true');

Обратите внимание, что при сравнении с объектами, объект преобразуется к примитиву:

{}.toString()

Пример с объектами:

if({}) console.log(true); // true

console.log( myVar = {} == true); // false
console.log( myVar = {}.toString() == true); //false
console.log( {} == true ); // false
console.log( {} === true ); // false

console.log( myVar = {a:'a'} == true); // false
console.log( myVar = {a:'a'}.toString() == true); //false
console.log( {a:'a'} == true ); // false
console.log( {a:'a'} === true ); // false

obj1 = {};
if(obj1) console.log(true); // true
console.log( myVar = obj1 == true); // false
console.log( myVar = obj1.toString() == true); //false
console.log( obj1 == true ); // false
console.log( obj1 === true ); // false

obj2 = {a:'a'};
if(obj2) console.log(true); // true
console.log( myVar = obj2 == true); // false
console.log( myVar = obj2.toString() == true); //false
console.log( obj2 == true ); // false
console.log( obj2 === true ); // false

Пример с массивами:

if([]) console.log(true); // true

let arr1 = [];
if(arr1) console.log(true); // true
console.log( arr1 == true ); // false
console.log( arr1 === true ); // false
console.log( myVar = arr1.toString() == true); //false
console.log( myVar = arr1.toString() === true); //false

let arr2 = [0];
if(arr2) console.log(true); // true
console.log( arr2 == true ); // false
console.log( arr2 === true ); // false
console.log( myVar = arr2.toString() == true); //false
console.log( myVar = arr2.toString() === true); //false

let arr3 = [1];
if(arr3) console.log(true); // true
console.log( arr3 == true ); // true
console.log( arr3 === true ); // false
console.log( myVar = arr3.toString() == true); //true
console.log( myVar = arr3.toString() === true); //false

let arr4 = [2];
if(arr4) console.log(true); // true
console.log( arr4 == true ); // false
console.log( arr4 === true ); // false
console.log( myVar = arr4.toString() == true); //false
console.log( myVar = arr4.toString() === true); //false

Пример со строками:

// Любая не пустая строка true
if('') console.log(true); //  ничего не выведет 
if(' ') console.log(true); // true
if('a') console.log(true); // true