[toc]
### 1.变量在内存中的存储
1.栈内存stack:六个基本类型,string,number,boolean,undefined,null,symbol
2.堆内存heap:在栈中存放一个地址,堆中开辟一块空间,如:Object
+ 函数在堆中的存储:
```
1.函数体中的代码会以函数字符串的形式保存在堆内存
2.栈内存会存放一个地址
3.函数执行过程中,会找到堆内存的函数字符串,然后执行
```
### 2.什么是垃圾回收机制
v8引擎存在一个垃圾回收器,他会按照固定的时间间隔周期性的寻找不再使用的变量,并将它们从内存中释放
### 3.垃圾回收机制如何管理内存(gc原理)
#### 1.引用计数
1.解释:跟踪某个值被引用的次数,如果一个值的引用次数是0的时候,就表示可以将这块内存释放了
2.原理:每次引用的时候次数+1,被释放的时候-1
```js
var obj1 = {a: 1} // {a:1}的引用次数+1
var obj2 = {a: 1} // {a:1}的引用次数+1
obj1 = {} // {a:1}的引用次数-1,但是这块空间并未完全消除,因为obj2还引用着
obj1 = null // obj1 对{a: 10}的引用次数为0
obj2 = null // obj2 对 {a: 10} 的引用次数为0,此时这块空间也会被回收
```
3.bug:两个对象互相引用时,导致引用次数一直循环存在,内存泄漏
```js
//
function fn() {
var obj1 = {a: 1}
var obj2 = {b: 2}
obj1.a = obj2
obj2.b = obj1
console.log('1', obj1);
console.log('2', obj2);
}
fn()
```
#### 2.标记清除(常用)
1.解释:当变量进入环境时,这个变量标记为`进入环境`,而当变量离开环境时,将其标记为`离开环境`,最后垃圾回收器会销毁并回收被标记为`离开环境`的值所占用的空间
2.执行环境(执行上下文):
+ 定义了变量或函数有权访问的其他数据
+ 每个执行环境都有一个与之关联的变量对象(variable obejct),环境中定义的所有变量和函数都保存在这个对象中
3.全局执行环境:
+ 浏览器是window,关闭网页或者浏览器才会销毁
+ node中是global,关闭应用程序才会销毁
4.局部执行环境:
+ 当执行流进入函数时,会将该函数的环境推到一个环境栈中。
+ 当该函数执行之后,栈将其环境弹出,把控制权返回到之前的执行环境
### 4.V8的回收策略:GC
GC算法采用了分代回收:
+ 新生代:存在from和to两部分
```
1.将内存空间分为from和to两部分,一个使用,一个空闲
2.新分配的对象会被放入from空间,当from空间占满时,新生代GC就会启动
3.GC算法会检查from空间中存活的对象并复制到to空间中,如果有失活的就会销毁
4.复制完成后将from空间与to空间互换, GC结束
```
+ 老生代:连续的结构
标记清除,压缩算法
```
1.会先启动标记清除算法
2.清除对象后会造成堆内存出现碎片,当碎片超过一定限制后会启动压缩算法。
3.将存活的对象移到一边,将回收的对象移到另一边
```
- JavaScript
- 1.数组
- 1.数组Api
- 2.判断是否为数组
- 3.手写forEach, map, filter, every, some, reduce
- 4.类数组转化为数组
- 5.reduce实现compose函数
- 7.sort实现与排序
- 2.类型
- 1. let, const, var
- 1. Number 数字
- 3. Boolean 布尔值
- 4. undefined和null
- 2. String 字符串
- 1. 字符串方法
- 2. 操作字符串实例
- 3. startWith&字符串模板
- 5. 类型转换
- 4.深拷贝与浅拷贝
- 7.Symbol类型
- typeof 和 instanceof
- Set
- Map
- 3.this,原型,原型链
- 1.this
- 2.手写call, apply, bind
- 3.模拟new操作符
- 4.手写Object.create
- 4.对象
- proxy代理
- defineProperty数据劫持
- 4.模块化
- 5.http
- ECMAScript
- 0. 调试&兼容性&错误处理
- 3. 运算
- 4. 对象(三种引用类型&正则)
- 1. 数组
- 1. 数组的六种遍历方法
- 2. 数组的增删查改
- 3. 操作数组(展开、join、排序...)
- 4. 补充五种ES6方法
- 2. 函数
- 3. JSON
- 4. 正则
- 附:正则表达式特殊字符
- 5. 面向对象
- es6的继承
- 6. 控制语句
- 7. ajax
- 8. promise
- 9. 闭包
- 1. 闭包产生三个相同随机数
- 2. 闭包实现点赞
- 10.箭头函数
- _isEmpty
- Object.assign(target, obj, obj)
- Math.ceil, round,
- DOM
- 3.1 节点
- 3.2 DOM操作元素
- 3.3 fragment DOM碎片
- 5. 事件
- BOM
- 1. window
- 2. navigation检测访问类型
- 3. screen窗口大小内容大小
- 4. history
- promise
- 1.promise使用
- 2.手写promise
- 3.手写promise.all
- 生成器generator
- 1.generator的使用
- 2.简单实现generator
- 手写async await
- async/await
- 5.防抖节流
- 难点深入
- 1. 浏览器&js特点
- 2. JS堆栈与深浅拷贝
- 3. 详解a++和++a的区别
- 4. JS&jQuery获取元素的方法
- 5. NodeList和HTMLCollection区别
- 6. var与let的区别
- 7. this 与 bind call apply
- 8. get与post请求的区别
- 9. 闭包
- Dom demo
- 1. JQuery--页面点击切换效果
- 2. JQuery-load实现头尾封装
- 3. JS--添加移除属性名
- 4. jQuery--eq()与index()
- 5. table隔行变色
- 6. 改变函数this的指向
- 7. jQuery each遍历
- ECMAScript demo
- 1. 斐波那契数列
- 2. 数组去重
- 3. 自调用函数生成随机数
- 浏览器、DOM
- 1.从输入url到页面加载的全过程
- 2.http与https
- 3.v8垃圾回收机制
- 4.dom事件
- 5.跨域
- 6.强缓存和协商缓存
- 3.eventloop,宏任务和微任务
- 1.什么是任务
- 2.执行顺序例题
- 3.执行顺序例题,添加script
- 4.执行顺序,多个宏任务
- 4.HTTP
- 1.经典五层模型
- 2.http发展历史
- 3.http三次握手
- 4.URI,URL,URN
- 1.http协议
- 2.https
- http状态码
- 5.script标签defer和async区别
- cookie
- connect: keep-alive