JavaScript
理解 js 的数据类型,内存机制,变量引用,垃圾回收,内存泄漏
js 三种数据结构 栈:栈是一种后进先出的数据结构 队列:队列是一种先进先出的数据结构 堆:堆是一种树状结构,类似于书架,只需要知道书的名字就可以直接取出书,也类似于 JSON,每一个 key 都对应一个 value 数据类型 基本数据类型:Undefined,Null,Boolean,Number,String 和 Symbol 引用数据类型:Object,Array,Function 变量的存…
js 三种数据结构 栈:栈是一种后进先出的数据结构 队列:队列是一种先进先出的数据结构 堆:堆是一种树状结构,类似于书架,只需要知道书的名字就可以直接取出书,也类似于 JSON,每一个 key 都对应一个 value 数据类型 基本数据类型:Undefined,Null,Boolean,Number,String 和 Symbol 引用数据类型:Object,Array,Function 变量的存…
var a = '前端开发';
var b = a;
b = '前端进阶';
console.log(a);
console.log(b);
// 输出
// 20
// 30
a,b 都是基本类型,数据都存在栈中,a,b 有各自的栈空间,所以修改了 b 的值后,a 的值不受影响
var a2 = { name: '前端开发' };
var b2 = a2;
b2.name = '前端进阶';
console.log(a2);
console.log(b2);
// 输出
// {name: "前端进阶"}
// {name: "前端进阶"}
a2,b2 都是引用类型,数据都存在堆中,栈中保存了数据的引用地址,a2 和 b2 指向的地址相同,所以修改了 b2,a2 就发生变化
var a3 = { name: '前端开发' };
var b3 = a3;
a3 = null;
console.log(a3);
console.log(b3);
// 输出
// null
// {name: "前端进阶"}
null 是基本类型,a3=null,只是把 a3 存储在栈中的地址变成了基本类型 null,不影响堆中的对象,所以 b3 的值不受影响
引用类型数据
var a4 = { name: '前端开发' };
var b4 = a4;
a4.x = a4 = { name: '前端进阶' };
console.log(a4);
console.log(b4);
setTimeout(function() {
a4.name = '前端深入';
console.log(a4);
console.log(b4);
}, 1000);
// 输出
// {name: "前端进阶"}
// {name: "前端开发", x:{name: "前端进阶"}}
// {name: "前端深入"}
// {name: "前端开发", x:{name: "前端深入"}}
Null 和 Undefined 的区别
const 修饰一个对象
const foo = {};
foo.prop = '前端深入';
foo.prop;
console.log(foo);
// 输出
// {prop: 123}
const 修饰一个变量,并不是这个变量不能改动,是变量地址保存的数据不能改动,回想之前的基本数据类型,普通数据类型是直接保存在栈中,引用数据类型,对象是保存在堆中,栈中只保存了堆内存引用的地址,const 只能保证这个地址不变,指数地址指向的数据有没有变,就无法控制了
js 是自动垃圾回收机制的,通常用标记清除的方法去找到哪些对象不可用,标记清除会定义哪些对象是从根部出发定时扫描内存中的对象,凡是能够从根部出发的无法触及的对象就保留,否则就不再保留
使用 a3=null 是做了一个释放引用的操作,这个变量会在下一次垃圾回收时被释放
局部变量是在一个局部作用域中,当函数执行完毕,局部变量就会释放引用,但是全局变量的引用只能在 window/global 环境卸载的时候的才能释放全局变量的引用
function aa() {
var a = 1;
function bb() {
var b = a;
}
return bb;
}
a 属于局部变量,aa 函数执行完毕后,a 变量的引用关系没有释放,因为存在一个闭包(内部函数引用外部函数的变量与属性)导致了局部变量 a 一直在被引用,无法释放 a 变量的引用关系
内存泄漏就是对不再用到的内存,没有及时释放,导致了内存越用越少
暂无评论
确认操作
请再次确认编辑图片
待上传图片 (剩余 0 张)
项目详情
确认评论邮箱
邀请制评论