Давайте посмотрим в память компьютера¹. Прежде всего, создаются две переменные, a
и b
. В основном это области памяти, которые заполняются значением:
location | name² | value
-------------------------------------
1 | a | undefined
2 | b | undefined
Теперь a
инициализируется и создается новый массив. Этот массив, однако, не сохраняется непосредственно под переменной, а в другом месте, внутри a
есть только ссылка на это место:
location | name² | value
-------------------------------------
1 | a | ➡️ 3
2 | b | undefined
3 | | [1, 2, 3]
Теперь, когда вы делаете b = a
ссылка копируется, вы в итоге получаете:
location | name² | value
-------------------------------------
1 | a | ➡️ 3
2 | b | ➡️ 3
3 | | [1, 2, 3]
Теперь, когда вы делаете a = [5,5]
, создается другой массив, и a
ссылается на это. b
не изменился, но все еще ссылается на другой массив.
location | name² | value
-------------------------------------
1 | a | ➡️ 4
2 | b | ➡️ 3
3 | | [1, 2, 3]
4 | | [5, 5]
Или, если вы делаете b = {value: a}
:
location | name² | value
-------------------------------------
1 | a | ➡️ 4
2 | b | ➡️ 5
3 | | [1, 2, 3] // waiting for GC
4 | | [5, 5]
5 | | { value: ➡️4 }
¹ да, JavaScript - это интерпретируемый язык, так что вы не будете точно знать, как он в итоге окажется в памяти, в зависимости от движка. Тем не менее, JS выводит свои концепции из других языков, и поэтому часто полезно думать на низком уровне.
² не существует такой вещи, как имя определенной области памяти, я просто добавил это для ясности.