@qnaQuester

Почему объекты по-разному сравниваются?

'use strict';

function A (name, age) {
    this.name = name;
    this.age = age;

    return {
        name: this.name,
        age: this.age,

        toString () {
            return age;
        }
    };
}

function B (name, age) {
    this.name = name;
    this.age = age;

    return {
        name: this.name,
        age: this.age,

        toString () {
            return age;
        }
    };
}

let a = new A("Ben", 30);
let b = new B("Gray", 30);


console.log(a == b); //false
console.log(a >= b); //true


Почему так? Как сделать так, чтобы в первом логе было тоже тру?
  • Вопрос задан
  • 97 просмотров
Пригласить эксперта
Ответы на вопрос 1
dimovich85
@dimovich85 Куратор тега JavaScript
https://u-academy.net/
Потому что объекты сравниваются по ссылкам, если две ссылки ведут на один и тот же объект, то получаете true, иначе - false. Чтоб в первом и втором случае было true надо серьезно переработать код, так как он возвращает {...} каждый вызов функции создает новый объект, и возвращает. Использование this внутри функций A и B не оправдано, создает мусор. При сравнении >= js пытается привести оба операнда к числу, и если память не изменяет, сначала ищет метод toValueOf, а если его нет - приводит к строкам, с помощью метода toString, в Вашем случае есть метод toString, и так как объекты с одинаковыми значениями полей age >= дает true, так как из объектов вызывается неявно toString.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы