valueOf сравнение 2 обектов [дубликат]

219
02 августа 2017, 22:56

На данный вопрос уже ответили:

  • В чем разница между valueOf и toString 2 ответа
  • Преобразование скалярных типов при сравнении JavaScript 2 ответа

Почему при сравнении 2 объектов (===) выдает false.

Но при других операциях(>, <, +, -, *, /) 2 объектов - выдает нужный результат(то есть методы valueOf отрабатывают)

let man = {
    name: 'Sergey',
    surname: 'Sergeev',
    age: 30,
    valueOf(){
        return this.age;
    }
}

let man2 = {
    name: 'Ivan',
    surname: 'Ivanov',
    age: 30,
    valueOf(){
        return this.age;
    }
}
console.log(man === man2)
Answer 1

Если вы хотите сравнивать возраст (да и вообще делать какие либо операции со значением свойств) — делайте это проще:

let man = { 
  name: 'Sergey', 
  surname: 'Sergeev', 
  age: 30, 
  valueOf() { 
    return this.age; 
  } 
} 
 
 
let man2 = { 
  name: 'Ivan', 
  surname: 'Ivanov', 
  age: 30, 
  valueOf() { 
    return this.age; 
  } 
} 
 
console.log(man.age === man2.age);

Ниже объяснение

Метод valueOf() возвращает примитивное значение указанного объекта.

JavaScript вызывает метод valueOf для преобразования объекта в примитивное значение. Вам редко потребуется вызывать метод valueOf самостоятельно; JavaScript автоматически вызывает его при обнаружении объекта, когда ожидается примитивное значение.

Дело в том, что когда вы производите примитивные операции >, <, +, -, *, / с объектами в этом момент для каждого объекта возвращается приминивное значение каждого объекта — в вашем случае то, что вы переопределили в методах valueOf. И выволняются операции уже с возвращенными значениями.

Когда вы производите операции ==, === над объектами — сравниваются ссылки на объекты.

Но если сделать так: когда один из операндов имеет примитивное значение — то объект тоже будет преобразовываться в к примитиву (когда не строгое ставнение):

let man = { 
  name: 'Sergey', 
  surname: 'Sergeev', 
  age: 30, 
  valueOf() { 
    return this.age; 
  } 
} 
 
 
let man2 = { 
  name: 'Ivan', 
  surname: 'Ivanov', 
  age: 30, 
  valueOf() { 
    return this.age; 
  } 
} 
 
console.log(man === 30); // false, потому что сравниваются ссылки на объекты (=== — строгое сравнение) 
console.log(man == 30); // true, потому что для man вернется примитивное значение

Два «одинаковых» даже пустых объекта никогда не будут равны, потому что у объектов всегда будут сравниваться ссылки

console.log({} == {}); 
console.log({} === {});

Но если сравниваются переменные, указывающие на один и тот же объект (имеют одну и ту же ссылку) — будет возвращаться true

var obj1 = {}; 
obj1.foo = 100; 
 
var obj2 = obj1; 
obj2.biz = 200; 
obj1.bar = { 
  text: 'bar' 
}; 
 
console.log(obj1 == obj2); 
console.log(obj1 === obj2);

Дополнительная информация по преобразованию типов для примитивов и преобразованию объектов:

  • Преобразование типов для примитивов
  • Преобразование объектов: toString и valueOf
Answer 2

=== не производит приведение типов и в случае объектов сравнивает ссылки. А man и man2 это два разных объекта - они не могут быть строго равны.

Answer 3

Насколько я помню, сравнивая эти два объекта с помощью операторов (>, <, +, -, *, /) вы получаете численное преобразование, т.к. операции для работы с числами. Поэтому вы получаете ожидаемый результат. По мимо этого, есть еще логическое и строковое преобразование. === используется для проверки равенства без преобразования типов, отсюда и два разных объекта будут разными. Либо используйте рекурсивное сравнение объектов, либо предпочтительнее - представьте объекты в виде строки и сравните их: JSON.stringify(man1) === JSON.stringify(man2).

READ ALSO
Yandex maps api: удалить значки магазинов, ТЦ и т.п

Yandex maps api: удалить значки магазинов, ТЦ и т.п

Добрый деньПри создании карты выводятся значки магазинов, ТЦ и т

295
усовершенствовать js код

усовершенствовать js код

При скроллинге страницы с хедером должны происходить некоторые изменения типа уменьшение ширины, появления margin-top, transform: rotate, решил через...

245
Как получить информацию из alert

Как получить информацию из alert

Мне нужно получить информацию, выдаваемую в alert + prompt и занести её в js скриптНе знаю с какой стороны подступиться

225
jquery.min.js:4 Uncaught TypeError: Cannot read property &#39;temperature&#39; of undefined

jquery.min.js:4 Uncaught TypeError: Cannot read property 'temperature' of undefined

Есть javascript код, который выдаёт такую ошибку:

270