Как происходит преобразование объектов к примитиву?

Преобразование объекта к примитиву происходит с помощью внутренней функции ToPrimitive(input,PreferredType?), которая работает так:

Если PreferredType  — Number, то:

1. Если input —  примитив, возвращается он

2. Иначе, входной аргумент — объект, В таком случае вызывается  метод valueOf(). Если результат является примитивом, то возвращается он.

3. Иначе вызывается метод toString(). Если результат примитив. то возвращается он.

4. Иначе, бросается TypeError, указывающее на отказ преобразовать к примитиву.

Если PreferredType —  String, то шаги 2 и 3 меняются.

Если PreferredType пропущен, то для даты он считается String, а в остальных случаях Number.

Рассмотрим работу valueOf() при численном преобразовании:

 
function myNumberType(n) {
    this.number = n;
}
myNumberType.prototype.valueOf = function() {
    return this.number;
};
myObj = new myNumberType(4);
myObj + 3; // 7

А если бы мы не переопределили valueOf(), то что вернула
бы последняя строка?

 
function myNumberType(n) {
    this.number = n;
}
myObj = new myNumberType(4);
myObj + 3; // "[object Object]3"

И в том случае если бы предпочтительным у нас являлся
String, то не смотря на наличие метода valueOf, мы получились бы «[object
Object]’.

Например, при выводе:

 
alert(myObj);

Хотя мы вполне может переопределить метод to String:

 
myNumberType.prototype.toString = function() {
    return this.number;
};
alert(myObj); //4

Полезные ссылки
JavaScriptSpeaking — Values

Хотите быть в курсе новых статей?