[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
- 實戰