var о = {х:1}, р = {х:1};// Два объекта с одинаковыми свойствами
о === р // => false: разные объекты не являются равными
var а = [], Ь = []; // Два различных пустых массива
а === b // => false: различные массивы не являются равными
Чтобы подчеркнуть отличие от простых типов JavaScript, объекты иногда называют ссылочными типами. Если следовать этой терминологии, значениями объектов являются ссылки, и можно сказать, что объекты сравниваются по ссылке: значения двух объектов считаются равными тогда и только тогда, когда они ссылаются на один и тот же объект в памяти.
var а = []; // Переменная а ссылается на пустой массив.
var b = а; // Теперь b ссылается на тот же массив.
Ь[0] = 1; // Изменение массива с помощью ссылки в переменной Ь.
а[0] // => 1: изменение можно наблюдать в переменной а.
а === b // => true: а и b ссылаются на один и тот же объект, поэтому они равны.
Как следует из примера выше, операция присваивания объекта (или массива) переменной фактически присваивает ссылку: она не создает новую копию объекта. Если в программе потребуется создать новую копию объекта или массива, необходимо будет явно скопировать свойства объекта или элементы массива. Следующий пример демонстрирует такое копирование с помощью цикла for (раздел 5.5.3):
var a=['a,,,b,,'c’]; // Копируемый массив
var b = []; // Массив, куда выполняется копирование
for(var і = 0; і < a.length; i++) { // Для каждого элемента в массиве а[]
b[і] = а[і]; // Скопировать элемент а[] в b[]
}
Точно так же, если потребуется сравнить два отдельных объекта или массива, необходимо будет сравнить значения их свойств или элементов. Ниже приводится определение функции, сравнивающей два массива:
function equalArrays(a, b) {
if (a.length != b.length) return false; // Массивы разной длины не равны
for(var і = 0; і < a.length; і++) // Цикл по всем элементам
if (а[і] !== b[i]) return false; // Если хоть один элемент
// отличается, массивы не равны
return true; // Иначе они равны
}
3.8. Преобразование типов
JavaScript может гибко преобразовывать один тип в другой. Мы уже могли убедиться в этом на примере логических значений: везде, где интерпретатор JavaScript ожидает получить логическое значение, можно указать значение любого типа и JavaScript автоматически выполнит необходимое преобразование. Одни значения («истинные» значения) преобразуются в значение true, а другие («ложные») - в false. То же относится и к другим типам: если интерпретатор ожидает получить строку, он автоматически преобразует любое другое значение в строку. Если интерпретатор ожидает получить число, он попробует преобразовать имеющееся значение в число (в случае невозможности такого преобразования будет получено значение NaN). Например:
10 + " objects" // => "10 objects". Число 10 преобразуется в строку
"7" * "4" // => 28: обе строки преобразуются в числа
var n = 1 - "x"; // => NaN: строка "x" не может быть преобразована в число
n + " objects" // => "NaN objects": NaN преобразуется в строку "NaN"