不知是否能实现的对象问题

var a=new Object()
      a.name = "Nicholas";    
      console.log(a.name)
      
      var a = new Object();     a.name = "Greg";
      console.log(a.name)
      

在js中对象创建是被分配再内存的不同区域,那样的话创建两个同名的对象,给予不同的值我去调用.name的时候应该会取到哪个值?

问题1:实验结果显示是最后创建的Greg这里面的逻辑是怎么样的呢?
问题2:能否读取到第一次创建的a.name = "Nicholas";呢?

阅读 2.1k
2 个回答

这段代码在执行的时候与下面代码等价

var a
a = new Object()
a.name = "Nicholas";
console.log(a.name)

a = new Object();
a.name = "Greg";
console.log(a.name)

要点在于var不会重复声明,引擎在解析到var的时候会寻找当前作用域是否有同名变量,如果有就不会重复创建变量。因此你代码中的操作都是在对aa.name赋值而已;由于后面的赋值会覆盖前面的,因此最后打印的结果是Greg

对于第二个问题,对象是引用类型,赋值时传递的是内存地址,因此在垃圾回收算法执行之前,第一个 new Object是会存在于内存中的,但是没有对这个Object的引用,你无法访问这个变量。因此要想实现问题2的目的,需要把第一个Object同时赋给另外一个变量b,后面不管a怎么变,b永远指向第一个Object

这段代码执行的操作可以看这张图:
图片描述

第一次给a变量引用一个内存地址,里面的数据为name="Nicholas"
第二次又将变量a引用了一个新的内存地址,此时里面的数据为name="Greg";

这时候a就切断了与Nicholas的联系,它引用的是内存中成员为name="Greg"的Object。

第一个对象因为缺少引用无法访问到,会被垃圾回收器回收。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题