深拷贝与浅拷贝 不知道大家是咋理解的 有没有从内存空间角度去理解 前天看了一个内存空间 堆栈 下面卖弄下
在学习数据结构时候 堆栈是很熟悉了 在一端去对数据的操作
简单说 栈为自动分配内存空间 由系统自动释放
堆是动态分配的内存 大小不定也不会自动释放
- 栈数据结构网上好的例子
上图很详细的说明了栈数据结构空间的存储
对于栈来说 栈的数据操作 都要在栈顶来操作- 堆数据结构
上面可以看到都是散落的
对于堆来说 数据项没有固定顺序 不想栈一样有顺序 在堆操作数据可以任何顺序操作 不需要必须在顶部来操作js 数据类型 和堆 栈
js中数据类型分为两类基本类型: Undefined Null Boolean Numer String 5种基本数据类型放在栈内存中简单数据段 数据大小确定 内存空间自动分配
var name = 'jozo'var city = 'gaungzhou'var age = 22复制代码
上面有几个基本类型变量 在内存中结构
内存中 包括了变量的 标识 和 值
引用类型: Object Array fun 这些引用类型 比如数组 他们的值大小是不固定的 这些放在堆内存中 js是不允许直接访问堆内存因此不能直接操作对象堆内存空间 在变量中实际上保存一个指针 这个指针指向另一个位置 实际要操作的是一个指针 不是实际对象 这个地址跟堆内存的实际值相关联
var a = 20 var b = 'abc' var c = true var d = { m:20 }复制代码
上面js中的数据类型内存存储
数据类型特性
看基本数据类型
var a = 1var b = ab = 2 //a还是1复制代码
基本数据类型保存在栈中 系统自动为变量分配一个值 a b 都是1 但是他们是栈中两个相互对立的东西 所以修改b 对于a来说没有影响
看引用数据类型
var m = { a: 10, b: 20 }var n = mn.a = 15复制代码
引用类型真正的对象保存在堆中 var m = {} 在栈中保存了一个标识跟值 根据上述说的引用类型栈中变量对象保存是一个 堆内存的指针地址
var n = m 这里栈中自动为其分配一个空间 也是保存一个标识跟值 值也是保存的一个指针地址n.a = 15 改变了n的a属性 虽然栈中保存的两个相互独立东西 但是指针指向堆内存是对象是一样的 就导致了 m 也改变了
可以看到如果通过这种方式来看的话 引用类型 基本类型本质上的区别 按值 按址
下一篇 参考链接: