前端面試之Javascript(八股文)

1. 原型和原型鏈,constructor屬性

答:原型:原型分為隱式原型和顯式原型,每個(gè)對(duì)象都有一個(gè)隱式原型,它指向自己的構(gòu)造函數(shù)的顯式原型

原型鏈:當(dāng)我們?cè)L問一個(gè)對(duì)象的屬性時(shí),如果這個(gè)對(duì)象內(nèi)部不存在這個(gè)屬性,那么他就會(huì)去prototype里找這個(gè)屬性,這個(gè)prototype又會(huì)有自己的prototype,于是就這樣一直找下去,也就是我們平時(shí)所說的原型鏈的概念

原型就是一個(gè)普通對(duì)象,它是為構(gòu)造函數(shù)的實(shí)例共享屬性和方法;所有實(shí)例中引用的原型都是同一個(gè)對(duì)象

當(dāng)一個(gè)對(duì)象調(diào)用自身不存在的屬性和方法時(shí)就會(huì)去自己的proto的前輩prototype對(duì)象上去找,如果沒找到就會(huì)去prototype的前輩上去找 直到找到或者返回undefiend 這個(gè)查找的過程就是原型鏈(原型鏈的根就是Object.prototype)

原型鏈?zhǔn)褂脠?chǎng)景:

? ? vue的axios也是放在vue的原型鏈上,使用 $ axios在文件的任何位置都可以訪問這個(gè)方法

? ? 將對(duì)象公共屬性放在vue原型上,Vue.prototype.imgBaseUrl = config.imgBaseUrl;

? ? jquery的 $ 就放在jquery的原型鏈上

? ? 數(shù)組方法Array.prototype

? ? 當(dāng)需要?jiǎng)?chuàng)建多個(gè)具有相似行為和屬性的對(duì)象時(shí),可以使用原型來定義這些共同的屬性和方法。

? ? ? ? 如何理解constructor屬性:所有函數(shù)的原型對(duì)象都有一個(gè)constructor屬性指向函數(shù)本身

2. 面向?qū)ο缶幊?/h4>

答:1)面向編程分為面向?qū)ο蠛兔嫦蜻^程

? ? ? ? 2) 面向過程:照步驟編程 (函數(shù)和變量)

? ? ? ? 3) 面向?qū)ο螅簩⑿枨蠓治龀鲆粋€(gè)一個(gè)的對(duì)象,再分析出對(duì)象中的屬性和方法,最后按照步驟編程(方法和屬性)

? ? ? ? 4) 面向?qū)ο笏拇筇卣鳎?、抽象 2、封裝 3、繼承 4、多態(tài)

Namespace命名空間,在對(duì)象當(dāng)中,設(shè)置一些具體的屬性進(jìn)行存值

class類:對(duì)象的屬性和方法的抽象和模板

Object對(duì)象:類的一個(gè)實(shí)例,有類之后可以創(chuàng)建多個(gè)對(duì)象

Property屬性:對(duì)象的特征,比如姓名,年齡等名詞

Method方法:對(duì)象的能力,比如吃,跑等動(dòng)詞,就是對(duì)象的方法

Constructor構(gòu)造函數(shù):可以構(gòu)造當(dāng)前類的一些屬性

Inheritance繼承:一個(gè)類可以繼承另一個(gè)類的特征

Encapsulation封裝:一種把數(shù)據(jù)和相關(guān)的方法綁定在一起使用的形式。將對(duì)象的屬性和方法封裝給對(duì)象

Abstraction抽象:結(jié)合復(fù)雜的繼承,方法,屬性的對(duì)象能夠模擬現(xiàn)實(shí)的模型。父級(jí)為抽象類,定義了很多方法和屬性,子類可以使用

Polymorphism多態(tài):多意為‘許多’,態(tài)意為‘形態(tài)’。不同類可以定義相同的方法或?qū)傩?/p>

3. 構(gòu)造函數(shù)是什么?new操作符做了什么?

