2016-07-15 2 views
-1

Почему bis not equal до null в конце следующего кода?Тот же объект не всегда одинаковый?

var a = { property: "value" }, 
    b = a; 
console.log(a === b); // true 

a = null; 
console.log(b); // Object { property: "value" } 

Я думал, что a и b две ссылки, привязанные к одному объекту и, следовательно, оба стали null.

+0

http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language –

+0

@BirjuShah: http://stackoverflow.com/a/ 3638034/4554883 –

+0

Это правда, но почему вы ожидаете, что значение b будет равно нулю. Я имею в виду, как вы связываете его с комментарием –

ответ

0

В строке:

a = 5; 

Вы указывая «а» на новый блок памяти, содержащий целое число, равное значению 5, переписав его предыдущая ссылка на вас первоначально созданный объект. Попробуйте вместо этого:

var a = { property: "value" }, 
b = a; 
console.log(a === b); // true 

a.property = 5; 
console.log(b); // Object {property: 5} 

Таким образом, вы не перезаписывать a, а изменение блока памяти ключевые property указывает на из строки со значением "value", в целое число со значением 5.

Это сохраняет ссылку a на блок памяти, содержащий объект, который вы изначально создали, и вы также устанавливаете 'b' для указания в следующей строке.

Редактировать: Вышеупомянутое должно было ответить на ваш предыдущий вопрос. Если вы установили a в null, он просто удалит ссылку на исходный объект. Объект не будет собирать мусор, а что-нибудь (b в этом случае) все еще имеет ссылку на него. После создания b ссылки независимы, но оба они указывают на один и тот же блок памяти.

+0

Вы имели в виду 'a.property = 5'? –

+0

К сожалению, мой плохой, скопируйте и вставьте неправильную часть из jsfiddle. –