реляционное сравнение в JavaScript

#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.