答:構(gòu)造函數(shù)得本質(zhì)是一個(gè)普通函數(shù),它得特點(diǎn)是需要通過new關(guān)鍵字來調(diào)用,用來創(chuàng)建對(duì)象得實(shí)例。所有得引用類型,如:[](Array),{}(Object),Function等都是由構(gòu)造函數(shù)實(shí)例化而來的,一般首字母大寫

new操作符:

1)先創(chuàng)建一個(gè)空對(duì)象

2)把空對(duì)象和構(gòu)造函數(shù)通過原型鏈進(jìn)行鏈接

3)把構(gòu)造函數(shù)的this綁定到新的空對(duì)象身上

4)根據(jù)構(gòu)建函數(shù)返回的類型判斷,如果是值類型則返回對(duì)象,如果是引用類型就要返回這個(gè)引用類型

4. JS的數(shù)據(jù)類型?

答:JavaScript 有 5 種簡(jiǎn)單數(shù)據(jù)類型:Undefined、Null、Boolean、Number、String和 1 種復(fù)雜數(shù)據(jù)類型Object,以及es6語法新增的Symbol、BigInt數(shù)據(jù)類型

基礎(chǔ)類型(值類型):Undefined,Null,Boolean,Number,String

復(fù)雜類型(引用類型):Object,Array,Date,RegExp,F(xiàn)unction

? ? 1)基本包裝類型:Boolean,Number,String

? ? 2)單體內(nèi)置對(duì)象:Global,Math

? ? 注:普通變量不能調(diào)用屬性或者方法, 對(duì)象可以直接調(diào)用屬性和方法

? ????????基本包裝類型:本身是基本類型,但是在執(zhí)行代碼的過程中,如果這種變量調(diào)用了屬性或者方法,那么這種類型就不再是基本類型了,而是基本包裝類型,這種變量頁不再是普通變量了,而是基本包裝類型對(duì)象

? ??????為了方便操作基本數(shù)據(jù)類型,JS還提供了三個(gè)特殊的引用類型:String/Number/Boolean

棧:由系統(tǒng)自動(dòng)分配釋放,存放基本類型和復(fù)雜類型的地址

堆:存儲(chǔ)復(fù)雜類型(對(duì)象),一般由程序員分配釋放, 若程序員不釋放,由垃圾回收機(jī)制回收,分配方式倒是類似于鏈表

注:JS中沒有堆和棧的概念,此處我們用堆和棧來講解

5. 作用域和作用域鏈?

答:作用域:規(guī)定變量和函數(shù)的可使用范圍簡(jiǎn)稱作作用域

? ? ? ? 作用域鏈:每個(gè)函數(shù)都有一個(gè)作用域鏈,查找變量或者函數(shù)時(shí),需要從局部作用域到全局作用域依次查找,這些作用域的集合稱作作用域鏈

6.閉包

答:閉包是什么:JS中內(nèi)層函數(shù)可以訪問外層函數(shù)的變量,是內(nèi)部私有變量不受外界干擾,起到保護(hù)和保存作用

優(yōu)點(diǎn):隔離作用域,保護(hù)私有變量;有了閉包才有局部變量,否則都是全局變量;讓我們可以使用回調(diào),操作其他函數(shù)內(nèi)部;變量長(zhǎng)期駐扎在內(nèi)從中,不會(huì)被內(nèi)存回收機(jī)制回收,即延長(zhǎng)變量的生命周期

缺點(diǎn):內(nèi)層函數(shù)引用外層函數(shù)變量,內(nèi)層函數(shù)占用內(nèi)存;如果不是放內(nèi)存,過多時(shí)易引起內(nèi)存泄漏

引用場(chǎng)景:for循環(huán)中的保留索引(i)的操作/防抖節(jié)流

7. 內(nèi)存泄漏、垃圾回收機(jī)制

答:內(nèi)存泄漏:是指不再使用的內(nèi)存沒有及時(shí)釋放出來,導(dǎo)致該段內(nèi)存無法被使用就是內(nèi)存泄漏

