[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的回收策略
1.分代回收:
+ 新生代:存在from和to两部分
```
1.from空间存放不需要回收的对象,to空间中存放需要被回收的对象
2.from空间和to空间会进行多次的一个复制和反转,如果复制多次后依然还会存货,将会被认为是生命周期较长的对象,随后被移动到老生代中,也叫晋升
```
+ 老生代:连续的结构
```
1.标记清除:会导致连续结构不连续
2.标记合并:将存活的对象移到一边,将回收的对象移到另一边
```
- JavaScript
- 1. DOM事件流
- 2. 模拟 new, Object create(), bind
- 5. 封装函数进行字符串驼峰命名的转换
- 6. 什么是promise
- 7. 判断一个数是否为数组
- 10. __proto__和prototype以及原型,原型链,构造函数
- 11. 继承
- 12. 闭包
- 13. 回调函数
- 14. var 和 let 区别
- 15. this、bind、call、apply
- 16.undefined和null的区别
- 17.内存泄漏
- 18.垃圾回收机制
- html css
- 1. 元素垂直水平居中
- 2. 清除浮动
- 3. bootstrap栅格系统
- 4. px rpx em rem vw 的区别
- 5. 两种盒子模型
- 6. 合集
- web类
- 1. html5的新特性以及理解(web标签语义化)
- 2. 什么是路由,关于前端路由和后端路由
- 3. 对优质代码的理解
- 4. cookie 和 sessionStorage和localStorage
- 5. 浏览器内核
- 6. http 状态码
- 7. href 和 src 的区别
- 8. link 和 @import 的区别
- 9. http 状态码
- 10. websocket
- 11. 浏览器解析url
- 12.http缓存
- vue
- 1.vue2和vue3有哪些区别
- 1. 对 mvvvm 的理解
- 2. mvvm的优缺点
- 3. 数据双向绑定的原理
- 4. 生命周期
- 5. 组件如何通信
- 6. computed和watch的区别
- 7. proxy 和 Object.defineProperty
- 8. 虚拟dom和 diff算法
- 9. 路由的嵌套与传参
- 10. 路由导航钩子
- 11. axios 的理解
- 12. vue自定义指令 diretive
- 13. diff 的实现
- 14. 实现一个简单的双向绑定
- 15. 为什么 data 是一个函数
- 题谱
- js
- 手写篇
- css
- vue
- react
- 算法
- 自我介绍
- 八股文
- 源项目地址
- 1.计算机网络
- 2.浏览器
- 3.html和css
- 4.javascript
- 6.typescript
- 7.vue
- 8.react
- 大厂面试
- 面试题大全
- 常见性能优化
- 面试实战
- 面试分析
- 押题
- 1.微前端在项目中的实际应用
- 2.性能优化
- vue相关
- 1.说一说HashRouter和HistoryRouter的区别和原理
- 无敌之路,牛客网面试题自测记录
- 前端基础
- 1.html
- 2.js基础
- 珠峰性能优化
- WebWorker
- url到渲染
- 浏览器加载机制
- 自我介绍1
- 手写题
- 1.compose
- 2.setTimeout模拟setInterval
- 3.手写数组拍平
- 4.手写promise.all
- 5.手写深拷贝
- webpack
- 实战