变量:变量就是在程序运行过程中它的值允许改变的量。 一个变量对应一块小内存, 它的值保存在此内存中。变量常常包含两部分:变量名和变量的值。
js中数据类型分为基本数据类型和引用数据类型。
-
基本类型值指的是那些保存在栈内存中的简单数据段,即这种值是完全保存在内存中的一个位置。包含
Number,String,Boolean,Null,Undefined ,Symbol
。 -
引用类型值指的是那些保存在堆内存中的对象,所以引用类型的值保存的是一个指针,这个指针指向存储在堆中的一个对象。除了上面的 6 种基本数据类型外,剩下的就是引用类型了,统称为 Object 类型。细分的话,有:Object 类型、Array 类型、Date 类型、RegExp 类型、Function 类型 等。
(一) 基本数据类型: Undefined,Null,Boolean,Number和String
(二)引用类型:对象,数组,函数
-
原始值: 存储在栈中的简单数据段,他们的值直接存储在变量访问的位置; 引用值: 存储在堆中的对象。
-
栈:一种数据结构,只能在某一段操作,后进先出; 允许操作一段是栈顶;宁外是栈底; 插入:push,删除:pop
-
堆:动态分配、释放程序所使用的对象 调用堆操作:先不知道程序所需对象的数量、大小; 对象太大,不适合堆栈分配器; 堆使用期间,分配给代码和堆栈以为的部分内存;
对象要进行扩展,放在堆中进行不断的扩展;而不是放在内存中; 查询时候;先从栈中读取内存地址,在找到堆内存的值;
栈的优势:存取速度比堆要快,仅次于直接位于CPU中的寄存器 缺点:
- 存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
- 堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,垃圾收集器会自动地收走这些不再使用的数据
- 但是缺点是由于在运行时动态分配内存,所以存取速度较慢。
所以相对于简单数据类型而言,他们占用内存比较小,如果放在堆中,查找会浪费很多时间,而把堆中的数据放入栈中也会影响栈的效率。比如对象和数组是可以无限拓展的,正好放在可以动态分配大小的堆中。
JavaScript具有自动垃圾收集机制
- 标记 null
- 局部变量;
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 }
- 内存,数据, 变量三者之间的关系: 内存是容器, 用来存储不同数据,变量是内存的标识, 通过变量我们可以操作(读/写)内存中的数据 。
- js中对变量的操作都是对栈中变量的内容(值或地址)进行操作,判断基本数据类型是否相等时,时对栈中变量的值进行比较,判断对象是否相等时比较的是栈中变量存放的地址值是否相等。
- js简单内存模型。