[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