Поскольку я много раз описывал это новичкам, я обнаружил, что лучше всего рассматривать объекты в Javascript как передаваемые и назначаемые в качестве указателя (как в случае работы указателей в C / C ++). Итак, когда вы делаете это:
let a = [1,2,3];
let b = a;
Теперь у вас есть две переменные, каждая из которых имеет указатель на один и тот же массив [1,2,3]
. Я считаю, что лучше всего думать о массиве, существующем сам по себе, и теперь у вас есть две переменные, каждая из которых указывает на этот массив. Когда вы присваиваете b = a
, он не создает копию данных, он просто указывает b
на те же данные, на которые указывал a
.
Если вы модифицируете этот массив с помощью чего-то вродеa.push(4)
или присваивание типа a[0] = 9
, тогда один и только один массив, на который указывают a
и b
, был изменен. Таким образом, при доступе к этому массиву из a
или из b
вы увидите изменение, поскольку обе переменные указывают на один и тот же объект физического массива.
Но, если вы переназначите какой-либо другой массив на b
вот так:
b = [9,8,7];
Вы только что взяли новый массив и поместили указатель на него в b
. Другая переменная a
по-прежнему указывает на тот же исходный массив, к которому привык. Он никак не изменился.
Когда вы передаете массив в качестве аргумента, как вы делаете в своей функции modify()
, аргумент функции в функции аналогичен переменной b
вприведенный выше пример. Это просто еще одна переменная, которая указывает на тот же массив. Если вы измените сам массив, то обе переменные будут указывать на один и тот же измененный массив. Но если вы переназначите переменную аргумента, чтобы теперь указывать на какой-то другой массив, это повлияет только на эту переменную.