Examples
Какое значение будет в консоли и почему ?
В данном примере была объявлена переменная array
, в которую записан массив с одним элементом, числом 0
. Далее следует условный оператор и массив array
в качестве условия. При верном условии выполнится сравнение массива с false и результат выведется в консоли.
Можно предположить, что если массив непустой, то и условие в if выполнится, и мы попадем в блок, в котором еще раз проверим, чему равен массив при сравнении с каким-либо логическим значением, в данном примере с false. И учитывая, что в блок мы уже попали, то массив никак не может быть false. Соответственно, ответ: в консоли будет false, массив это true и true !== false.
Правильный же ответ - в консоли будет true.
Разберем по порядку. Условный оператор if и массив. Мы предположили, что если массив непустой и в нем что-то есть, то и в условном операторе он даст true и код внутри блока будет выполнен.
Значит, пустой массив в условном операторе выдает false и код внутри блока не выполнится, верно ?
Но в консоли будет Worked, empty array is true for "if condition". Получается, что массив, даже пустой, является true для условного оператора. То же самое применимо и к объектам, причем всем. Правильнее утверждать, что все объекты дадут результат true для условного оператора, а так как массив тоже является объектом, то он true. Учитывая, что все объекты по умолчанию наследуются от базового Object.prototype, то правило, что объект возвращает true в условном операторе if, действительно применимо для всех без исключения объектов и его наследников, будь то экземпляры встроенных в язык классов типа Array, Function или Date, или же экземпляры пользовательских классов.
Если массив в любом случае true
,то почему в консоли, при сравнении, массив с false
true. При сравнении с помощью операторов типа ==, !=, =! и т.д. происходит приведение типов. Связано это с тем, что мы пытаемся сравнить два значения, но для начала надо, чтобы эти два значения были одинакового типа. Поэтому происходит следующее:
Сравнивать мы можем только примитивы, т.е. примитивные значения: строки, числа, логический тип. Массив - это объект, поэтому его надо превратить в примитив, например строку.
[ 0 ] => " 0 " .
Получим строковое представление массива.Сравнить строку
"0"
с false мы все еще не можем - разные типы - строка и boolean. Приводим строку в число."0" => 0
.Сравнить число
0
с false мы тоже не можем - разные типы - число и boolean. Приводим false к числу, false это 0Сравниваем 0 c 0. 0 == 0. Отсюда и ответ true.
При использовании строго равенства с помощью оператора ===
, ответ будет другим, так как типы разные.
Last updated