Object.prototype.valueOf()
Базовая версия Широко доступна
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Метод valueOf() экземпляров Object преобразует значение this в объект. Этот метод предназначен для переопределения производными объектами для реализации пользовательской логики преобразования типов.
Попробуйте
function MyNumberType(n) {
this.number = n;
}
MyNumberType.prototype.valueOf = function () {
return this.number;
};
const object = new MyNumberType(4);
console.log(object + 3);
// Expected output: 7
Синтаксис
valueOf()
Параметры
Нет.
Возвращаемое значение
Значение this, преобразованное в объект.
Примечание: Чтобы valueOf был полезен при преобразовании типов, он должен возвращать примитив. Поскольку все примитивные типы имеют собственные методы valueOf(), вызов primitiveValue.valueOf() обычно не приводит к вызову Object.prototype.valueOf().
Описание
JavaScript вызывает метод valueOf для преобразования объекта в примитивное значение. Вам редко требуется вызывать метод valueOf самостоятельно; JavaScript автоматически вызывает его при обнаружении объекта, где ожидается примитивное значение.
Этот метод вызывается в первую очередь при числовом преобразовании и примитивном преобразовании, но строковое преобразование вызывает toString() в первую очередь, а toString(), скорее всего, вернет строковое значение (даже при базовой реализации Object.prototype.toString()), поэтому valueOf() обычно не вызывается в этом случае.
Все объекты, которые наследуются от Object.prototype (то есть все, кроме объектов с null-прототипом), наследуют метод toString(). Базовая реализация Object.prototype.valueOf() намеренно бесполезна: возвращая объект, его возвращаемое значение никогда не будет использоваться никаким алгоритмом примитивного преобразования. Многие встроенные объекты переопределяют этот метод для возврата соответствующего примитивного значения. Когда вы создаете пользовательский объект, вы можете переопределить valueOf(), чтобы вызвать пользовательский метод, чтобы ваш пользовательский объект мог быть преобразован в примитивное значение. Как правило, valueOf() используется для возврата наиболее значимого для объекта значения — в отличие от toString(), оно не обязательно должно быть строкой. В качестве альтернативы вы можете добавить метод [Symbol.toPrimitive](), который обеспечивает еще больший контроль над процессом преобразования и всегда будет предпочтительнее valueOf или toString для любого преобразования типов.
Примеры
Использование valueOf()
Базовый метод valueOf() возвращает само значение this, преобразованное в объект, если оно еще не является объектом. Поэтому его возвращаемое значение никогда не будет использоваться никаким алгоритмом примитивного преобразования.
const obj = { foo: 1 };
console.log(obj.valueOf() === obj); // true
console.log(Object.prototype.valueOf.call("primitive"));
// [String: 'primitive'] (a wrapper object)
Переопределение valueOf для пользовательских объектов
Вы можете создать функцию, которая будет вызываться вместо метода valueOf по умолчанию. Ваша функция не должна принимать аргументов, так как они не будут передаваться при вызове во время преобразования типов.
Например, вы можете добавить метод valueOf к вашему пользовательскому классу Box.
class Box {
#value;
constructor(value) {
this.#value = value;
}
valueOf() {
return this.#value;
}
}
При наличии предыдущего кода всякий раз, когда объект типа Box используется в контексте, где он должен быть представлен как примитивное значение (но не обязательно как строка), JavaScript автоматически вызывает функцию, определенную в предыдущем коде.
const box = new Box(123); console.log(box + 456); // 579 console.log(box == 123); // true
Метод valueOf объекта обычно вызывается JavaScript, но вы можете вызвать его самостоятельно следующим образом:
box.valueOf();
Использование унарного плюса для объектов
Унарный плюс выполняет числовое приведение для своего операнда, что для большинства объектов без [Symbol.toPrimitive]() означает вызов его valueOf(). Однако, если объект не имеет пользовательского метода valueOf(), базовая реализация приведет к игнорированию valueOf(), и вместо этого будет использоваться возвращаемое значение toString().
+new Date(); // the current timestamp; same as new Date().getTime()
+{}; // NaN (toString() returns "[object Object]")
+[]; // 0 (toString() returns an empty string list)
+[1]; // 1 (toString() returns "1")
+[1, 2]; // NaN (toString() returns "1,2")
+new Set([1]); // NaN (toString() returns "[object Set]")
+{ valueOf: () => 42 }; // 42
Спецификации
Совместимость с браузерами
| Desktop | Mobile | Server | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
valueOf |
1
|
12
|
1
|
3
|
1
|
18
|
4
|
10.1
|
1
|
1.0
|
1
|
1
|
1.0.0
|
1.0
|
0.10.0
|
Смотрите также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf