【JS】内存空间(堆和栈)

数据类型

  • 基本数据类型
数据类型含义
Number数值
String字符串
Boolean布尔值
Undefined未定义
Null
Symbol符号(ES6新增)
  • 复杂数据类型
数据类型含义
Array数组
Object对象
Function函数

内存空间

  • 我们的存储空间分为两种
  • :主要储存基本数据类型的内容
  • :主要存储复杂数据类型的内容

栈数据结构

  • 栈空间特点:先进后出,后进先出
- 栈中存取数据的方式与这种乒乓球的存放方式如出一辙。

- 处于盒子中最顶层的乒乓球5,它一定是最后被放进去,但可以最先被使用。

- 而我们想要使用底层的乒乓球1,就必须将上面的4个乒乓球取出来,让乒乓球1处于盒子顶层

在这里插入图片描述


  • 直接在栈空间内存储一个数据
  • var num = 100;,在内存中存储的情况

在这里插入图片描述

堆数据结构

  • 堆数据结构是一种树状结构,它的存取数据的方式,则与书架与书非常相似
书虽然也整齐的存放在书架上,但是我们只要知道书的名字,就可以很方便的取出我们想要的书,

而不用像从乒乓球盒子里取乒乓一样,非得将上面的所有乒乓球拿出来才能取到中间的某一个乒乓球。

好比在JSON格式的数据中,我们存储的key-value是可以无序的,因为顺序的不同并不影响我们的使用,我们只需要关心书的名字。

在这里插入图片描述


  • 复杂数据类型的存储
  1. 堆内存里面开辟一个存储空间
  2. 把数据存储到存储空间内
  3. 把存储空间的地址赋值给栈内存里面的变量
  4. 也就是说栈内存存的是它的地址不是值
  • 下面这个对象的存储
var obj = {
	name: 'jack',
	age: 18,
	gender: "男";
}

在这里插入图片描述

堆和栈比较

  • 我们只能直接访问栈内存里面的内容
  • 如果你想访问一个对象里面的成员
  • 因为对象本身在堆内存里面
  • 我们就要利用栈内存里面的地址,找到堆内存里面的数据存储空间
  • 然后访问内部里面的成员
var obj = {
	name: "Jack",
	age: 18
}
console.log(name);	// 报错
/*
这个就相当于直接在栈空间里面找 name 这个变量
但是 name 是储存在堆空间里面的,所以在栈里面找不到
因为栈空间只是一个地址
*/ 
console.log(obj.name);	// Jack
/*
这个就相当于先在栈空间里面找 obj 这个对象的地址
再通过 obj 这个对象的地址,去堆空间里面找 name 这个变量
obj.name 就相当于通过 点 前面的地址找到他后面的储存空间
*/ 

基本数据类型

  • 基本数据类型是之间的比较
  • 直接比较存在栈空间里面的值即可
var num = 1;
var str = '1';

console.log(num==str);	//true
  • 赋值就是把变量存储的值直接赋值给另一个变量
  • 赋值过后的两个变量就没有关系了
var a = 10;
var b = a;	// 
a = 20;
// 赋值过后的两个变量就没有关系了,不会影响
console.log(a);		// 20
console.log(b);		// 10

复杂数据类型

  • 复杂数据类型是地址之间的比较
  • 因为栈空间里面的变量存储的是它的地址
var obj1 = {name: 'jack'};
var obj2 = {name: 'jack'};

console.log(obj1==obj2);	//false
  1. 在上面我们创建了两个对象,那么就会在堆空间里面开辟两个存储空间存储数据(两个地址)
  2. 虽然储存的内容是一样的,那么也是两个储存空间,两个地址
  3. 复杂数据类型之间就是地址的比较,所以obj1obj2两个变量的地址不一样
  4. 所以我们得到的就是false

  • 赋值的时候,实际上就是把一个变量的地址给了另一个变量
  • 赋值过后,两个变量操作一个空间
var obj = {
	name: "Jack",
	age: 18
}
var newObj = obj;	
/*
相当于在栈空间里面从新开辟一个新的 newObj 存储空间
然后把 obj 把在栈空间里面的地址赋值给栈空间里面的 newObj 
并没有从新在堆空间开辟一个新的 newObj 存储空间
相当于 newObj 在堆空间里还是继续用的 obj 这个储存空间
*/ 
obj.age = 19;
// 赋值过后的两个变量因为是操作一个空间,会互相影响
console.log(obj.age);		// 19
console.log(newObj.age);	// 19
  • 看不懂?没关系,打个比方:
  • 复杂数据类型存储的地方看做是一个房子
  • 而在栈空间存的是打开这个房子的钥匙
  • newObj = obj不是说newObj新买了个房子
  • 而是相当于 obj 把钥匙复制了一份给了 newObj
  • 房子还是那个房子,并没有变
  • 然后 newObj 就能进去这个房子里面,把电视砸了
  • obj 进去的时候就会发现电视是坏的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗不甘坠落的流星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值