#javascript #compare
#javascript #Сравнить
Вопрос:
Меня смущает это сравнение, и я не знаю, как это может произойти. в нижнем коде, когда я сравниваю x и y для значений меньше или больше, возвращается false, но когда я сравниваю их с equals, они возвращают true! вы знаете, почему это происходит?
var x = { y: 10 };
var y = { y: 11 };
x < y; // false
x == y; // false
x > y; // false
x <= y; // true
x >= y; // true
Комментарии:
1. Когда вы сравниваете ссылки на объекты подобным образом, объекты преобразуются в строку
[object Object]
, а затем сравниваются как строки. Это верно, за исключением случая==
.
Ответ №1:
теперь я понимаю, как x <= y и y <= x приводят к true, однако x < y и x == y и x > y являются ложными. в продолжение принятого ответа я могу сказать, что это происходит потому, что в спецификации указано для x <= y , сначала он фактически оценит y < x, а затем отрицает этот результат. Поскольку y < x также равно false , результат x <= y равен true .
Ответ №2:
x < y; // false
x > y; // false
Когда любой операнд реляционного оператора является объектом, он преобразуется в примитивное значение. Таким образом, в этом случае оба x
и y
сначала преобразуются в примитивные значения, а затем сравниваются друг с другом.
Оба x
и y
будут преобразованы в примитивные значения путем в конечном итоге вызова .toString()
метода для каждого объекта, который вернет строку вида: [object Object]
и поскольку оба объекта будут преобразованы в эту строковую форму, x < y
и x > y
оба оцениваются как false, потому что обе строки, т.е. [object Object]
равны.
x == y; // false
Это значение равно false, потому что, когда типы обоих операндов ==
operator одинаковы, javascript выполняет строгое сравнение на равенство ===
, и поскольку оба объекта являются двумя отдельными объектами в памяти, они не равны.
x <= y; // true
x >= y; // true
Эти оба выражения оцениваются как true, поскольку следующее сравнение
"[object Object]" == "[object Object]"
вычисляется как true.