Отличительной особенностью объектов от значений простых типов является то, что простые значения остаются неизменными. Больше всего это относится к числам и булевым значениям. Немного сложнее обстоит дело со строковыми значениями, поскольку они являются массивами символов и может показаться, что значения строк легко изменить с помощью методов. Однако, это не так. При манипулировании данными со строкой, строковые методы лишь возвращают новое значение, а оригинальное значение остается незатронутым.

Величины простых типов сравниваются по значению. Результат считается истинным, если наборы данных несут в себе одинаковые значения (как правило побайтовое сравнение копии и оригинала). Объекты, напротив, сравниваются по ссылке, а не по значению, т.е. происходит сравнение ссылок на объект для определения их принадлежности к одному значению. Сравните:

Если в теле функции изменить значение, переданное ей в виде ссылки, то это значение будет изменено и за ее пределами.

Стоит отметить, что при сравнении два объекта отличаются друг от друга даже если у них одинаковый набор свойств с одними и теми же значениями. Схожая ситуация и с массивами, у которых идентичный набор элементов.

Если необходимо сравнить два объекта или массива, нужно сравнить значения их свойств или элементов. Для перебора свойств объекта применяют инструкцию for/in, но у такого подхода есть свои недостатки. Во-первых, при перечислении наследуются свойства прототипа и, чтобы их исключить, необходимо использовать фильтр. Во-вторых, порядок перебора свойств не гарантирован. В-третьих, ключи свойств объектов всегда являются строками, даже индексированные свойства массива.  А что касается массивов, то с ними работать намного проще, если элементы содержат простые типы данных. Так как массив — это упорядоченная коллекция пронумерованных значений, то все элементы массива можно сравнить с помощью инструкции for.