Значение valueOf всегда переопределяет toString в javascript?

Есть ли какое-либо выражение, где метод objectString объекта неявно называется переопределением метода valueOf?

В приведенных ниже примерах значение Of всегда называется неявным (переопределение toString).

"4" + {
    toString: function () {
        return "4";
    },
    valueOf: function () {
        return 6;
    }
};    // => "46", was expecting "44"

4 + {
    toString: function () {
        return "6";
    },
    valueOf: function () {
        return 4;
    }
};    // => 8

4 + {
    toString: function () {
        return 6;
    },
    valueOf: function() {
        return "4";
    }
};    // => "44"

то есть:.

Можем ли мы написать выражение, где toString неявно вызывается над valueOf (т.е. без явного вызова toString)?

Ответ 1

Оператор + в объектах Date использует toString not valueOf. Кроме того, если valueOf возвращает не-примитивное значение, то метод toString вызывается следующим. (JavaScript - окончательное руководство, раздел 3.14). Используя ваш пример:

var result = "4" + {
    toString: function () {
        return "4";
    },
    valueOf: function () {
        return this; // returning an object, not a primitive
    }
};

Результат теперь 44.

Ответ 2

Есть ли какое-либо выражение, где методом objectString метод неявно называется переопределением его метода valueOf?

Да, это происходит всякий раз, когда на объект применяется абстрактная ToString операция, используя DefaultValue procedure с .toString() до .valueOf().

Однако в ваших примерах вы использовали только оператор добавления , который похож на исключение из стандартного поведения. Поскольку он не только объединяет строки, но и суммы чисел, он всегда использует valueOf для обоих операндов, прежде чем проверять, являются ли они строками. См. Примечание 1:

Никаких подсказок в вызовах ToPrimitive в шагах 5 и 6. Все собственные объекты ECMAScript, кроме объектов Date, обрабатывают отсутствие намека, как будто был указан номер подсказки; Объекты даты обрабатывать отсутствие подсказки, как если бы была указана строка подсказки. хозяин объекты могут обрабатывать отсутствие подсказки каким-либо другим способом.

Итак, какие операции неявно используют ToString вместо ToPrimitive без подсказки? Вот несколько примеров:

  • Все имена свойств: Оператор in, обозначение скобок, Object.getOwnPropertyDescriptor, Object.defineProperty, hasOwnProperty,...
  • Функции, ожидающие строки в качестве аргументов: parseInt, parseFloat, encodeURI[Component], decodeURI[Component], [un]escape, Array::join, String::[last]indexOf, RegExp::exec
  • Конструктор Function
  • Функция сравнения по умолчанию Array::sort по умолчанию
  • Конструктор String и методы String при бросании объекта this в строку
  • Конструктор RegExp
  • Конструкторы Error
  • Множество других функций, не указанных EcmaScript, но в DOM или где-то еще, например alert, XMlHTTPRequest::open, querySelector,...

Ответ 3

Есть ли какое-либо выражение

Да. Вот пример, который будет использовать toString:

alert({
    toString: function () {
        return "4";
    },
    valueOf: function () {
        return 6;
    }
});  // alerts "4"