显示对象属性值,而另一个引用对象为null

时间:2014-02-02 15:38:49

标签: javascript object

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现在

2 个答案:

答案 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