01. Данные
Объекты-обёртки
![]() |
Числа, строки и логические значения относятся к элементарным типам. Это не объекты. Но, тем не менее, в языке JavaScript есть классы Number, String и Boolean, которые поддерживают элементарные типы ланных набором встроенных свойств и методов. |
В объектно-ориентированных языках программирования классами называют шаблоны, предназначенные для создания объектов (экземпляров класса). В JavaScript нет «настоящих» классов, но об этом мы поговорим позже.
Мы можем, например, записать:
"Роботландия".length // Равно 11
"Роботландия".charAt(0) // Равно "Р"
"Робот".concat("ландия") // Равно "Роботландия"
Посмотрите, к строке идёт обращение, как к объекту с использованием точечного синтаксиса. В первом случае прочитано значение свойства length (длина строки), во втором — вызван метод charAt(n) (возвращает n-й символ строки), в третьем — вызван метод concat(str) (объединяет строку со своим аргументом).
Свойство length, методы charAt(n) и concat(str) принадлежат встроенному в язык классу String. Как же можно применять их к строкам, которые не являются объектами? Можно. Дело в том, что всякий раз, когда мы пишем нечто вроде "Роботландия".length, интерпретатор JavaScript превращает строку в объект (создаёт экземпляр класса String) и именно к этому объекту применяет свойство length, после чего временный объект уничтожается.
Таким образом, данные элементарного типа в нужный момент автоматически превращаются в объекты, «оборачиваясь» свойствами и методами соответствующего класса. Классы Number, String и Boolean служат для создания «обёрток» элементарных типов данных (хотя их можно использовать и как обычные классы, создавая из них объекты с помощью оператора new).
Итак, когда строка (или другой элементарный тип) используется в объектном контексте, то есть когда идёт обращение к свойству или методу класса String, Number или Boolean, JavaScript создаёт соответствующий объект-обёртку. После завершения операции, объект-обёртка уничтожается.
Пример с числами:
var x = 45.7777777;
var y = x.toPrecision(4); // y равен "45.78"
К числу, которое хранится в переменной x, применяется метод toPrecision(точность) класса Number, который возвращает строковое представление числа, содержащее количество цифр, определяемое аргументом точность. Можно написать и так:
45.7777777.toPrecision(4) // Равно "45.78"
Такая запись смотрится довольно непривычно и не всегда проходит синтаксический контроль, например:
45.toPrecision(4) // Синтаксическая ошибка
Поэтому не рекомендуется применять методы обертки Number к числовым литералам (а для строк это обычная практика).
Можно записать:
true.toString(); // Равно строке "true"
Обёртка Boolean наименее интересна. Класс Boolean содержит только два метода: toString() и valueOf() — первый преобразует логическое значение в строку, второй — преобразует объект в значение элементарного типа, то есть в true или false.