>var s = "hello"; // Изначально имеется некоторый текст из строчных символов
>s.toUpperCase(); // Вернет "HELLO", но значение s при этом не изменится
>s // =>» "hello": оригинальная строка не изменилась
Кроме того, величины простых типов сравниваются по значению: две величины считаются одинаковыми, если они имеют одно и то же значение. Для чисел, логических значений, >null
и >undefined
это выглядит очевидным: нет никакого другого способа сравнить их. Однако для строк это утверждение не выглядит таким очевидным. При сравнении двух строковых значений JavaScript считает их одинаковыми тогда и только тогда, когда они имеют одинаковую длину и содержат одинаковые символы в соответствующих позициях.
Объекты отличаются от простых типов. Во-первых, они являются изменяемыми - их значения можно изменять:
>var о = { x:1 }; // Начальное значение объекта
>о.x = 2; // Изменить, изменив значение свойства
>о.у = 3; // Изменить, добавив новое свойство
>var а = [1,2,3] // Массивы также являются изменяемыми объектами
>а[0] = 0; // Изменить значение элемента массив
>а[3] = 4; // Добавить новый элемент
Объекты не сравниваются по значению: два объекта не считаются равными, даже если они будут иметь одинаковые наборы свойств с одинаковыми значениями. И два массива не считаются равными, даже если они имеют один и тот же набор элементов, следующих в том же порядке:
>var о = {х:1}, р = {х:1};// Два объекта с одинаковыми свойствами
>о === р // => false: разные объекты не являются равными
>var а = [], Ь = []; // Два различных пустых массива
>а === b // => false: различные массивы не являются равными
Чтобы подчеркнуть отличие от простых типов JavaScript, объекты иногда называют ссылочными типами. Если следовать этой терминологии, значениями объектов являются ссылки, и можно сказать, что объекты сравниваются по ссылке: значения двух объектов считаются равными тогда и только тогда, когда они ссылаются на один и тот же объект в памяти.
>var а = []; // Переменная а ссылается на пустой массив.
>var b = а; // Теперь b ссылается на тот же массив.
>Ь[0] = 1; // Изменение массива с помощью ссылки в переменной Ь.
>а[0] // => 1: изменение можно наблюдать в переменной а.
>а === b // => true: а и b ссылаются на один и тот же объект, поэтому они равны.
Как следует из примера выше, операция присваивания объекта (или массива) переменной фактически присваивает ссылку: она не создает новую копию объекта. Если в программе потребуется создать новую копию объекта или массива, необходимо будет явно скопировать свойства объекта или элементы массива. Следующий пример демонстрирует такое копирование с помощью цикла for (раздел 5.5.3):