2020-12-11 內(nèi)存圖和JS世界

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í)例的屬性
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 操作系統(tǒng) 常用英語 shell操作界面 os操作系統(tǒng) runtime運(yùn)行時(也就是運(yùn)行時所需要的東西) kerne...
    鄭饞師閱讀 267評論 0 0
  • 前言 本文講解 56 道 JavaScript 和 ES6+ 面試題的內(nèi)容。 復(fù)習(xí)前端面試的知識,是為了鞏固前端的...
    YollyTo閱讀 3,237評論 3 77
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 28,825評論 1 45
  • 日常學(xué)習(xí)知識點(diǎn)總結(jié)(JS篇) 1、閉包: 閉包就是函數(shù)中的函數(shù),里面的函數(shù)可以訪問外面函數(shù)的變量,外面的變量是內(nèi)部...
    依稀_Sting閱讀 2,221評論 0 1
  • 這是我第23篇簡書。 為什么簡書沒有目錄功能啊,要不是在這這么久了都想轉(zhuǎn)去某金了。。 本章內(nèi)容: 1、執(zhí)行上下文2...
    東西里閱讀 2,058評論 2 14

友情鏈接更多精彩內(nèi)容