##栈(stack)和堆(heap)
Stack为自动分配的内存空间,它由系统自动释放;
Heap则是动态分配的内存,大小不定也不会自动释放;
基本类型和引用类型
**基本类型:**存放在栈中的简单数据段,数据大小确定,内存空间大小可以分配。 5种基本数据类型:undefined、null、boolean、number和string,他们是直接按值存放的,所以可以直接访问。
**引用类型:**存放在堆内存中的对象,变量实际保存的是一个指针,这个指针指向另一个位置。每个空间大小不一样,要根据情况进行特定的分配。
当我们需要引用类型(如对象,数组,函数等)的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。
栈(stack)和堆(heap)
基本类型与引用类型最大的区别是传值与传址的区别。
例
//传值
var obj1=10;
var obj2=obj1;
obj2=2;
console.log(obj1);//10
console.log(obj2);//2
//传址
var obj={a:1,b:2};
console.log(obj);//{a:1,b:2}
var obj2=obj;
obj2.a=13;
console.log(obj);//{a:13,b:2}
console.log(obj2);//{a:13,b:2}
复制代码
浅拷贝
在定义一个对象或数组时,变量存放的是一个地址。 当我们使用对象拷贝时,如果属性是对象或数组时,这时候我们传递的也是另一个地址。因此子对象在访问该属性时,会指向父对象指向的堆内存中,即父子对象发生了关联,两者会指向同一内存空间
例
var arr=[{a:"1",b:"2"},{a:"2",b:"3"}];
//拷贝一个数组(浅拷贝)
var arr3=arr;
console.log(arr==arr3);//true
var arr2=arr.concat();
console.log(arr2);//[{a:"1",b:"2"},{a:"2",b:"3"}]
console.log(arr==arr2);//false;
复制代码
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
**深拷贝**