JavaScript---深拷贝之内存问题

一、栈和堆
  • 栈(heap)

js中的原始值存储在栈中,因为大小固定。由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。

保存在栈内存中的数据在内存中分别占有固定大小的空间,通过按值来访问。栈内存有如下特点:存储基本数据类型,按值访问,存储的值大小固定,系统自动分配和释放空间,主要是用来执行程序,空间小运行效率高,先进后出,后进先出

  • 堆(stack)

先进先出,一般是对象的存储,只将对象的引用(指向地址的指针)存储在栈中,真正的对象则放在堆中。由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。

引用类型都是保存在堆内存中。因为这种值的大小不固定的。实际上,引用类型的数据的地址指针是存储于栈中的,当我们想要访问引用类型的值,需要先从栈中获得对象的地址指针然后在通过地址指针找到堆中的所需要的数据。

堆内存的特点:存储引用数据类型,按引用访问,存储的值大小不定,可动态调整,手动分配和释放空间,主要用来存放对象,空间大,运行效率较低,是一种无序的存储,可根据引用直接获取。


二、对象拷贝
  • 浅拷贝

仅仅只是拷贝引用(指向地址的指针)而已,即建立新的指针,但依旧指向原对象。

【示例1】:

var arrayA = [1, 2, 3, 4, 5];
var arrayB = [];
arrayA.forEach(function(e) {
   
	arrayB.push(e);
})
var str = 'hello'
arrayA.push(str);
console.log(arrayA); // [1, 2, 3, 4, 5, "abc"]
console.log(arrayB); // [1, 2, 3, 4, 5]

注释:理解Array.forEach(function(e){ })的用法

参数:一个函数表达式,并且函数需带一个参数
使用:每次forEach都将获得数组的单个数据,并且,将这单个参数传递给上述函数作为参数,每次循环执行一次这个函数。

上述示例1,完成了拷贝,但是一旦数组内出现对象时,此拷贝方式便无法进行数组内对象深拷贝,示例如下:

【示例2】:

var arrayA = [1, 2, 3, 4, 5];
var arrayB = [];
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值