1. 操作系統(tǒng)常識
(1) 開機(jī)
- 操作系統(tǒng)在C盤
- 按下開機(jī)鍵將使主板通電,讀取固件
- 固件是固定在主板上的存儲設(shè)備,里面寫死了開機(jī)程序
- 開機(jī)程序會講文件里的操作系統(tǒng)加載到內(nèi)存中運(yùn)行
(2) 操作系統(tǒng)(Operating System)
- 加載操作系統(tǒng)內(nèi)核
- 啟動初始進(jìn)程,PID編號為1
- 初始進(jìn)程啟動其他系統(tǒng)服務(wù)進(jìn)程:文件、安全、網(wǎng)絡(luò)
- 用戶輸入密碼登錄/ssh登錄
- 登錄后運(yùn)行shell,用戶可以與操作系統(tǒng)交互
(3) 運(yùn)行Chrome
- 啟動Chrome為主進(jìn)程
- 不同的服務(wù)(Tab)開啟不同子進(jìn)程(輔助進(jìn)程)
- 查看Chrome任務(wù)管理器:
shift + esc
(4) 瀏覽器功能
- 發(fā)起請求
- 下載 + 解析 HTML
- 下載 + 解析 CSS
- 渲染界面:合并HTML和CSS
- 下載 + 解析 + 執(zhí)行 JavaScript
- 功能模塊(多線程并行 + 線程通信 -> DOM操作慢):用戶界面、渲染引擎、JS引擎、存儲等
2. JS引擎
(1) JS引擎舉例
- Chrome - V8引擎 C++編寫
- 網(wǎng)景/Firefox - SpiderMonkey C++
- Safari - JavaScriptCore
- IE - Chakra(JScript9)
- Edge - Chakra(JavaScript)
- Node.js - V8引擎
(2) JS引擎功能
- 編譯:JS代碼 -> 字節(jié)碼/機(jī)器碼
- 優(yōu)化:改寫代碼,提高效率
- 執(zhí)行:執(zhí)行對應(yīng)的字節(jié)碼/機(jī)器碼
- 垃圾回收(析構(gòu)):回收J(rèn)S用完的內(nèi)存
(3) 執(zhí)行JS代碼
- JS代碼在內(nèi)存運(yùn)行
- runtime env: 提供API(window/document/setTimeout)
- 一旦把JS放入頁面,就開始執(zhí)行JS
3. 內(nèi)存圖

內(nèi)存瓜分.png
- OS和應(yīng)用程序各自瓜分部分內(nèi)存
- 應(yīng)用程序如Chrome中Tab子進(jìn)程中內(nèi)存由渲染線程、用戶界面、JS引擎瓜分
- 其中JS引擎內(nèi)存主要由四個區(qū)域瓜分:代碼區(qū)、變量名存儲區(qū)、Stack(棧區(qū)->順序存放)、Heap(堆區(qū)->隨機(jī)存放)瓜分,后兩者是數(shù)據(jù)存儲區(qū)
- 基本數(shù)據(jù)類型存Stack區(qū);對象(包括數(shù)組和函數(shù))將地址存Stack區(qū),內(nèi)容存Heap區(qū)(隨時修改對象,存Stack區(qū)低效)
- 淺復(fù)制(等號)復(fù)制地址,深復(fù)制(.copy)復(fù)制內(nèi)容并分配新的地址
4. 早期JS
(1) JS提供內(nèi)容
- window
- console
- document
- Object
- Array
- function
(2) 為什么把對象都掛window上?
A:可直接使用對象,方便,window自己存在地址#90
可以console.dir()打出對象的所有屬性

window對象.png
(3) 關(guān)于window
- window 變量存放window 對象的地址,window對象存放在Heap區(qū)
- 同理 內(nèi)存地址:數(shù)據(jù),如console和console對象,Object和Object對象
5. 原型鏈(Prototype)
- 所有實(shí)例共享對象的共同屬性,類似繼承的關(guān)系
-
當(dāng)對象調(diào)用函數(shù)時,先檢查自己是否有該函數(shù),再檢查原型
原型鏈內(nèi)存示意圖.png
(1) 原理
- 生成一個Obj(實(shí)例化)時會附帶一個隱藏屬性
__proto__存儲window.Object.prototype的地址,此時:
> var obj = {};
> obj.toString === window.Object.prototype.toString;
> true
- 生成一個Array(實(shí)例化)時會附帶一個隱藏屬性
__proto__存儲window.Array.prototype的地址,此時:
> var a = [1, 2, 3];
> obj.push=== window.Array.prototype.push;
> true
- 修改實(shí)例對象的prototype屬性不會影響其他實(shí)例對象的prototype屬性(兩層reference),除非淺復(fù)制
(2) prototype和__proto__的區(qū)別與聯(lián)系
- 兩者存儲相同的地址
- prototype是對象原型的屬性,proto是對象實(shí)例的屬性
