内存概念:栈, 堆和深浅拷贝及复杂对象的深拷贝的实现
作者:互联网
内存概念
- 栈:栈中存储简单的数据类型,提供浏览器运行是的内存环境,可以理解为内存条
- 堆:存储复杂数据类型,可以理解为硬盘
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}
复杂数据类型默认是浅拷贝的,如果想实现深拷贝就要使用遍历
说明:先更新到这里,后面补全分享内容
标签:12,变量,复杂,一个,数据类型,深浅,内存,拷贝 来源: https://blog.csdn.net/weixin_45634433/article/details/118882363