Examples
Какое значение будет в консоли и почему ?
Необходимо не только ответить на вопрос, но и дать исчерпывающее объяснение процессу сравнения двух операндов, в данном случае объекта { }
и true
.
Начнем с того, что для сравнения в Javascript существует 2 типа операторов сравнения: строгий (==) и нестрогий (===). В случае строго сравнения, ввиду разных типов операндов, очевиден ответ false
. Для каждого типа сравнения есть свой набор правил.
Для строгого сравнения (===):
Если оба операнда разного типа, они неравны.
Если оба операнда null, они равны.
Если оба операнда undefined, они равны.
Если оба или один из операторов NaN, они неравны.
Если оба операнда true или false, они равны.
Если оба операнда типа number и имеют одинаковое значение, то они равны.
Если оба операнда типа string и имеют одинаковое значение, то они равны.
Если оба операнда имеют ссылку на один и тот же объект, то они равны.
Во всех других случаях, операнды неравны.
Несколько примеров:
При нестрогом сравнении, зачастую один или оба операнда приводятся к какому-нибудь примитивному типу. Для последующего разбора нестрогого сравнения, необходимо рассмотреть приведение объекта к примитивному значению:
Если у объекта существует метод valueOf(), то он вызывается. Если вызов метода возвращает примитив, объект приводится к значению этого примитива.
В противном случае, если у объекта есть метод toString(), то он вызывается. Если вызов метода возвращает примитив, объект приводится к значению этого примитива.
В противном случае будет ошибка: TypeError: Cannot convert object to primitive value.
Для нестрогого сравнения:
Если операнды имеют одинаковый тип, они проверяются правилами строгого сравнения.
Если операнды имеют разные типы:
Если один из операндов null а другой undefined, они равны.
Если один из операндов число и другой строка, строка приводится к числу и операнды сравниваются заново.
Если один из операндов логический тип (boolean), он преобразуется к 1 или 0 - в случае true и false соответственно, операнды сравниваются заново.
Если один из операндов объект и другой строка или число, объект приводится к примитиву. Операнды сравниваются заново.
Во всех других случаях операнды неравны.
Несколько примеров:
Таким образом, выражение {} == true
будет равно false:
{ } == 1
"[object Object]" == 1
NaN == 1
NaN === 1
false
Last updated