Имею такой код
var foo = {
toString: function() {
return 'foo';
},
valueOf: function() {
return 2;
}
};
alert( foo ); // 'foo'
alert( foo + '1' ); // '21'
alert( foo || '3' ); // 'foo'
Насколько я заметил, интерпретатор возвращает toString, если с результатом не производить никаких манипуляций. Если с результатом что-то делаем, то вернет valueOf. Скажем так - это мои предположения исходя из полученных результатов. Но я не нашел в документации, где бы рассматривался подобный пример, чтобы чётко иметь представление об алгоритме работы.