? ? ? ? 垃圾回收機(jī)制:就是垃圾收集器按照固定的時(shí)間間隔,周期性地尋找哪些不在使用的變量,然受將其清除或者釋放內(nèi)存

8. 防抖和節(jié)流

答:節(jié)流:n秒內(nèi)只運(yùn)行一次,若在能秒內(nèi)重復(fù)出發(fā),只有一次生效

? ? ? ? 防抖:n秒后在執(zhí)行該事件,若在n秒內(nèi)被重復(fù)觸發(fā),則重新倒計(jì)時(shí)

都可以通過使用 setTimeout 實(shí)現(xiàn),函數(shù)防抖關(guān)注一定時(shí)間連續(xù)觸發(fā)的事件,只在最后執(zhí)行一次,而函數(shù)節(jié)流一段時(shí)間內(nèi)只執(zhí)行一次

9. 深拷貝和淺拷貝

答:淺拷貝是指對(duì)基本類型(String,Number,Boolean,Null,Undefined)的值拷貝,以及對(duì)象類型的地址拷貝

? ? ? ? 深拷貝是指觸雷拷貝基本類型的值,還完全復(fù)刻了對(duì)象類型;深拷貝常用的方法:遞歸調(diào)用,JSON.stringify + JSON.parse, Object.assgin

? ? ? ? 淺拷貝和深拷貝的區(qū)別:淺拷貝最多拷貝對(duì)象的一層,深拷貝可能拷貝對(duì)象的多層

10. 跨域的解決方案,前后端分離

答:?JSONP跨域,CORS,nginx代理跨域,nodejs中間件代理跨域,WebSocket協(xié)議跨域

前端:整個(gè)頁面顯示以及頁面的交互邏輯。用ajax和node作為交互。其中node作為中間層

后端:提供api接口,利用redis保存session,與數(shù)據(jù)庫(kù)交互

流程:客戶端(瀏覽器)向node請(qǐng)求頁面交互;node向后端(這里用java)轉(zhuǎn)發(fā)請(qǐng)求。java在發(fā)送請(qǐng)求到數(shù)據(jù)庫(kù);java返回結(jié)果給node。node返回頁面,提供數(shù)據(jù)

11. 瀏覽器存儲(chǔ)及區(qū)別?

答:localStorage:永久保存,以鍵值對(duì)保存,存儲(chǔ)空間5M

? ? ? ?sessionStorage:關(guān)閉頁簽/瀏覽器時(shí)清空

? ? ? ? cookie:隨著http請(qǐng)求頭發(fā)送,通過設(shè)置過期時(shí)間刪除,關(guān)閉瀏覽器失效,存儲(chǔ)空間5k

? ? ? ? session:保存在服務(wù)端

12. 數(shù)組常用的方法,判斷變量是數(shù)組類型,數(shù)組扁平化的方法,數(shù)組去重

答:改變?cè)瓟?shù)組:push,pop,shift,unshift,sort,splice,reverse

? ? ? ? 不改變?cè)瓟?shù)組:concat,join,map,forEach,filter,slice

? ? ? ? 判斷是否為數(shù)組:使用instanceof關(guān)鍵字或者constructor屬性

? ? ? ? 扁平化:遞歸concat;split和toString處理

? ? ? ? 數(shù)組去重:ES6語法,new Set() 去重,不支持對(duì)象;自定義去重方法;利用數(shù)組原型對(duì)象splice方法加上雙重循環(huán)

13. ES6新特性

答:模板字符串,箭頭函數(shù),拓展運(yùn)算符,map和set,promise和proxy,數(shù)組方法Array.form(),Array.map(),Array.filter(),Array.forEach(),Array.some(),Array.every()

14.性能優(yōu)化

答:?1)使用緩存(最重要的一點(diǎn)),cookie與WebStorage

? ? ? ?2)減少http請(qǐng)求

