1俭驮、瀏覽器都包含哪些進程?
1)Browser進程:瀏覽器的主進程(負責協(xié)調(diào)春贸、主控),只有一個遗遵。作用有:
a萍恕、負責瀏覽器界面顯示,與用戶交互车要。如前進允粤,后退等;
b、負責各個頁面的管理类垫,創(chuàng)建和銷毀其他進程司光;
c、網(wǎng)絡資源的管理悉患,下載等残家。
2)第三方插件進程:每種類型的插件對應一個進程,僅當使用該插件時才創(chuàng)建
3)GPU進程:最多一個售躁,用于3D繪制等
4)瀏覽器渲染進程(瀏覽器內(nèi)核)(Renderer進程坞淮,內(nèi)部是多線程的):默認每個Tab頁面一個進程,互不影響陪捷。主要作用為頁面渲染回窘,腳本執(zhí)行,事件處理等市袖。
Renderer進程啡直,也就是我們每個標簽頁所擁有的進程,互不影響苍碟,負責頁面渲染酒觅,腳本執(zhí)行,事件處理等驰怎。
瀏覽器內(nèi)核阐滩,即我們的渲染進程,有名Renderer進程县忌,內(nèi)部是多線程的掂榔。我們頁面的渲染,js腳本執(zhí)行症杏,事件的循環(huán)都在這一進程內(nèi)進行装获,也就是說,該進程下面擁有著多個線程厉颤,靠著這些現(xiàn)成共同完成渲染任務穴豫。
a、圖形用戶界面GUI渲染線程:負責渲染瀏覽器界面逼友,包括解析HTML精肃、CSS、構(gòu)建DOM樹帜乞、Render樹司抱、布局與繪制等。當界面需要重繪(Repaint)或由于某種操作引發(fā)回流(reflow)時黎烈,該線程就會執(zhí)行习柠。
b匀谣、JS引擎線程:JS內(nèi)核,也稱JS引擎资溃,負責處理執(zhí)行javascript腳本武翎。瀏覽器無論什么時候都只有一個JS引擎在運行JS程序。
c溶锭、事件觸發(fā)線程:會將對應任務添加到事件線程中宝恶。當對應的事件符合觸發(fā)條件被觸發(fā)時,該線程會把事件添加到待處理隊列的隊尾暖途,等待JS引擎的處理卑惜。
d、定時觸發(fā)器線程:setInterval與setTimeout所在線程驻售。定時計時器并不是由JS引擎計時的露久,因為如果JS引擎是單線程的,如果JS引擎處于堵塞狀態(tài)欺栗,那會影響到計時的準確毫痕。當計時完成被觸發(fā),事件會被添加到事件隊列迟几,等待JS引擎空閑了執(zhí)行消请。
e、異步HTTP請求線程:在XMLHttpRequest在連接后新啟動的一個線程类腮。線程如果檢測到請求的狀態(tài)變更臊泰,如果設(shè)置有回調(diào)函數(shù),該線程會把回調(diào)函數(shù)添加到事件隊列蚜枢,同理缸逃,等待JS引擎空閑了執(zhí)行
2、Web Worker
JavaScript語言采用的是單線程模型厂抽,也就是說需频,所有任務只能在一個線程上完成,一次只能做一件事筷凤。
Web Worker的作用昭殉,就是為 JavaScript 創(chuàng)造多線程環(huán)境,允許主線程創(chuàng)建 Worker 線程藐守,將一些任務分配給后者運行挪丢。在主線程運行的同時,Worker 線程在后臺運行卢厂,兩者互不干擾吃靠。等到 Worker 線程完成計算任務,再把結(jié)果返回給主線程足淆。
Worker 線程一旦新建成功巢块,就會始終運行,不會被主線程上的活動(比如用戶點擊按鈕巧号、提交表單)打斷族奢。這樣有利于隨時響應主線程的通信。但是丹鸿,這也造成了 Worker 比較耗費資源越走,不應該過度使用,而且一旦使用完畢靠欢,就應該關(guān)閉廊敌。
主線程采用new命令,調(diào)用Worker()構(gòu)造函數(shù)门怪,新建一個 Worker 線程骡澈。Worker()構(gòu)造函數(shù)的參數(shù)是一個腳本文件,該文件就是 Worker 線程所要執(zhí)行的任務掷空。由于 Worker 不能讀取本地文件肋殴,所以這個腳本必須來自網(wǎng)絡。如果下載沒有成功(比如404錯誤)坦弟,Worker 就會默默地失敗护锤。
主線程調(diào)用worker.postMessage()方法,向 Worker 發(fā)消息酿傍。參數(shù)烙懦,就是主線程傳給Worker 的數(shù)據(jù)。它可以是各種數(shù)據(jù)類型赤炒,包括二進制數(shù)據(jù)
主線程通過worker.onmessage指定監(jiān)聽函數(shù)氯析,接收子線程發(fā)回來的消息。事件對象的data屬性可以獲取 Worker 發(fā)來的數(shù)據(jù)可霎。
Worker 完成任務以后魄鸦,主線程就可以把它關(guān)掉。worker.terminate();
Worker 線程
3癣朗、JSON.stringify()
JSON.stringify()方法將一個 JavaScript?對象或值轉(zhuǎn)換為 JSON 字符串拾因。
注意:1、非數(shù)組對象的屬性不能保證以特定的順序出現(xiàn)在序列化后的字符串中旷余。
2绢记、布爾值、數(shù)字正卧、字符串的包裝對象在序列化過程中會自動轉(zhuǎn)換成對應的原始值蠢熄。
3、undefined炉旷、任意的函數(shù)以及 symbol 值签孔,在序列化過程中會被忽略(出現(xiàn)在非數(shù)組對象的屬性值中時)或者被轉(zhuǎn)換成null(出現(xiàn)在數(shù)組中時)叉讥。
4、函數(shù)饥追、undefined 被單獨轉(zhuǎn)換時图仓,會返回 undefined;NaN 和 Infinity 格式的數(shù)值及 null 都會被當做 null但绕。
4救崔、es5和es6的區(qū)別
1)ES5新增
a、strict嚴格模式捏顺;
b六孵、Array方法:every、some?幅骄、forEach劫窒、filter?、indexOf昌执、lastIndexOf烛亦、isArray、map懂拾、reduce煤禽、reduceRight方法;
c岖赋、Object方法:Object.getPrototypeOf檬果、Object.create、Object.getOwnPropertyNames唐断、Object.defineProperty选脊、Object.getOwnPropertyDescriptor、Object.defineProperties脸甘、Object.keys恳啥、Object.preventExtensions / Object.isExtensible、Object.seal / Object.isSealed丹诀、Object.freeze / Object.isFrozen等钝的。
2)ES6新增
a、塊級作用域:let铆遭、常量const硝桩;
b、賦值解構(gòu)枚荣;
c碗脊、函數(shù)參數(shù):默認值、參數(shù)打包橄妆、?數(shù)組展開(Default 衙伶、Rest 祈坠、Spread);
d矢劲、箭頭函數(shù)颁虐;
e、Iterators(迭代器)+ for..of卧须;
f、Class:constructor儒陨、extends花嘶、super;
g、Map + Set + WeakMap + WeakSet
H蹦漠、Symbols | Promise等椭员。
5、不使用第三個變量得情況下交換兩個變量得值
第一種:a=a+b笛园;b=a-b隘击;a=a-b;
第二種:a=a^b研铆;b=a^b埋同;a=a^b;
6、HTML引入js的方式
內(nèi)部引入:需要一個標簽<script></script>棵红。
外部引入:創(chuàng)建一個獨立的外部 js 文件,? 用 <script></> 標簽引入. 使用他的src 屬性引用對應的Js文件凶赁。
7、ES6的 Class 類
在ES6中逆甜,class (類)作為對象的模板被引入虱肄,可以通過 class 關(guān)鍵字定義類。class 的本質(zhì)是 function交煞。
注意要點:a咏窿、不可重復聲明。
b素征、類定義不會被提升集嵌,必須在訪問前對類進行定義,否則就會報錯稚茅。
c纸淮、類中方法不需要 function 關(guān)鍵字。
d亚享、方法間不能加分號咽块。
1)類的主體
a、屬性:靜態(tài)屬性(static 關(guān)鍵字定義)欺税;
公共屬性(在類的原型prototype上定義的)侈沪;
name屬性(返回跟在class后的類名(存在時))揭璃。
b、方法:constructor 方法是類的默認方法亭罪,創(chuàng)建類的實例化對象時被調(diào)用瘦馍。
靜態(tài)方法(static 關(guān)鍵字定義);
原型方法应役。
8情组、襯線字體和非襯線字體區(qū)別
襯線字體:文字邊緣有修飾的字體;在字的筆畫開始箩祥、結(jié)束的地方有額外的裝飾院崇,而且筆畫的粗細會有所不同。適用于傳統(tǒng)的印刷體袍祖,易讀性高底瓣。
非襯線字體:文字邊緣沒有修飾的字體,筆畫的粗細差不多蕉陋。適合于標題海報等需要醒目的地方捐凭。
font-family屬性設(shè)置時,為了匹配不同環(huán)境下的字體凳鬓,可以書寫多個值茁肠。其中,為了使得頁面在用戶電腦上沒有任何其他字體安裝的情況下也顯示得較為好看村视,可以加上sans-serif官套,表示由計算機自動選擇默認的非襯線字體進行渲染(計算機操作系統(tǒng)都分別會有一種默認的襯線字體和非襯線字體)
9、Javascript組成
JavaScript的實現(xiàn)包括以下3個部分:
1)ECMAScript(核心):描述了JS的語法和基本對象蚁孔。
2)文檔對象模型 (DOM):處理網(wǎng)頁內(nèi)容的方法和接口
3)瀏覽器對象模型(BOM):與瀏覽器交互的方法和接口
10奶赔、JavaScript和java c c++的區(qū)別
Java是強類型的語言;JavaScript是弱類型的語言杠氢。
Java站刑、C、C++是編譯型語言鼻百,需要編譯器編譯成本地可執(zhí)行程序后才能運行绞旅;JavaScript解釋性語言,像温艇,開發(fā)語言寫好后直接將代碼交給用戶因悲,用戶使用腳本解釋器將腳本文件解釋執(zhí)行。
11勺爱、在js中0.1+0.2===0.3嗎晃琳?如果不相等如何解決?
在JavaScript中的二進制的浮點數(shù)0.1和0.2并不是十分精確,在他們相加的結(jié)果并非正好等于0.3卫旱,而是一個比較接近的數(shù)字 0.30000000000000004 人灼,所以條件判斷結(jié)果為false。
那么應該怎樣來解決0.1+0.2等于0.3呢? 最好的方法是設(shè)置一個誤差范圍值顾翼,通常稱為”機器精度“投放。而對于Javascript來說,這個值通常是2^-52,而在ES6中适贸,已經(jīng)為我們提供了這樣一個屬性:Number.EPSILON灸芳,而這個值正等于2^-52。這個值非常非常小拜姿,在底層計算機已經(jīng)幫我們運算好耗绿,并且無限接近0,但不等于0砾隅。
這個時候我們只要判斷(0.1+0.2)-0.3小于Number.EPSILON,在這個誤差的范圍內(nèi)就可以判定0.1+0.2===0.3為true债蜜。
我們還要考慮解決IE的不兼容問題晴埂。我們需要對于Number.EPSILON進行一個改寫。
12寻定、Javascript異步編程的4種方法
回調(diào)函數(shù)儒洛、事件監(jiān)聽、發(fā)布/訂閱狼速、Promises對象