我们来看一下下面一段简单代码的输出:
var obj = {a:{b:2}};
console.log("before:",obj);
var obj2 = obj; // 断点1
obj2.a.b = 0;
console.log("after:",obj);
当我们不打断点的时候,输出结果为:
before:{a:{b:0}}
after:{a:{b:0}}
当我们在断点1处打上断点后,当到达断点后,我们可以看到,控制台输出结果:
before:{a:{b:2}}
猜测这可能是console.log做的一个优化,因为整段代码执行完后,obj的值是改变了的,而为什么obj值会改变,这就需要弄清楚js中的基本类型和引用类型的区别。
js中的基本类型和引用类型:
基本类型:Number, Boolean, String, undefined, null
引用类型:Object, Function
基本类型的数据是存放在栈内存中的,引用类型的数据是存放在堆内存中的。
因此,基本类型的复制就是在栈内存中开辟出一个新的存储区域用来存储新的变量,两个值之间不会互相影响。
而引用类型的定义其实就是在栈内容中存储了一个指针,这个指针指向堆内存中改对象的存储地址,将引用类型复制给另一个变量时,实际是将该引用类型的指针给了变量,两个变量指向了同一个指针,因此这两个变量之间是相互影响的。