Я написал следующий JavaScript:
var myArray = ['a', 'b', 'c'];
var copyOfMyArray = myArray;
copyOfMyArray.splice(0, 1);
alert(myArray); // alerts ['b','c']
alert(copyOfMyArray); // alerts ['b','c']
var myNumber = 5;
var copyOfMyNumber = myNumber;
copyOfMyNumber = copyOfMyNumber - 1;
alert(myNumber); // alerts 5
alert(copyOfMyNumber); // alerts 4
Этот код объявляет переменную myArray
и устанавливает ее в значение массива. Затем он объявляет вторую переменную copyOfMyArray
и устанавливает ее в myArray
.
Он выполняет операцию на copyOfMyArray
, а затем предупреждает как myArray
, так и copyOfMyArray
. Так или иначе, когда я выполняю операцию на copyOfMyArray
, кажется, что та же операция выполняется на myArray
.
Затем код выполняет одно и то же с числовым значением: он объявляет переменную myNumber
и устанавливает ее в числовое значение. Затем он объявляет вторую переменную copyOfMyNumber
и устанавливает ее в myNumber
. Он выполняет операцию на copyOfMyNumber
, а затем предупреждает как myNumber
, так и copyOfMyNumber
. Здесь я получаю ожидаемое поведение: разные значения для myNumber
и copyOfMyNumber
.
В чем разница между массивом и числом в JavaScript, который, по-видимому, меняет массив, изменяет значение копии массива, где, когда изменение числа не изменяет значение копии числа?
Я предполагаю, что по какой-то причине массив ссылается по ссылке и номеру по значению, но почему? Как я могу узнать, какое поведение ожидать от других объектов?