Как сделать экземпляры класса сопоставимыми и собирать мусор одновременно? - PullRequest
0 голосов
/ 02 февраля 2019

Я пишу class и хочу, чтобы экземпляры были сопоставимы по <, >, ==.

Для < и >, valueOf работхорошо.

== отличается, однако, но я хочу иметь это также.Я мог бы легко реализовать метод isEqual, но это не то же самое.

Мое текущее решение - это кэш для всех созданных объектов:

const cache = {}

class Comparable {
  constructor (id) {
    if (cache[id]) return cache[id]

    cache[id] = this
  }
}

Таким образом, сравнение работает,К сожалению, это также блокирует сборщик мусора.

Есть ли другой способ включения new Comparable(42) == new Comparable(42), который не мешает сборке мусора?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Вы, похоже, ищете хеш-код , но, как вы поняли, это не может быть эффективно реализовано, поскольку JavaScript не ( пока ) не поддерживает слабые (или мягкие) ссылки.

Нет, невозможно перезаписать какие-либо операторы, включая ==, в JS.== всегда сравнивает два объекта по ссылке, с этим ничего нельзя поделать.Лучшей вашей ставкой будет создание метода compare.

0 голосов
/ 02 февраля 2019

Прежде всего, имейте в виду, что == всегда хуже, чем === из-за таких неприятностей.Когда вы используете x == y сравнение, где оба операнда являются объектами, тогда js будет сравнивать их как объекты.(подробнее здесь https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators) Легко протестировать, просто запустив

class ComparableObject {
  constructor(id) {
    this.id = id;
  }

  valueOf() {
    console.log("log", this.id);
    return this.id;
  }
}

new ComparableObject("12") == new ComparableObject(12);

. Он не будет создавать никаких журналов, но это:

new ComparableObject("12") == new ComparableObject(12).valueOf();

напечатает:

log 12
log 12
true

Существует несколько решений для ваших нужд:

Number(new ComparableObject("12")) == Number(new ComparableObject(12));
new ComparableObject("12").valueOf() == new ComparableObject(12).valueOf();

GC не может что-то сделать, пока объект кэша не удалит ссылки на экземпляры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...