Skip to content
On this page

堆和栈

TIP

堆和栈的概念再每个语言都会有,下面咱们看看再javascript中那些数据结构是存在空间中,那些存在空间中。以及对的简单理解

TIP

大致说一下什么是, 先进后出,能够直接修改的就是是自动分配相对固定大小的内存空间,并由系统自动释放,栈内存变量基本上用完就回收了。简单来说就是: 每个都是独立的相互不影响,每个都会开辟新的空间。存放在栈内存的类型有:数值(Number)字符串(String)null(Null)undefinedBoolean

数值类型

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

堆是动态分配内存,内存大小不固定,也不会自动释放,堆数据结构是一种无序的树状结构,指针存放在内存中。存放在堆内存的类型有ObjectArrayFunction

关于堆的代码示例:
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)undefinedBoolean
堆内存的类型有:ObjectArrayFunction(怎么解决被引用请看浅拷贝/深拷贝)

示意图: 示意图

Released under the MIT License.