JS 中变量的储存

333 阅读3分钟

变量:变量就是在程序运行过程中它的值允许改变的量。 一个变量对应一块小内存, 它的值保存在此内存中。变量常常包含两部分:变量名和变量的值。

js中数据类型分为基本数据类型引用数据类型

  • 基本类型值指的是那些保存在栈内存中的简单数据段,即这种值是完全保存在内存中的一个位置。包含Number,String,Boolean,Null,Undefined ,Symbol

  • 引用类型值指的是那些保存在堆内存中的对象,所以引用类型的值保存的是一个指针,这个指针指向存储在堆中的一个对象。除了上面的 6 种基本数据类型外,剩下的就是引用类型了,统称为 Object 类型。细分的话,有:Object 类型、Array 类型、Date 类型、RegExp 类型、Function 类型 等。

(一) 基本数据类型: Undefined,Null,Boolean,Number和String

(二)引用类型:对象,数组,函数

  • 原始值: 存储在栈中的简单数据段,他们的值直接存储在变量访问的位置; 引用值: 存储在堆中的对象。

  • 栈:一种数据结构,只能在某一段操作,后进先出; 允许操作一段是栈顶;宁外是栈底; 插入:push,删除:pop

  • 堆:动态分配、释放程序所使用的对象 调用堆操作:先不知道程序所需对象的数量、大小; 对象太大,不适合堆栈分配器; 堆使用期间,分配给代码和堆栈以为的部分内存;

对象要进行扩展,放在堆中进行不断的扩展;而不是放在内存中; 查询时候;先从栈中读取内存地址,在找到堆内存的值;

栈的优势:存取速度比堆要快,仅次于直接位于CPU中的寄存器 缺点:

  1. 存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
  2. 堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,垃圾收集器会自动地收走这些不再使用的数据
  3. 但是缺点是由于在运行时动态分配内存,所以存取速度较慢。

所以相对于简单数据类型而言,他们占用内存比较小,如果放在堆中,查找会浪费很多时间,而把堆中的数据放入栈中也会影响栈的效率。比如对象和数组是可以无限拓展的,正好放在可以动态分配大小的堆中。

JavaScript具有自动垃圾收集机制

  1. 标记 null
  2. 局部变量;

JS 变量 内存

var a = {n : 1};
var b = a;
// js的赋值运算顺序永远都是从右往左的
// 但是“.”是优先级最高的运算符
a.x = a = {n : 2}; 
console.log(a.x);//undefined
console.log(b.x);//{ n: 2 }
  1. 内存,数据, 变量三者之间的关系: 内存是容器, 用来存储不同数据,变量是内存的标识, 通过变量我们可以操作(读/写)内存中的数据 。
  2. js中对变量的操作都是对栈中变量的内容(值或地址)进行操作,判断基本数据类型是否相等时,时对栈中变量的值进行比较,判断对象是否相等时比较的是栈中变量存放的地址值是否相等。
  3. js简单内存模型。