数据-变量-内存的联系
var a = xxx,变量a的内存中到底保存的是什么?
- 若xxx是一个基本数据类型,则保存的就是这个数据本身
- 若xxx是一个对象,则保存的是该对象的地址值
- 若xxx是一个变量,则保存的是xxx的内存中的内容,可能是基本的数据,也可能是地址值
引用变量的赋值问题
2个引用变量指向同一个对象,通过其中一个变量修改对象内部的数据,另一个变量看到的也是修改后的数据。
var a = {name: 'Leon'};
var b = a;
b.age = 12;
console.log(a.age);
// 输出为 12
function fn(obj) {
obj.name = 'Jack';
};
fn(a);
console.log(b.name);
// 输出为 Jack
2个引用变量指向同一个对象,让其中一个变量指向另一个对象,另一个变量仍会指向原对象。
var a = {age: 12};
var b = a;
a = {name: 'Leon', age: 13};
console.log(b.age, a.name, a.age);
// 输出结果为 12 Leon 13
function fn(obj) {
obj = {age: 15};
};
fn(a);
console.log(a.age);
// 输出为 13
// 函数执行完毕后内部的变量会被释放,{age: 15}这个对象会变成垃圾对象被回收
函数传递变量参数的问题
在JS调用函数传递变量参数时,是值传递还是引用传递?
- 理解一:都是值传递(基本值 / 地址值)
- 理解二:可能是值传递,也可能是引用传递(地址值)
- 本质:传递的是该变量的内存中的内容
var a = 3;
function fn(a) {
a = a + 1;
};
fn(a);
console.log(a);
// 输出为 3
JS内存管理
JS引擎如何管理内存?
内存生命周期:
- 分配小内存空间,得到它的使用权
- 存储数据,可以反复进行操作
- 释放小内存空间
释放内存:
- 局部变量:函数执行完后自动释放
- 对象:先变成垃圾对象,后在某个时刻由JS的垃圾回收机制回收