valueOf - garevna/js-course GitHub Wiki

:mortar_board: valueOf

Метод valueOf() наследуется всеми объектами от Object

Этот метод вызывается автоматически, когда необходимо вернуть примитивное значение объекта

Например, если объект сравнивается с числом

var obj = {
   num: 5,
   val: 10,
   x: 11,
   valueOf: function () {
      return this.num + this.val - this.x
   }
}

Если теперь мы выполним сравнение:

obj == 4

то получим true

При выполнении сравнения будет вычисляться примитивное значение объекта, т.е. вызываться метод valueOf

Если примитивное значение объекта вычислить невозможно, то будет возвращен сам объект

valueOf () - унаследованный метод любого объекта

Но это не означает, что мы не можем его переопределить

:coffee: :one:

var human = {
   name: "Ivan",
   age: 25,
   valueOf: function () {
      return this.name + ": " + this.age
   }
}

console.info ( human + "!" ) // Ivan: 25!

:coffee: :two:

Конечно, так делать не стоит, но все-таки интересно :wink:

в результате выполнения следующего кода:

Object.prototype.valueOf = function () {
    return "Это объект, блин, а не игрушка!"
}

все нативные объекты JS будут "ругаться" соответствующим образом при попытке получить их примитивное значение

console.info ( Number + "" )
Это объект, блин, а не игрушка!

:coffee: :three:

const test = {
   num: 0,
   valueOf: function () {
      return this.num += 1
   }
}

:grey_question: Что вернет выражение:

test == 1 && test == 2 && test == 3

:briefcase: Тесты