Действительно короткий ответ на оба ваших вопроса заключается в том, что когда вы делаете одну переменную равной другой, создается копия того, что находится в первой переменной, и сохраняется во второй переменной - нет никакой связи междудве переменные.
Но, читайте подробнее, и почему в некоторых случаях может показаться, что есть ссылка ...
JavaScript, как и многие языки, разделяет данныена две широкие категории: типы значений и ссылочные типы.Типы значений JavaScript: его примитивы :
- строка
- число
- логическое значение
- ноль
- undefined
- символ
Когда вы присваиваете какой-либо из этих типов переменной, фактические данные сохраняются в этой переменной, и если вы установите одну переменную, равнуюдругая, копия (не связывание) примитива создается и сохраняется в новой переменной:
var a = 10; // Store the actual number 10 in the a variable
var b = a; // Store a COPY of the actual number stored in a (10) in the b variable
a = 50; // Change the actual data stored in a to 50 (no change to b here)
console.log(b); // 10
Когда вы работаете с ссылочными типами , происходит что-то немного другое.Присвоение переменной ссылочному типу означает, что переменная содержит только ссылку на область памяти, где фактически хранится объект, а не сам объект.Таким образом, когда вы делаете это:
var a = {foo:"bar"};
a
на самом деле не хранит сам объект, он только сохраняет место в памяти, где можно найти объект (то есть 0x3C41A).
Но что касается установки другой переменной, равной первой, то она все еще работает так же, как и с примитивами - копия того, что в первой переменной, сделано и передановторая переменная.
Вот пример:
// An object is instantiated in memory and a is given the address of it (for example 0x3C41A)
var a = {};
// The contents of a (the memory location of an object) is COPIED into b.
// Now, both a and b hold the same memory location of the object (0x3C41A)
var b = a;
// Regardless of whether a or b is used, the same underlying object
// will be affected:
a.foo = "test";
console.log(b.foo); // "test"
// If one of the variables takes on a new value, it won't change
// what the other variable holds:
a = "something else";
console.log(b); // The object stored in memory location (0x3C41A)
Итак, в ваших первых тестах у вас просто есть два способа доступа к одному объекту, а затем вы меняете то, что удерживает a
(место в памяти объекта) к другому объекту и, следовательно, теперь у вас есть только один способ доступа к исходному объекту: b
.
Если мы попытаемся «очистить» a
, установивa = {}
, объект b
останется неизменным.Я не понимаю, почему манипулирование объектом таким способом приводит к другому результату, чем в первом примере.
Потому что теперь мы знаем, что a = {}
не очищает объект.Он просто указывает a
на что-то еще.