>var s = "test"; // Начальное строковое значение.
>s.len = 4; // Установить его свойство.
>var t = s.len; // Теперь запросить значение свойства.
В начале этого фрагмента переменная >t
имеет значение >undefined
. Вторая строка создает временный объект >String
, устанавливает его свойство >lеn
равным 4 и затем уничтожает этот объект. Третья строка создает из оригинальной (неизмененной) строки новый объект >String
и пытается прочитать значение свойства >len
. Строки не имеют данного свойства, поэтому выражение возвращает значение >undefined
. Данный фрагмент показывает, что при попытке прочитать значение какого-либо свойства (или вызвать метод) строки числа и логические значения ведут себя подобно объектам. Но если попытаться установить значение свойства, эта попытка будет просто проигнорирована: изменение затронет только временный объект и не будет сохранено.
Временные объекты, которые создаются при обращении к свойству строки, числа или логического значения, называются объектами-обертками, и иногда может потребоваться отличать строки от объектов >String
или числа и логические значения от объектов >Number
и >Boolean
. Однако обычно объекты-обертки можно рассматривать просто как особенность реализации и вообще не думать о них. Вам достаточно будет знать, что строки, числа и логические значения отличаются от объектов тем, что их свойства доступны только для чтения и что вы не можете определять для них новые свойства.
Обратите внимание, что существует возможность (но в этом почти никогда нет необходимости или смысла) явно создавать объекты-обертки вызовом конструктора >String(), Number()
или>Boolean()
:
>var s = "test", n = 1, b = true; // Строка, число и логическое значение,
>var S = new String(s); // Объект String
>var N = new Number(n); // Объект Number
>var В = new Boolean(b); // Объект Boolean
При необходимости интерпретатор JavaScript обычно автоматически преобразует объекты-обертки, т. е. объекты S, N и В в примере выше, в обертываемые ими простые значения, но они не всегда ведут себя точно так же, как значения s, n и Ь. Оператор равенства >==
считает равными значения и соответствующие им объекты-обертки, но оператор идентичности >===
отличает их. Оператор >typeof
также обнаруживает отличия между простыми значениями и их объектами-обертками.
3.7. Неизменяемые простые значения и ссылки на изменяемые объекты
Между простыми значениями (>undefined
, >null
, логическими значениями, числами и строками) и объектами (включая массивы и функции) в языке JavaScript имеются фундаментальные отличия. Простые значения являются неизменяемыми: простое значение невозможно изменить (или «трансформировать»). Это очевидно для чисел и логических значений - нет никакого смысла изменять значение числа. Однако для строк это менее очевидно. Поскольку строки являются массивами символов, вполне естественно было бы ожидать наличие возможности изменять символы в той или иной позиции в строке. В действительности JavaScript не позволяет сделать это, и все строковые методы, которые, на первый взгляд, возвращают измененную строку, на самом деле возвращают новое строковое значение. Например: