var obj={name: "faizan"}
var obj2= obj;//obj2 pointing to the same memoray location of obj
console.log("before making null obj",obj2.name);
obj={}; //obj became null
console.log("after making null obj",obj2.name);//now this will need to be null but is working why??
我创建了对象(obj),然后将其分配给第二个对象(obj2),最后使obj为null 但在那之后,obj2.name向我展示了“faizan”。为什么?它需要显示任何原因obj null现在
答案 0 :(得分:2)
您认为它的工作方式不正确。第二次设置obj = {};
时,您不会使原始对象无效。您正在创建一个全新的空对象,而obj2仍然引用原始对象。
您可以使用父容器实现您的想法:
var obj = { container: { name: 'faizan' } };
var obj2 = obj;
obj.container = {};
答案 1 :(得分:0)
正如你所说:
obj={};
这种方式只需将obj引用到堆中的新引用和内容
{name: "faizan"}
像以前一样在堆中存在,而obj2现在引用堆中的{name:“faizan”}。
如果你想将obj深度复制到obj2,就像这样:
function copy(o){
var copy = Object.create( Object.getPrototypeOf(o) );
var propNames = Object.getOwnPropertyNames(o);
propNames.forEach(function(name){
var desc = Object.getOwnPropertyDescriptor(o, name);
Object.defineProperty(copy, name, desc);
});
return copy;
}
var obj={name: "faizan"}
var obj2 = copy(obj);
然后把obj引用为null
obj = null
GC将自动回收obj