Можете ли вы переопределить правдивое принуждение объекта JavaScript? - PullRequest
4 голосов
/ 08 марта 2019

Приведение string может быть перезаписано с помощью функции toString.

Приведение number может быть перезаписано с помощью функции valueOf.

Приведение booleanможно также перезаписать с помощью функции valueOf.

var foo = {
  toString: function() {
    console.log("To String");
    return "bar";
  },
  valueOf: function() {
    console.log("Value Of");
    return 5;
  }
};

console.log(`${foo}`);
console.log(+foo);
console.log(foo == true);
console.log(!!foo);

Мне не удалось найти функцию, которая вызывается, когда объект должен быть преобразован в truthy.Поскольку x == true и !!x ведут себя по-разному, то я предполагаю, что не существует функции, которая это меняет.Вместо этого я попытался расширить типы, у которых truthy равно false, но единственное значение, которое принимается Object.create, это null, который почти идентичен литералу объекта (не имеет ни одного из свойств Object.prototype).

1 Ответ

3 голосов
/ 08 марта 2019

foo == true фактически конвертирует foo в число, поэтому valueOf работает, но вводит в заблуждение.
Вы можете попробовать {} == true здесь , чтобы увидеть, какие шаги алгоритма сравнения выполняются (заявление об отказе: я сделал это).

!foo однако вызывает ToBoolean, что явно всегда возвращает true для объекта. Невозможно изменить это поведение.

enter image description here

...