Преобразование объектов в простые значения
Бывают операции, при которых объект должен быть преобразован в примитив.
Например:
- Строковое преобразование – если объект выводится через
alert(obj)
. - Численное преобразование – при арифметических операциях, сравнении с примитивом.
- Логическое преобразование – при
if(obj)
и других логических операциях.
Массивы наследуют по умолчанию метод valueOf()
, который возвращает сам объект, а не простое значение, поэтому при преобразовании массива в число интерпретатор опирается на метод toString()
. Пустые массивы преобразуются в пустую строку. А пустая строка преобразуется в число 0. Массив с единственным элементом преобразуется в ту же строку, что и единственный элемент массива. Если массив содержит единственное число, это число преобразуется в строку, а затем опять в число. Оператор +
в языке JavaScript выполняет сложение чисел и конкатенацию строк. Если какой-либо из его операндов является объектом, JavaScript преобразует объект, используя специальное преобразование объекта в простое значение вме- сто преобразования объекта в число, используемого другими арифметическими операторами. То же относится и к оператору равенства ==
. Если выполняется сравнение объекта с простым значением, оператор выполнит преобразование объекта с использованием правил преобразования в простое значение. Преобразование объектов в простые значения, используемое операторами +
и ==,
предусматривает особый подход для объектов Date
. Класс Date
является единственным типом данных в базовом JavaScript, который определяет осмысленные преобразования и в строку, и в число. Преобразование любого объекта, не являющегося датой, в простое значение основано на преобразовании в число (когда первым применяется метод valueOf()
), тогда как для объектов типа Date
используется преобразование в строку (первым применяется метод toString()
). Однако преобразование выполняется не совсем так, как было описано выше: простое значение, возвращаемое методом valueOf()
или toString()
, используется непосредственно, без дополнительного преобразования в число или в строку. Оператор -
, например, преобразует свои операнды в числа. Следующий фрагмент демонстрирует поведение операторов +, -, == и >
при работе с объектами Date:
var now = new Date(); // Создать объект Date
typeof (now + 1) // => "строка": + преобразует дату в строку
typeof (now - 1) // => "число": - выполнит преобразование объекта в число
now == now.toString() // => true: неявное и явное преобразование в строку
now > (now -1) // => true: > преобразует объект Date в число