? ? ? ?3)文件壓縮合并:html,js,css壓縮。刪除一些無用代碼:注釋

? ? ? ?4)圖片無損壓縮,安卓下可以使用webp格式圖片

? ? ? ?5)使用字體圖標(biāo),矢量圖svg,雪碧圖,base64

? ? ? 6)js文件一般放在頁面底部,若放在head里一般要在script標(biāo)簽上加 async 或者 defer 進(jìn)行異步加載

? ? ? 7)懶加載,預(yù)加載

? ? ? 8)服務(wù)端渲染(SSR),增強(qiáng)頁面的呈現(xiàn)速度,同時(shí)能增強(qiáng)SEO,但頁面切換不如單頁應(yīng)用(SPA)流暢

? ? ? 9)減少dom操作,規(guī)避重繪與回流;更改css屬性較多時(shí),以類名的形式操作dom;有復(fù)雜動(dòng)畫的DOM,可以考慮使其脫離文檔流,從而減少重繪與回流的范圍

? ? 10)事件的節(jié)流與防抖

? ? 11)事件委托。利用事件冒泡,通過指定一個(gè)事件處理程序,來管理某一類型的所有事件。這樣能減少頁面消耗的內(nèi)存

? ? 12)啟用DNS預(yù)解析。遇到網(wǎng)頁中的超鏈接,DNS prefetching從中提取域名并將其解析為IP地址,這些工作在用戶瀏覽網(wǎng)頁時(shí),使用最少的CPU和網(wǎng)絡(luò)在后臺(tái)進(jìn)行解析

? ?13) 減少不必要的 DOM 節(jié)點(diǎn),DOM 樹的深度越淺,瀏覽器解析越快

15. Webpack是什么,Webpack打包優(yōu)化

答:1)路由組件第三方插件按需加載引入require

? ? ? ?2)優(yōu)化loader配置:

? ? ? ? ? ? 優(yōu)化正則匹配:通過 cacheDirectory 選項(xiàng)開啟緩存;通過 include、exclude 來減少被處理的文件

? ??????????module: {

? ????????????rules: [

? ????????????? {

? ? ????????????????? test: /\.js$/,

? ? ? ? ? ? ? ? ? ? ? loader:'babel-loader?cacheDirectory',

? ? ? ? ? ? ? ? ? ? ? include: [resolve('src')]

? ????????????? }

? ? ? ? ? ?]

????????}

? 3) 關(guān)閉sourceMap文件生成

? 4)代碼壓縮,安裝插件 npm i -D?uglifyjs-webpack-plugin

? 5)圖片嗎壓縮,安裝插件?npm installimage-webpack-loader --save-dev

? 6)使用CDN優(yōu)化,vue庫(kù)等實(shí)用鏈接引入

? ?7)使用gzip壓縮,安裝compression-webpack-plugin插件????

? ?8)懶加載,公共代碼抽離,組件化

16.從瀏覽器輸入url后都經(jīng)歷了什么?

答:先進(jìn)行DNS域名解析,先查看本地hosts文件,查看有沒有當(dāng)前域名對(duì)應(yīng)的ip地址,若有直接發(fā)起請(qǐng)求,沒有的話會(huì)在本地域名服務(wù)器去查找,沒找到的話就去根服務(wù)器查找最后查找到對(duì)應(yīng)的ip地址后把對(duì)應(yīng)規(guī)則保存到本地的hosts文件中。

? ? ?進(jìn)行http請(qǐng)求,三次握手四次揮手建立斷開連接

?? ?服務(wù)器處理,可能返回304也可能返回200

? ? 客戶端自上而下執(zhí)行代碼渲染頁面

17.TCP協(xié)議和HTTP協(xié)議

答:TCP協(xié)議在建立過程中會(huì)進(jìn)行三次握手四次揮手,三次握手確保雙方同步并避免無效連接,四次揮手則正常終止連接或異常終止連接。

