потому что...
1. когда ты написал `valueOf` и добавил реализацию, то ты переопределил существующий метод, который был унаследован от Object.
2. когда ты удаляешь реализацию метода `valueOf`, то переопределения не происходит и вызывается "нативный" для объекта метод `valueOf`, который возвращает "[object Object]"
3. когда ты пишешь `+user`, то NaN получается потому что строка `'{name: "John"}'` не может быть приведена к числу
4. когда ты пишешь `user+500`, то у тебя будет вызван либо `valueOf` (если переопределен), либо `toString`
https://developer.mozilla.org/ru/docs/Web/JavaScri...