# Первый alert(foo) Возвращает строковое представление объекта, используя `toString`, т.е. `"foo"`. # Второй alert(foo + 1) Оператор `'+'` преобразует объект к примитиву, используя `valueOf`, так что результат: `3`. # Третий alert(foo + '3') То же самое, что и предыдущий случай, объект превращается в примитив `2`. Затем происходит сложение `2 + '3'`. Оператор `'+'` при сложении чего-либо со строкой приводит и второй операнд к строке, а затем применяет конкатенацию, так что результат -- строка `"23"`.