? ? ? ? HTTP協(xié)議是超文本傳輸協(xié)議(Hyper Text Transfer Protocol),是用于從萬維網(wǎng)服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議。HTTP是一個(gè)基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù)的。

18. HTML5新特性

答:1)拖拽釋放(Drag and drop) API

? ? ? ?2)語義化更好的內(nèi)容標(biāo)簽(header,nav,footer,aside,article,section)

? ? ? ?3)音頻、視頻API(audio,video)

? ? ? ?4)畫布(Canvas) API

? ? ? ?5)地理(Geolocation) API

? ? ? ?6)本地離線存儲(chǔ) localStorage 長(zhǎng)期存儲(chǔ)數(shù)據(jù),瀏覽器關(guān)閉后數(shù)據(jù)不丟失;

? ? ? ?7)sessionStorage 的數(shù)據(jù)在瀏覽器關(guān)閉后自動(dòng)刪除

? ? ? ?8)表單控件,calendar、date、time、email、url、search

? ? ? ?9)新的技術(shù)webworker, websocket, Geolocation

19. 單點(diǎn)登錄(SSO single sign on)

答:?jiǎn)吸c(diǎn)登錄:是指在多系統(tǒng)應(yīng)用群中登錄一個(gè)系統(tǒng),便可在其他所有系統(tǒng)中得到授權(quán)而無需再次登錄,包括單點(diǎn)登錄與單點(diǎn)注銷兩部分

? ? ? ? 優(yōu)缺點(diǎn):數(shù)據(jù)用戶表統(tǒng)一維護(hù),表被刪就有危險(xiǎn)

? ? ? ? 1)登陸驗(yàn)證:用戶在登錄頁面輸入用戶名和密碼,前端將這些憑據(jù)通過HTTPS發(fā)送到后端認(rèn)證服務(wù)

? ? ? ? 2)設(shè)置Token或Cookie:后端驗(yàn)證成功后,會(huì)返回一個(gè)Token(JWT常見)或者設(shè)置一個(gè)認(rèn)證Cookie(包含用戶信息或Token),前端需要保存這個(gè)Token或確保瀏覽器接收了這個(gè)Cookie。Set-Cookie: jwt=lll.zzz.xxx; HttpOnly; max-age=980000; domain=.taobao.com

? ? ? 3)自動(dòng)登錄檢查:在其他需要登錄狀態(tài)的頁面,前端首先檢查是否有有效的Token(通常存儲(chǔ)在LocalStorage或Cookie中)或通過API請(qǐng)求檢查Session狀態(tài)

? ? ? 4)跨域資源共享(CORS):如果前端和后端部署在不同的域名下,需要處理CORS問題,確保Cookie能夠正確傳遞

? ? ? 5)后端要做統(tǒng)一認(rèn)證服務(wù):需要有一個(gè)中心認(rèn)證服務(wù)器,負(fù)責(zé)驗(yàn)證用戶憑據(jù)并發(fā)放Token或設(shè)置Session

? ? ? ??將 Cookie 的 domain 屬性設(shè)置為父域的域名(主域名),同時(shí)將 Cookie 的 path 屬性設(shè)置為根路徑,這樣所有的子域應(yīng)用就都可以訪問到這個(gè) Cookie 了

? ??????Set-Cookie: jwt=lll.zzz.xxx; HttpOnly; max-age=980000;domain=.taobao.com

? ??????Oauth2:是一種系統(tǒng)授權(quán)協(xié)議,它包含多種授權(quán)類型

? ??????localstorage跨域:通過 iframe+postMessage() 方式,將同一份 Token 寫入到了多個(gè)域下的 LocalStorage 中

? ??????// 獲取 token

? ? ? ?var token = result.data.token;

??????// 動(dòng)態(tài)創(chuàng)建一個(gè)不可見的iframe,在iframe中加載一個(gè)跨域HTML

?????var iframe = document.createElement("iframe");

????iframe.src = "http://app1.com/localstorage.html";

????document.body.append(iframe);

