前端栈和堆浅析

##栈(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;
复制代码

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

**深拷贝**

转载于:https://juejin.im/post/5b9bb60d5188255c5f53daaf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值