QQ图片20220109104305.png
console.log(a.age) 运行结果是13
因为,传参数时只是将a的内容(a对象堆空间所占内存的地址)复制一份给了fn2形参obj,即此时a和obj同时指向了a的对象在堆空间的内容,然后运行 obj={age:15} 代表重新建立了一个对象(跟a对象毫无关系),obj不再指向a对象的堆空间,将此对象地址给了obj。函数执行完毕,obj回收,{age:15}成了垃圾对象,堆空间没有变量指向它。所以a.age依然为13。

对象(引用)类型

  1. Object: 任意对象
  2. Function: 一种特别的对象(可以执行) —内部包含可运行的代码
  3. Array: 一种特别的对象(key为数值下标属性, 内部数据是有序的)

引用数据内存与堆内存

  1. 与其他语言不同,JS的引用数据类型,比如数组Array,它们值的大小是不固定的。引用数据类型的值是保存在堆内存中的对象。**JS不允许直接访问堆内存中的位置**,**因此我们不能直接操作对象的堆内存空间**。**在操作对象时,实际上是在操作对象的引用而不是实际的对象**。因此,引用类型的值都是按引用访问的。这里的引用,我们可以粗浅地理解为保存在栈内存中的一个地址,该地址与堆内存的实际值相关联。

内存分类

栈空间:变量(全局/局部)
堆空间:对象(真正的数据内容)
函数:一种特殊的对象。函数体放在空间,函数名放在空间,函数名在栈空间的内容即为函数体的地址。