Метод valueOf() во многом похож на метод toString(), но вызывается, когда Java_ Script требуется преобразовать объект в значение какого_либо элементарного ти_ па, отличного от строкового – обычно в число. Когда это возможно, функция должна возвращать элементарное значение, каким_либо образом представляю_ щее значение объекта, на который ссылается ключевое слово this.
По определению объекты не являются элементарными значениями, поэтому большинство объектов не имеют эквивалентного элементарного типа. Вследст_ вие этого метод valueOf(), определяемый по умолчанию классом Object, не вы_ полняет преобразования, а просто возвращает объект, с которым он был вызван. Такие классы, как Number и Boolean, имеют очевидные элементарные эквивален_ ты, поэтому они переопределяют метод valueOf() так, чтобы он возвращал соот_ ветствующие значения. Именно поэтому объекты Number и Boolean могут вести се_ бя во многом так же, как эквивалентные им элементарные значения.
Иногда можно определить класс, имеющий какой_то разумный элементарный эквивалент. В этом случае может потребоваться определить для этого класса специальный метод valueOf(). Если мы вернемся к примеру 9.2, то увидим, что метод valueOf() определен для класса Complex. Этот метод просто возвращает ве_ щественную часть комплексного числа. Поэтому в числовом контексте объект Complex ведет себя так, как будто является вещественным числом без мнимой со_ ставляющей. Рассмотрим, например, следующий фрагмент:
var a = new
Complex(5,4);
var b = new
Complex(2,1);
var
c
=
Complex.sum(a,b);
//
c
это
комплексное число {7,5}
var
d
=
a +
b;
//
d
это
число 7
При наличии метода valueOf() следует соблюдать одну осторожность: в случае преобразования объекта в строку метод valueOf() иногда имеет приоритет перед методом toString(). Поэтому, когда для класса определен метод valueOf() и надо, чтобы объект этого класса был преобразован в строку, может потребоваться явно указать на это, вызвав метод toString(). Продолжим пример с классом Complex: