堆和栈
TIP
堆和栈的概念再每个语言都会有,下面咱们看看再javascript
中那些数据结构是存在堆
空间中,那些存在栈
空间中。以及对堆
和栈
的简单理解
堆
TIP
大致说一下什么是栈
, 先进后出,能够直接修改的就是栈
,栈
是自动分配相对固定大小的内存空间,并由系统自动释放,栈内存变量基本上用完就回收了。简单来说就是: 每个栈
都是独立的相互不影响,每个栈
都会开辟新的空间。存放在栈内存的类型有:数值(Number)
、字符串(String)
、null(Null)
、undefined
、Boolean
数值类型
javascript
//示例1
let a = 123;
let b = a;
a = 6;
console.log(a, b); //输出 6 123
//示例2
let a = 123;
let b = a;
b = 1;
console.log(a, b); //输出 123 1
总结: 数值类型的更改相互不影响
字符串类型
javascript
//示例1
let a = 'string1';
let b = a;
a = 'string2';
console.log(a, b); //输出 string2 string1
//示例2
let a = 'string1';
let b = a;
b = 'string2';
console.log(a, b); //输出 string1 string2
总结: 字符串类型的更改相互不影响
null 类型
javascript
//示例1
let a = null;
let b = a;
a = 1;
console.log(a, b); //输出 1 null
//示例2
let a = null;
let b = a;
b = 1;
console.log(a, b); //输出 null 1
总结: null 类型的更改相互不影响
Boolean 类型
javascript
let a = false;
let b = a;
a = true;
console.log(a, b); //输出 true false
//示例2
let a = false;
let b = a;
b = true;
console.log(a, b); //输出 false true
总结: Boolean 类型的更改相互不影响
undefined 类型
javascript
let a = undefined;
let b = a;
a = 1;
console.log(a, b); //输出 1 undefined
//示例2
let a = undefined;
let b = a;
b = 1;
console.log(a, b); //输出 undefined 1
总结: undefined 类型的更改相互不影响
堆
TIP
堆是动态分配内存,内存大小不固定,也不会自动释放,堆数据结构是一种无序的树状结构,指针存放在栈
内存中。存放在堆内存的类型有Object
、Array
、Function
关于堆的代码示例:
Object 类型
javascript
//示例1
let a = { name: 1 };
let b = a;
b.name = 2;
console.log(a, b); //输出:{name: 2} {name: 2}
//示例2
let a = { name: 1 };
let b = a;
a.name = 2;
console.log(a, b); //输出:{name: 2} {name: 2}
//示例3
let a = { name: 1 };
let b = a;
a = { name: 2 };
a.name = 3;
console.log(a, b); //输出:{name: 3} {name: 1}
总结:(示例 1、2)是用了一个堆内存的空间,当堆内存发生变化,引用该堆内存的变量都会发生变化, 当重新定义一个新的堆内存的话就跟之前引用的没关系了(示例 3)
Array 类型
javascript
//示例1
let a = [1, 2, 3, 4];
let b = a;
a[0] = 'h';
console.log(a, b); //输出:["h", 2, 3, 4] (4) ["h", 2, 3, 4]
//示例2
let a = [1, 2, 3, 4];
let b = a;
b[0] = 'h';
console.log(a, b); //输出:["h", 2, 3, 4] (4) ["h", 2, 3, 4]
总结:array 跟 object 一样 a = b 的话就是公用了一个堆内存,当该堆内存发生变化,a、b 都回发生变化
结束语
TIP
栈内存的类型有:数值(Number)
、字符串(String)
、null(Null)
、undefined
、Boolean
堆内存的类型有:Object
、Array
、Function
(怎么解决被引用请看浅拷贝/深拷贝)
示意图: