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 协议 ,转载请注明出处!