Examples

Какое значение будет в консоли и почему ?

var array = [0];

if (array) {
  console.log(array == false);
}

В данном примере была объявлена переменная array , в которую записан массив с одним элементом, числом 0 . Далее следует условный оператор и массив array в качестве условия. При верном условии выполнится сравнение массива с false и результат выведется в консоли.

Можно предположить, что если массив непустой, то и условие в if выполнится, и мы попадем в блок, в котором еще раз проверим, чему равен массив при сравнении с каким-либо логическим значением, в данном примере с false. И учитывая, что в блок мы уже попали, то массив никак не может быть false. Соответственно, ответ: в консоли будет false, массив это true и true !== false.

Правильный же ответ - в консоли будет true.

Разберем по порядку. Условный оператор if и массив. Мы предположили, что если массив непустой и в нем что-то есть, то и в условном операторе он даст true и код внутри блока будет выполнен.

var arrayWithValues = [1, 2, 'red'];

if (arrayWithValues) {
  console.log('Worked, array with values is true for "if condition"')
} else {
  console.log('Not working, array with values is false for "if condition"')
}

Значит, пустой массив в условном операторе выдает false и код внутри блока не выполнится, верно ?

var emptyArray = [];

if (emptyArray) {
  console.log('Worked, empty array is true for "if condition"')
} else {
  console.log('Not working, empty array is false for "if condition"')
}

Но в консоли будет Worked, empty array is true for "if condition". Получается, что массив, даже пустой, является true для условного оператора. То же самое применимо и к объектам, причем всем. Правильнее утверждать, что все объекты дадут результат true для условного оператора, а так как массив тоже является объектом, то он true. Учитывая, что все объекты по умолчанию наследуются от базового Object.prototype, то правило, что объект возвращает true в условном операторе if, действительно применимо для всех без исключения объектов и его наследников, будь то экземпляры встроенных в язык классов типа Array, Function или Date, или же экземпляры пользовательских классов.

Если массив в любом случае true ,то почему в консоли, при сравнении, массив с false true. При сравнении с помощью операторов типа ==, !=, =! и т.д. происходит приведение типов. Связано это с тем, что мы пытаемся сравнить два значения, но для начала надо, чтобы эти два значения были одинакового типа. Поэтому происходит следующее:

[0] == false; // true
  1. Сравнивать мы можем только примитивы, т.е. примитивные значения: строки, числа, логический тип. Массив - это объект, поэтому его надо превратить в примитив, например строку. [ 0 ] => " 0 " . Получим строковое представление массива.

  2. Сравнить строку "0" с false мы все еще не можем - разные типы - строка и boolean. Приводим строку в число."0" => 0 .

  3. Сравнить число 0 с false мы тоже не можем - разные типы - число и boolean. Приводим false к числу, false это 0

  4. Сравниваем 0 c 0. 0 == 0. Отсюда и ответ true.

При использовании строго равенства с помощью оператора === , ответ будет другим, так как типы разные.

[0] === false; // false

Last updated