JS中的栈和堆
**JS****中的栈和堆**
一.栈和堆
- 栈(stack):栈会自动分配内存空间,会自动释放,存放基本类型,简单的数据段,占据固定大小的空间。
- 基本类型:String,Number,Boolean,Null,Undefined
- 堆(heap):动态分配的内存,大小不定也不会自动释放,存放引用类型,指那些可能由多个值构成的对象,保存在堆内存中,包含引用类型的变量,实际上保存的不是变量本身,而是指向该对象的指针或者说是地址。
- 引用类型:Function,Array,Object
二.区别
- 栈:所有在方法中定义的变量都是放在栈内存中,随着方法的执行结束,这个方法的内存栈也自然销毁。
- 优点:存取速度比堆快,仅次于直接位于 CPU 中的寄存器,数据可以共享;
- 缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
- 堆:堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(参数传递)。创建对象是为了反复利用,这个对象将被保存到运行时数据区。
三.栈和堆的溢出
- 栈:可以递归调用方法,这样随着栈深度的增加,JVM 维持着一条长长的方法调用轨迹,知道内存不够分配,产生栈溢出。
- 堆:循环创建对象,通俗点就是不断的 new 一个对象。
- 下面来看看传值和传址的区别
- 其实这两者区别就是基本类型和引用类型的区别,话不多说看栗子
四 .浅拷贝和深拷贝
- -准备知识点-
- –>基本的数据类型之间赋值,得到都是独立的值、
- –>而引用数据类型之间的赋值,则是获取到的地址,数据任何变化,赋值方和被赋值方都会改变
- 所以我们需要拷贝、且拷贝也是引用数据类型上才存在的操作。
- >>浅拷贝
- 只是拷贝目标对象的一层数据,也就是 如果该对象或者数组中除了基础数据类型外,还有其他的引用数据类型。则无法拷贝更深的数据了。
- –常用方法
- 扩展运算符 […arr] 就是浅拷贝了 arr
- Object.assign 方法 第一个参必须写。数组就写 []、对象就写{},在括号里面还可以添加新的属性。
- 第二参数就是要拷贝的对象或数组了。
- >>深拷贝
- 其实深拷贝可以拆分成 2 步,浅拷贝 + 递归,就是一层一层的拷贝,直到只有基本数据类型为止。
- 浅拷贝时判断属性值是否是对象,如果是对象就继续进行递归操作,直到只有基本数据类型为止。就是深度克隆,
- –常见方法
- 先转成字符串,在转会 js 对象,实现深拷贝
- **但是缺点是 **
- 当值为函数、symbol、undefined 时 这个方法不可以哦
- 引用外部库实现。
- JQ 的 jQuery.extend()
- lodash 库的 lodash.cloneDeep()
- 详细代码
- https://www.cnblogs.com/mouseleo/p/11115174.html
- jquery 中的$.extend();
- JSON 对象的 JSON.parse()和 JSON.stringify();
- 4、Lodash 中的_.cloneDeep()
**<常用>**
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!