js有五种基本数据类型,string,number,boolean,null,undefind。这五种类型的赋值,就是值传递。特殊类型对象的赋值是将对象地址的引用赋值。这时候修改对象中的属性或者值,会导致所有引用这个对象的值改变。如果想要真的复制一个新的对象,而不是复制对象的引用,就要用到对象的深拷贝。
当一个变量存放基本数据类型时与复杂的数据类型时分别存在以下的特点:
* 基本数据类型的特点:变量直接将基本数据类型的值存储在栈(stack)内存中
* 引用数据类型的特点:变量将引用数据类型的引用(可以看作是地址)存储在栈(stack)内存,而对象本身存放在堆内存里,在栈中引用指向堆中的对象。
其实当解释器寻找引用值时,会首先检索其在栈中的地址引用,取得地址后从堆中获得对象。
首先我们来看一个例子:
var num = 666;
var numCopy = num;
var obj = {name:"张三"};
var objCopy = obj;
对于以上的代码,变量的内存分配是在栈中,所以变量不可以存放堆中的对象,所以赋值就会出现两种情况