????// 使用postMessage()方法將token傳遞給iframe

????setTimeout(function () {

? ? ????iframe.contentWindow.postMessage(token, "http://app1.com");

????}, 4000);

????setTimeout(function () {

? ? ????iframe.remove();

????}, 6000);

????// 在這個(gè)iframe所加載的HTML中綁定一個(gè)事件監(jiān)聽器,當(dāng)事件被觸發(fā)時(shí),把接收到的? ?token數(shù)據(jù)寫入localStorage

????window.addEventListener('message', function (event) {

? ? ????localStorage.setItem('token', event.data)

????}, false);

20.Token無感刷新

答:簡(jiǎn)單說就是短token失效時(shí)利用長(zhǎng)token去獲取短token實(shí)現(xiàn)無感刷新的效果

? ? ? ?1)相應(yīng)攔截器中監(jiān)聽401時(shí)用長(zhǎng)token去換短token并存儲(chǔ),refresh token請(qǐng)求失敗重新登錄

? ? ? ?2)重新調(diào)用接口,并發(fā)刷新 token的情況,解決方法是實(shí)例化一個(gè)全局變量的promise,如果其他的請(qǐng)求進(jìn)來就返回這個(gè)promise,最后利用promise上的finally將promise賦值null

21. JS執(zhí)行機(jī)制,循環(huán)機(jī)制,宏觀微觀任務(wù)

答:JS執(zhí)行機(jī)制:

? ? ? ? 1)首先判斷程序中存在任務(wù)類型即同步任務(wù)、異步任務(wù)

? ? ? ? 2)同步任務(wù)會(huì)在執(zhí)行棧中先執(zhí)行

? ? ? ? 3)異步任務(wù)則會(huì)經(jīng)瀏覽器處理后,放入任務(wù)隊(duì)列中

? ? ? ? 4)當(dāng)同步任務(wù)完全執(zhí)行完后,執(zhí)行棧會(huì)查詢?nèi)蝿?wù)隊(duì)列,取出任務(wù)隊(duì)列中羅列好的異步任務(wù)來執(zhí)行

? ? ? ? 5)重復(fù)第4步直到異步也完全執(zhí)行完畢(事件循環(huán))????

? ? 事件循環(huán)(EventLoop):JS有一個(gè)基于事件循環(huán)的并發(fā)模型,事件循環(huán)負(fù)責(zé)執(zhí)行代碼、收集和處理事件以及執(zhí)行任務(wù)隊(duì)列中的子任務(wù);即:執(zhí)行代碼和收集異步任務(wù)的模型,在執(zhí)行棧空閑時(shí),不斷從任務(wù)隊(duì)列中獲取任務(wù)、執(zhí)行任務(wù)、再獲取任務(wù)、再執(zhí)行的過程,稱為事件循環(huán)(eventLoop)

? ? 為什么設(shè)計(jì)事件循環(huán):JS是一門單線程語言(某一刻只能執(zhí)行一行代碼),為了讓耗時(shí)代碼不阻塞其他代碼運(yùn)行,設(shè)計(jì)了事件循環(huán)模型

? ? 宏任務(wù):setTimeout,setInterval,Ajax,DOM事件

? ? 微任務(wù):Promise,async/await(微任務(wù)比宏任務(wù)執(zhí)行更早)

22. map和forEach的區(qū)別?

答:都是循環(huán)遍歷數(shù)組支持3個(gè)參數(shù),map方法返回一個(gè)新的數(shù)組,數(shù)組中的元素為原始數(shù)組調(diào)用函數(shù)處理后的值

23. em和rem的區(qū)別?移動(dòng)端怎么適配?

答:移動(dòng)端適配使用lib-flexible會(huì)和px2rem-loader插件一起使用,目的是將css中的px轉(zhuǎn)換為rem

px,絕對(duì)長(zhǎng)度單位,像素的計(jì)算是針對(duì)屏幕的,一個(gè)像素(1px)就是屏幕的一個(gè)點(diǎn)

