@FeelsGoodMan

Почему преобразование объекта дает такой результат?

let user = {
  name: "John",
  money: 1000,

  toString() {
    return `{name: "${this.name}"}`;
  },

  valueOf() {
    return this.money;
  }
};

alert(user); // toString -> {name: "John"}
alert(+user); // valueOf -> 1000 и NaN, если удалить метод
alert(user + 500); // valueOf -> 1500

Почему удалив реализацию метода valueOf, alert(+user) выдает NaN, делая преобразование явно, ведь по логике при отсутствии valueOf должен использоваться метод toString?
  • Вопрос задан
  • 88 просмотров
Решения вопроса 1
ruddy22
@ruddy22
Спасение утопающих — дело рук самих утопающих
потому что...
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...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы