数据-变量-内存
created on 21/03/03
1、什么是数据
- 存储在内存中代表特定的信息,本质上是0101......
- 数据的特点:可传递var a =3; var b =a;,可运算
- 一切皆数据
- 内存中所有操作的目标:数据
- 算术运算
- 逻辑运算
- 赋值
- 调用函数传参
2、什么是内存
- 内存条通电后产生的可存储数据的空间。(临时的)
- 内存产生和死亡:内存条(电路板)>通电>产生内存空间>存储数据>处理数据>断电>内存空间和数据都消失
- 内存空间是临时的,而硬盘空间是持久的
- 分配内存:声明变量和函数或创建对象时,js引擎会自动为此分配一定大小的内存来存放对应的数据
- 释放内存:清空内存中的数据,标识内可以再分配使用(内存不释放就不能复用)
- 自动释放:栈空间的局部变量
- 垃圾回调器回调:堆空间的垃圾对象(赋空值=null)
- 一块内存包含2个数据
- 内部存储的数据(一般数据/地址数据)
- 内存地址值数据
- 内存分类
- 栈:全局变量/局部变量(空间较小)
- 堆:对象(空间较大)
3、什么是变量
- 值可以变化的量,由变量名和变量值组成
- 一个变量都对应了一块内存,变量名用来查找对应的内存,变量值为内存中保存的数据
4、内存、数据、变量三者之间的关系
-
内存是一个容器,用来存储程序运行需要操作的数据
-
变量是内存的标识,我们通过变量找到对应的内存,进而操作(读/写)内存中的数据
5、关于赋值与内存的问题
- var a = xxx,a 内存中到底保存的是什么
- xxx是基本数据,保存是这个数据
- xxx是对象,保存的是对象的地址值
- xxx是一个变量,保存的xxx的内存内容(可能是基本数据,也可能是地址值)
6、关于引用变量赋值问题
- n个引用变量指向同一个对象,通过一个变量修改对象内部数据,其他所有变量看到的是修改后的数据,
- 2个引用变量指向同一个变量,其中一个引用变量指向另一个对象,另一个引用变量依然指向前一个对象
//1、多个引用变量指向同一个对象,通过变量修改同一个对象中的数据,指向同一个对象的其他变量可以看到修改后的数据
var obj1 = {name: 'tom'};
var obj2 = obj1;
obj1.name = 'jack';
console.log(obj2.name); //jack
function fn(obj){
obj.name = 'A';
}
fn(obj1);
console.log(obj2.name); //A
//2、多个引用变量指向同一个对象,其中有变量指向另一个对象时,开始指向同一个对象的引用变量不能看到修改后的对象内容
var a = {age: 12};
var b = a;
console.log(b.age); //12
a = {name: 'BOB', age: 13};
b.age = 14;
console.log(a.age, a.name, b.age); //13 BOB 14
function fn2(obj){
obj = {age:15};
}
fn2(a);
console.log(a.age); //13
7、在js调用函数时传递变量参数时,是值传递还是引用传递
只有值传递,没有引用传递,传递的都是变量的值,只是这个值可能是基本数据,也可能是地址(引用)数据。如果后一种看成是引用传递,那就值传递和引用传递都可以有。
- 理解1:都是值(基本/地址值)传递
- 理解2:可能是值传递,也可能是引用传递(地址值)
var a = 3;
function fn(a){ //(赋值)等式左边是写 形参a = 实参a
a = a + 1;
}
fn(a);
console.log(a); //3
var obj = {name: 'tom'};
function fn2(obj){ //形参obj不是传入对象的内容,而是堆中保存内容的地址值
console.log(obj.name);
}
fn2(obj); //tom
8、js引擎如何管理内存
- 内存生命周期
- 分配小内存空间,得到使用权
- 存储数据,可以反复进行操作
- 释放小内存空间
- 释放内存(全局变量不会释放)
- 局部变量:函数执行完自动释放
- 对象:成为垃圾对象==>垃圾回收器回收

浙公网安备 33010602011771号