em,相對(duì)長(zhǎng)度單位 ,相對(duì)于父元素,一般瀏覽器默認(rèn)(1em=16px);

rem,相對(duì)長(zhǎng)度單位,相對(duì)于根元素,即HTML元素,常用于響應(yīng)式布局

html {

? font-size: 100% // 相當(dāng)于16px

}

div {

? width: 3rem? // 相當(dāng)于3*16px = 48px

}

24. 大文件上傳,斷點(diǎn)續(xù)傳

答:斷點(diǎn)續(xù)傳主要依賴于HTTP協(xié)議中的兩個(gè)頭部字段

? ? Range:用于請(qǐng)求指定資源的某個(gè)范圍。格式如 Range: bytes=start-end,其中start和end表示字節(jié)范圍

? ? Content-Range:服務(wù)器響應(yīng)時(shí)使用,告訴客戶端這個(gè)響應(yīng)包含的資源范圍,格式如 Content-Range: bytes start-end/fileSize

? ??HTML5 File API?FileList對(duì)象,最后用promise.all():

? ? ????1)初始化檢查:首先檢查文件是否已部分上傳,如果存在之前上傳的記錄,則獲取已上傳的字節(jié)范圍

? ? ????2)分片處理:將大文件切分為多個(gè)小塊(將file分片slice),每個(gè)分片獨(dú)立上傳

? ? ? ? 3)發(fā)送請(qǐng)求:對(duì)每個(gè)未上傳或未完成的分片,發(fā)送帶有Range頭部的HTTP請(qǐng)求(如PUT或POST),指定要上傳的字節(jié)范圍

? ? ? ? 4)記錄狀態(tài):在上傳過程中,記錄每個(gè)分片的上傳狀態(tài),以便于失敗后重試或中斷后續(xù)傳

? ? ? ? 5)發(fā)送合并文件請(qǐng)求:服務(wù)端需要支持接收并合并這些分片,確保最終組合成完整的文件

25. Websocket斷線心跳

答:心跳檢測(cè):通過定期發(fā)送小數(shù)據(jù)包(心跳包)來檢查WebSocket連接狀態(tài),確認(rèn)客戶端和服務(wù)器之間的連接是否仍然活躍

? ? ? ? 短線重連:在WebSocket連接因網(wǎng)絡(luò)問題或其他原因意外斷開時(shí),自動(dòng)嘗試重新建立連接的過程(斷線原因:網(wǎng)絡(luò),服務(wù)器,防火墻,超時(shí),代碼問題)

? ? ? ? websocket協(xié)議和http協(xié)議:WebSocket適用于實(shí)時(shí)交互的場(chǎng)景,提供持久的連接,支持二進(jìn)制數(shù)據(jù)傳輸,數(shù)據(jù)傳輸雙向,使用 ws:// 或 wss:// 前綴標(biāo)識(shí)

? ? ? ? ? HTTP 是無狀態(tài)的,每次請(qǐng)求都需要重新建立連接,每次請(qǐng)求時(shí)都是獨(dú)立的,數(shù)據(jù)傳輸單向,使用 http:// 或 https://

26. 循環(huán)引用及處理

答:循環(huán)引用也稱循環(huán)依賴,是指兩個(gè)或多個(gè)對(duì)象相互引用,形成一個(gè)閉環(huán);潛在風(fēng)險(xiǎn)指內(nèi)存泄漏,性能下降,調(diào)試?yán)щy;

????????解決方案:重構(gòu)代碼結(jié)構(gòu),弱引用,手動(dòng)解除引用,使用工具庫(kù)

27. HTTP狀態(tài)碼?304和強(qiáng)緩存,協(xié)商緩存

答: 1)304:請(qǐng)求的內(nèi)容沒有修改過,所以服務(wù)器返回此響應(yīng)時(shí),不會(huì)返回網(wǎng)頁內(nèi)容,而是使用緩存

