Выбрать главу

Синтаксис формата JSON является лишь подмножеством синтаксиса языка JavaScript и не может использоваться для представления всех возможных значений, допустимых в JavaScript. Поддерживаются и могут быть сериализованы и восстановлены: объекты, массивы, строки, конечные числовые значения, true, false и null. Значения NaN, Infinity и -Infinity сериализуются в значение null. Объекты Date сериализуются в строки с датами в формате ISO (смотрите описание функции Date.toJSON()), но JSON.parse() оставляет их в строковом представлении и не восстанавливает первоначальные объекты Date. Объекты Function, RegExp и Error и значение undefined не могут быть сериализованы или восстановлены. ФункцияJSON.stringify() сериализует только перечислимые собственные свойства объекта. Если значение свойства не может быть сериализовано, это свойство просто исключается из строкового представления. Обе функции, JSON.stringify() и JSON.parse(), принимают необязательный второй аргумент, который можно использовать для настройки процесса сериализации и/или восстановления, например, посредством определения списка свойств, подлежащих сериализации, или функции преобразования значений во время сериализации. В справочном разделе приводится полное описание этих функций.

6.10. Методы класса Object

Как описывалось выше, все объекты в языке JavaScript (за исключением тех, что явно созданы без прототипа) наследуют свойства от Object.prototype. Эти наследуемые свойства являются первичными методами и представляют особый интерес для программистов на JavaScript, потому что доступны повсеместно. Мы уже познакомились с методами hasOwnProperty(), propertylsEnumerable() и isPrototy-peOf(). (И мы уже охватили достаточно много статических функций, определяемых конструктором Object, таких как Object.create() и Object.getPrototypeOf().) В этом разделе описывается несколько универсальных методов объектов, которые определены в Object.prototype и предназначены для переопределения в других, более специализированных классах.

6.10.1. Метод toString()

Метод toString() не требует аргументов; он возвращает строку, каким-либо образом представляющую значение объекта, для которого он вызывается. Интерпретатор JavaScript вызывает этот метод объекта во всех тех случаях, когда ему требуется преобразовать объект в строку. Например, это происходит, когда используется оператор + для конкатенации строки с объектом, или при передаче объекта методу, требующему строку.

Метод toString() по умолчанию не очень информативен (однако его удобно использовать для определения класса объекта, как было показано в разделе 6.8.2). Например, следующий фрагмент просто записывает в переменную s строку "[object Object]":

var s = { x:1, у:1 }.toString( );

Этот метод по умолчанию не отображает особенно полезной информации, поэтому многие классы определяют собственные версии метода toString(). Например, когда массив преобразуется в строку, мы получаем список элементов массива, каждый из которых преобразуется в строку, а когда в строку преобразуется функция, мы получаем исходный программный код этой функции. Эти специализированные версии метода toString() описываются в справочном руководстве. Смотрите, например, описание методов Array.toString(), Date.toString() и Function.toString().

В разделе 9.6.3 описывается, как можно переопределить метод toString() для своих собственных классов.

6.10.2. Метод toLocaleString()

В дополнение к методу toString() все объекты имеют метод toLocaleString(). Назначение последнего состоит в получении локализованного строкового представления объекта. По умолчанию метод toLocaleString(), определяемый классом Object, никакой локализации не выполняет; он просто вызывает метод toString() и возвращает полученное от него значение. Классы Date и Number определяют собственные версии метода toLocaleString(), возвращающие строковые представления чисел и дат в соответствии с региональными настройками. Класс Array определяет версию метода toLocaleString(), действующую подобно методу toString() за исключением того, что он форматирует элементы массива вызовом их метода toLocaleString(), а не toString().