Переменные, хранящие значения и ссылки
Понимание того, как именно в JavaScript назначаются значения переменных крайне важно для тех, кто хочет писать правильно работающий код. Непонимание этого механизма ведёт к написанию программ, в которых значения переменных могут непреднамеренно меняться.
JavaScript, если некая сущность имеет один из примитивных типов (в частности — это типы Boolean
, null
, undefined
, String
и Number
), всегда работает со значением этой сущности. То есть, в соответствующую переменную записывается именно значение. Если же речь идёт об объекте (это, например, типы Object
, Array
, Function
), то, при назначении его переменной, в неё записывается ссылка на него, адрес, по которому он расположен в памяти.
Рассмотрим пример. В следующем фрагменте кода в переменную var1
записана строка. После этого в переменную var2
записано значение переменной var1
. Так как переменная var1
имеет примитивный тип (String
), то в var2
будет записана копия строки, имеющейся в var1
. Это позволяет рассматривать var2
как переменную, полностью независимую от var1
, хотя и хранящую то же значение, что и var1
. Запись в var2
нового значения на var1
не влияет.
Теперь рассмотрим пример работы с объектами.
Как видите, здесь мы работаем с переменной var2
, а то, что с ней происходит, отражается и на переменной var1
так как они хранят ссылку на один и тот же объект. Несложно представить себе к чему подобное может привести в реальном коде в том случае, если некто решит, что переменные, хранящие объекты, ведут себя так же, как переменные, хранящие значения примитивных типов. Особенно это неприятно, например, в случаях, когда создают функцию, которая рассчитана на работу с переданным ей объектным значением, и эта функция данное значение непреднамеренно изменяет.