Значение 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"