Java教程

内存概念:栈, 堆和深浅拷贝及复杂对象的深拷贝的实现

本文主要是介绍内存概念:栈, 堆和深浅拷贝及复杂对象的深拷贝的实现,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

内存概念

  • 栈:栈中存储简单的数据类型,提供浏览器运行是的内存环境,可以理解为内存条
  • 堆:存储复杂数据类型,可以理解为硬盘

JS数据类型

  • 简单数据类型: 字符串, 数字, 布尔, undefined, null
  • 复杂树类型: 所有的对象都是复杂数据类型(数组, 函数.)

数据创建过程

简单数据创建的过程
  • 1.创建一个值(存在栈中)
  • 2.声明一个变量,通过上下文关系对
  • 3.将创建的变量和值进行关联
复杂数据类型创建过程:
  • 1.创建一个对象值,在堆中开辟一块空间存储数据,并对应有一个16进制的地址
  • 2.声明一个变量名(存储在栈中)
  • 3.将栈中的变量与堆中的数据进行关联

深浅拷贝:

Q:一个简单数据类型之间相互赋值,修改了其中一个变量的值,另一个变量的值是否会变?
A:不会改变,简单数据类型是保存在栈中的,数据的复制是直接单独将一个变量的值复制了一份给了另一个变量,相互之间是没有关联的,修改了其中一个变量的值,另一个不会受到影响.

从这里也可以理解为,简单数据类型的复制默认就是深拷贝,也可以从这里来解释为什么操作字符串的API为什么都不会改变原字符串,字符串的恒定性

let a = 12;
let b = a;
console.log(a, b);// 12 12
b = 23;
console.log(a, b);// 12 23

Q:一个复杂数据类型之间相互赋值,修改了其中一个变量的值,另一个变量的值是否会变?
A:复杂数据类型在栈中保存的是堆中内存对应的一个地址,复杂数据的变量相互复制其实是栈中的地址的复制,其实对应的堆中的数据是同一份的,所以如果复杂数据类型相互复制后,修改了其中的一个变量的值,那另一个变量的值也是会变化的

let c = {
    name:'小明',
    age:12
}
let d = c;
c.name = '小红'
console.log(c, d); //{name:'小红',age:12}   {name:'小红',age:12}

复杂数据类型默认是浅拷贝的,如果想实现深拷贝就要使用遍历

说明:先更新到这里,后面补全分享内容

这篇关于内存概念:栈, 堆和深浅拷贝及复杂对象的深拷贝的实现的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!