? ? ? ? 2) 401:請(qǐng)求需要身份驗(yàn)證??

? ? ? ? 3) 403:請(qǐng)求的對(duì)應(yīng)資源禁止被訪問

? ? ? ? 4) 404:服務(wù)器無法找到對(duì)應(yīng)資源

? ? ? ? 5) 500:服務(wù)器內(nèi)部錯(cuò)誤?

? ? ? ? 6) 503: 服務(wù)不可用

? ??強(qiáng)緩存和協(xié)商緩存是HTTP緩存機(jī)制的兩種類型,它們用于減少服務(wù)器的負(fù)擔(dān)和提高網(wǎng)頁加載速度

? ??強(qiáng)緩存:客戶端在沒有向服務(wù)器發(fā)送請(qǐng)求的情況下,直接從本地緩存中獲取資源

? ??協(xié)商緩存:當(dāng)強(qiáng)緩存失效時(shí),瀏覽器會(huì)發(fā)送請(qǐng)求到服務(wù)器,通過ETag或Last-Modified等HTTP響應(yīng)頭與服務(wù)器進(jìn)行驗(yàn)證,以確定資源是否被修改

28. 純函數(shù)

答:?純函數(shù)是這樣一種函數(shù),即相同的輸入,永遠(yuǎn)會(huì)得到相同的輸出的函數(shù),而且沒有任何可觀察的副作用。?是指那些不依賴于外部狀態(tài),也不改變外部狀態(tài)的函數(shù)

? ??JavaScript中一些常見的自帶純函數(shù)包括:

? ??????1)Math.abs:返回參數(shù)的絕對(duì)值。

????????2) Math.min 和 Math.max:分別返回一組數(shù)中的最小值和最大值。

????????3)Math.round:四舍五入。

????????4)Math.floor 和 Math.ceil:分別向下和向上取整。

????????5)Array.prototype.slice:不改變?cè)瓟?shù)組,返回一個(gè)新數(shù)組。

????????6)String.prototype.toUpperCase 和 String.prototype.toLowerCase:轉(zhuǎn)換字符串的大小寫

29.let,var,const

答:let和const具有塊級(jí)作用域,var不存在塊級(jí)作用域,可以跨塊訪問, 不能跨函數(shù)訪問;const聲明對(duì)象能修改,不能賦值

? ?????? if(true){

? ? ? ? ? ? var a = 0

? ? ? ? ? ? let b = 0

? ? ? ? ? ? const c = 0

? ? ? ? }

? ? ? ? console.log(a);

? ? ? ? console.log(b);

? ? ? ? console.log(c);

30.?封裝判斷數(shù)據(jù)類型的方法

答:typeof操作符返回一個(gè)字符串(全小寫字母),表示未經(jīng)計(jì)算的操作數(shù)的類型;用法可以是typeof operand或typeof(operand);operand一個(gè)表示對(duì)象或原始值的表達(dá)式,其類型將被返回

? ??????constructor:對(duì)象的constructor屬性用于返回創(chuàng)建該對(duì)象的函數(shù),也就是我們常說的構(gòu)造函數(shù)

? ??????Object.prototype.toString():toString()是Object原型對(duì)象上的方法,返回的是代表該對(duì)象的字符串

? ??????Object.prototype.toString()與Object.toString()的區(qū)別:

? ? ? ? ? ? 1)Object.toString()的toString()是Object構(gòu)造函數(shù)上的方法,返回的是對(duì)應(yīng)的函數(shù)

? ? ? ? ? ? 2)?Object.prototype.toString()的toString()是Object原型對(duì)象上的方法,返回的是代表該對(duì)象的字符串

31. 虛擬列表的實(shí)現(xiàn)和原理

答:虛擬列表大大減少了 DOM 元素的數(shù)量,提高了頁面性能,讓長(zhǎng)列表的瀏覽更加流暢;1)只渲染可見區(qū)域; 2)監(jiān)聽滾動(dòng); 3)占位填充

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

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

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