0

Как это работает? Как а меняется вообще?

const a = {
  i: 1,
  toString: function () {
    return a.i++;
  }
}

if(a == 1 && a == 2 && a == 3) { console.log('Hello World!'); }

Randall
  • 7,054
  • Если не ошибаюсь, хитрость в том, что "Для численного преобразования объекта используется метод valueOf, а если его нет – то toString" – Алексей Р Dec 01 '22 at 06:17

1 Answers1

1

При сравнении объекта с примитивом происходит неявное преобразование объекта с помощью метода valueOf(). Если его нет, используется toString() см. При преобразовании возвращается текущее значение свойства i с пост-инкрементом, т.е. возвратив 1, i становится 2. И так далее. Ниже пример, который дает результат как в оригинале, несмотря на измененный метод toString - используется valueOf(). Если закомментировать valueOf(), то результат будет другой.

const a = {
    i: 1,
    toString: function () {
        return 5;
    }
    ,
    valueOf: function () {
        return a.i++;
    }
}

if (a == 1 && a == 2 && a == 3) { console.log('Hello World!'); }