首页 热点专区 小学知识 中学知识 出国留学 考研考公
您的当前位置:首页正文

JS基础稳固堆和栈理解

2024-12-07 来源:要发发知识网

什么是堆和栈?

堆和栈都是运行时内存中分配的一个数据区,因此也被称为堆区和栈区,但二者存储的数据类型和处理速度不同。

在js中的数据结构大致可以分为两种:

  1. 基本类型:Undefined、Null、Boolean、Number 和 String,这5中基本数据类型可以直接访问,他们是按照值进行分配的,存放在栈(stack)内存中的简单数据段,数据大小确定,内存空间大小可以分配。

  2. 引用类型:即存放在堆(heap)内存中的对象,变量实际保存的是一个指针,这个指针指向另一个位置。

stack栈的特点:先进后出,栈内存好比一个有底没有高的盒子,数据线存放在盒子底部;
js的基本数据是不可改变的;改变原始值的唯一途径是覆盖;

传值

从一个向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终指向同一个对象。即复制的是栈中的地址而不是堆中的对象。

从一个变量复向另一个变量复制基本类型的值,会创建这个值的副本。

shack的理解

var a =10;  //这一步会在shack中保存一个值10;
var b = a;  //这一步会在shack中复制一份a的值重新保存在一个地方;
a = 15;  //这一步会覆盖第一次保存在shack中的值,与b中的值没有关系
console.log(b);  // 10

heap的理解

var obj1 = {name:'bangbang',age:18};
var b = obj1;
var c = obj1.age;

console.log(b.name); //bangbang
console.log(c);      //18
//改变b和c的值
b.name = 'yanniu';
c = 22;
console.log(obj1.name);     //yanniu
console.log(obj1.age);       //18

以上看出:当我们改变b的数据的时候,我们看到了obj1.name的数据也在改变,但是我们改变c的数据的时候发现,obj1.age的值没有变化,这说明了:b和obj1变量操作的是同一个对象,c和obj1完全独立的。图示如下:


image
显示全文