2022前端面試題整理

1. cookie sessinonStorage localStorage

得分點(diǎn):
數(shù)據(jù)存儲(chǔ)位置、生命周期、存儲(chǔ)大小、寫入方式、數(shù)據(jù)共享、發(fā)送請(qǐng)求時(shí)是否攜帶、應(yīng)用場(chǎng)景

標(biāo)準(zhǔn)回答:
cookie、sessionStorage、localStorage都是瀏覽器的本地存儲(chǔ)
共同點(diǎn): 都是存儲(chǔ)在瀏覽器本地
區(qū)別:cookie是由服務(wù)端寫入的, 而sessionStorage、localStorage都是由前端寫入的,
cookie的生命周期是由服務(wù)端寫入的時(shí)候就設(shè)置好的,localStorage是寫入就一直存在,除非手動(dòng)清除,sessionStorage是頁面關(guān)閉就會(huì)自動(dòng)清除,
cookie的存儲(chǔ)空間比較小,大概4KB,sessionStorage和loaclStorage的存儲(chǔ)空間比較大,大概5M,
cookie、sessionStorage、localStorage數(shù)據(jù)共享都遵循同源原則,sessionStorage還限制必須同一個(gè)頁面,
在前端給后端發(fā)送請(qǐng)求會(huì)自動(dòng)攜帶cookie中的數(shù)據(jù),但是sessionStorage、localStorage不會(huì),
應(yīng)用場(chǎng)景不同:cookie一般用于存儲(chǔ)登錄驗(yàn)證信息,sessionId或者token。localStorage常用于存儲(chǔ)不易變動(dòng)的數(shù)據(jù),減輕服務(wù)器壓力,sessionStorage可以用來檢測(cè)用戶是否刷新進(jìn)入頁面


2. js的數(shù)據(jù)類型

得分點(diǎn):
number、string、boolean、bigint、symbol、null、undefined、Object 8種

標(biāo)準(zhǔn)回答:
js的數(shù)據(jù)類型分為兩類,一類是基本數(shù)據(jù)類型也叫簡(jiǎn)單數(shù)據(jù)類型,包含7種類型:number、string、boolean、bigInt、symbol、null、undefined,另一類是引用數(shù)據(jù)類型也叫復(fù)雜數(shù)據(jù)類型,通常用object代表,普通對(duì)象,數(shù)組、正則、日期,Math數(shù)據(jù)函數(shù)都屬于object
數(shù)據(jù)分成兩大類的本質(zhì)區(qū)別:基本數(shù)據(jù)類型和引用數(shù)據(jù)類型他們?cè)趦?nèi)存種的存儲(chǔ)與方式不同,基本數(shù)據(jù)類型是直接存在棧中的簡(jiǎn)單數(shù)據(jù)段,占用空間小,屬于被頻繁使用的數(shù)據(jù)、引用數(shù)據(jù)類型是存儲(chǔ)在內(nèi)存中,占用空間大,引用數(shù)據(jù)類型在棧中存儲(chǔ)了指針,該指針指向堆中該實(shí)體的起始位置、當(dāng)解釋器尋找引用值時(shí)、會(huì)檢索其在棧中的地址,取得地址后從堆中獲得實(shí)體
symbol是Es6新出的一種數(shù)據(jù)類型,這種數(shù)據(jù)類型的特點(diǎn)就是沒有重復(fù)的數(shù)據(jù),可以用為object的key、數(shù)據(jù)的創(chuàng)建方法是symbol(),因?yàn)樗臉?gòu)造函數(shù)不夠完整,所以不能使用new Symbol()創(chuàng)建數(shù)據(jù)。由于symbol()創(chuàng)建數(shù)據(jù)具有唯一性,所以symbol() !== symbol(), 同時(shí)使用symbol數(shù)據(jù)作為key,不能使用for獲取到這個(gè)key,需要使用object.getOwnPropertySymbols(obj) 獲取這個(gè)obj對(duì)象中key類型是symbol的key
bigInt也是es6新出的一種數(shù)據(jù)類型,這種數(shù)據(jù)類型的特點(diǎn)就是數(shù)據(jù)涵蓋的范圍大,能夠解除超出普通數(shù)據(jù)類型范圍報(bào)錯(cuò)的問題
number精度范圍是2的52次方位


3. 閉包

得分點(diǎn):
變量背包、作用域鏈、局部變量不銷毀、函數(shù)體外訪問函數(shù)的內(nèi)部變量、內(nèi)存泄露、內(nèi)存溢出、形成塊級(jí)作用域、柯里化、構(gòu)造函數(shù)中定義特權(quán)方法、Vue種數(shù)據(jù)響應(yīng)式Observer

標(biāo)準(zhǔn)回答:
閉包: 一個(gè)函數(shù)和詞法環(huán)境的引用捆綁在一起,這樣的組合就是閉包,
一般就是一個(gè)函數(shù)A,return其內(nèi)部的函數(shù)B, 被return出去的B函數(shù)能夠在外部訪問A函數(shù)內(nèi)部的變量,這時(shí)候就形成了一個(gè)B函數(shù)的變量背包,A函數(shù)執(zhí)行結(jié)束后這個(gè)變量背包也不會(huì)被銷毀,并且這個(gè)變量背包在A函數(shù)外部只能通關(guān)B函數(shù)訪問,
閉包形成的原理:作用域鏈,當(dāng)前作用域可以訪問上級(jí)作用域中的變量,閉包解決的問題: 由于垃圾回收器不會(huì)將閉包中的變量銷毀,于是就造成了內(nèi)存泄露,內(nèi)存泄漏積累多了就容易導(dǎo)致內(nèi)存溢出,

加分回答:閉包的應(yīng)用,能夠模仿塊級(jí)作用域,能夠?qū)崿F(xiàn)柯里化、在構(gòu)造函數(shù)中定義特權(quán)方法,Vue種數(shù)據(jù)響應(yīng)式Observer中使用閉包等


4.promise

得分點(diǎn):
pending、rejected、resolved、微任務(wù)、then、catch、Promise.resolve()、promise.reject()、promise.all()、promise.any() promise.race();

標(biāo)準(zhǔn)回答:
promise的作用:promise是異步微任務(wù),解決了異步多層嵌套回調(diào)的問題,讓代碼的可讀性更高,更容易維護(hù)
promise的使用: promise是ES6提供的一個(gè)構(gòu)造函數(shù),可以使用promise構(gòu)造函數(shù)new一個(gè)實(shí)例,promise構(gòu)造函數(shù)接受一個(gè)函數(shù)作為參數(shù),這個(gè)函數(shù)又兩個(gè)參數(shù),分別是‘resolve’和‘reject’,‘resolve’將promise由等待pending變?yōu)槌晒?,將異步操作的結(jié)果作為參數(shù)傳遞過去,‘reject’則將狀態(tài)由等待pending變成失敗,在異步操作失敗時(shí)調(diào)用,將異步操作報(bào)出的錯(cuò)誤作為參數(shù)傳遞過去。
實(shí)例創(chuàng)建完成后,可以使用'then'方法分別指定成功或失敗的回調(diào)函數(shù),可以使用catch捕捉失敗。
then和catch最終返回的也是一個(gè)promise,所以可以鏈?zhǔn)秸{(diào)用,
promise的特點(diǎn):1. 對(duì)象的狀態(tài)不受外界影響,promise對(duì)象代表一個(gè)異步操作,有三種狀態(tài), pending(執(zhí)行中) resolved(成功,又稱fulfilled)。rejected(拒接),pending為初始狀態(tài)。resolved和rejected為結(jié)束狀態(tài),結(jié)束狀態(tài)代表promise生命周期已結(jié)束。2.一旦狀態(tài)改變,就不會(huì)在變,任何時(shí)候都可以得到這個(gè)結(jié)果, promise對(duì)象的狀態(tài)改變,只能有兩個(gè)可能, 從pending變?yōu)閞esolved | 從pending變成rejected。3.resolve方法的參數(shù)是then中回調(diào)函數(shù)的參數(shù),reject方法種的參數(shù)是catch中的參數(shù) 4. then方法和catch方法只要不報(bào)錯(cuò),返回的都是一個(gè)fulfilled狀態(tài)的promise

加分回答:
promise.resolve() 返回的promise對(duì)象狀態(tài)變成fulfilled。并且將value傳遞給對(duì)應(yīng)的then方法。
promise.reject() 返回一個(gè)狀態(tài)為失敗狀態(tài)的promise對(duì)象,并將給定的失敗信息傳遞給對(duì)應(yīng)的處理方法。
promise.all() 返回一個(gè)新的promise對(duì)象,該promise對(duì)象的參數(shù)對(duì)象里面所有的promise對(duì)象都成功的時(shí)候才會(huì)觸發(fā),一旦有任何一個(gè)promise對(duì)象失敗則立即觸發(fā)該promise對(duì)象的失敗。
promise.any() 接受一個(gè)promise對(duì)象的集合,當(dāng)其中一個(gè)promise成功,就返回那個(gè)成功的promise的值。
promise.race() 當(dāng)參數(shù)里面的任意一個(gè)promise對(duì)象成功或者失敗后,父promise馬上也會(huì)用子promise的成功返回或者失敗詳情作為參數(shù)調(diào)用父promise綁定的相應(yīng)句柄,并返回該promise對(duì)象


5.跨域

得分點(diǎn):
同源協(xié)議、協(xié)議、域名、端口、CORS、node中間件、JSONP、postmessage

標(biāo)準(zhǔn)回答:
跨域:當(dāng)前頁面中的某個(gè)接口請(qǐng)求的地址和當(dāng)前頁面的地址如果協(xié)議、域名、端口其中有一項(xiàng)不同,該接口就跨域了
跨域限制的原因:瀏覽器為了保證網(wǎng)頁的安全,出的同源協(xié)議策略
跨域解決方案:1. CORS: 目前最常用的一種解決辦法,通過設(shè)置后端允許跨域、 2. node中間件、nginx反向代理:跨域限制的時(shí)候?yàn)g覽器不能訪問跨域服務(wù)器,node中間件和nginx反向代理,都是讓請(qǐng)求發(fā)給代理服務(wù)器,靜態(tài)頁面和代理服務(wù)器是同源的,然后代理服務(wù)器在向后臺(tái)服務(wù)器發(fā)送請(qǐng)求,服務(wù)器和服務(wù)器之間不存在同源限制 3.JSONP 利用原理是script標(biāo)簽可以跨域請(qǐng)求資源,將回調(diào)函數(shù)作為參數(shù)拼接在url后,后端收到請(qǐng)求,調(diào)用該回調(diào)函數(shù),并將數(shù)據(jù)作為參數(shù)返回去,注意設(shè)置響應(yīng)頭返回文檔類型,應(yīng)該設(shè)置成JavaScript


6.vuex

得分點(diǎn): state、mutations、getters、action、module、store.commit、store.dispatch

標(biāo)準(zhǔn)回答:
Vuex是集中管理項(xiàng)目公共數(shù)據(jù)的。
vuex有state、mutations、getters、actions、module屬性
state屬性用來存儲(chǔ)公共管理的數(shù)據(jù)。
mutations屬性定義改變state中數(shù)據(jù)的方法。注意:不要在mutation中的方法中寫異步的ajax,那樣數(shù)據(jù)就不可跟蹤了
getters屬性可以認(rèn)為是定義store中的計(jì)算屬性、就像計(jì)算屬性一樣,getter的返回值會(huì)根據(jù)它的依賴被緩存起來,且只有當(dāng)他的依賴值發(fā)生了改變才會(huì)被重新計(jì)算,
action屬性類似于mutation。不同在于:action提交的是mutation。而不是直接改變數(shù)據(jù)狀態(tài)。action可以包含任何的異步操作。
moudle屬性是將store分割成模塊,每個(gè)模塊擁有自己的state、mutation、action、getter甚至是嵌套子模塊,從上至下進(jìn)行同樣的方式分割,
使用方法:
state直接以對(duì)象方式添加屬性
mutations: 通過store.commit調(diào)用
action:通過store.dispath方法觸發(fā)
getters: 直接通過store.getters調(diào)用

加分回答: 可以使用mapState、mapMutations、mapActions、mapGetters一次性獲取每個(gè)屬性下對(duì)應(yīng)的多個(gè)方法。vuex在大型項(xiàng)目中比較常用,非關(guān)系組件傳遞數(shù)據(jù)比較方便


7.數(shù)據(jù)去重

得分點(diǎn): 對(duì)象屬性、new Set()、indexOf、hasOwnproperty、reduce+includes、filter

利用對(duì)象屬性key排除重復(fù)項(xiàng): 遍歷數(shù)組,每次判斷對(duì)象中是否存在該屬性。不存在就存儲(chǔ)在新數(shù)組中、并且把數(shù)組元素作為key,設(shè)置一個(gè)值。存儲(chǔ)在對(duì)象中,最后返回新數(shù)組,這個(gè)方法效率高,缺點(diǎn)占用較多空間,使用的額外空間有一個(gè)查詢對(duì)象和一個(gè)新數(shù)組
利用set類型數(shù)據(jù)無重復(fù)項(xiàng): new 一個(gè)set。參數(shù)為需要去重的數(shù)據(jù)。set會(huì)自動(dòng)刪除重復(fù)的元素,再將set轉(zhuǎn)為數(shù)組返回,這個(gè)方法的優(yōu)點(diǎn):效率更高,代碼簡(jiǎn)單、思路清晰、缺點(diǎn):可能有兼容性問題
filter+indexOf。這個(gè)方法和第一種方法類似,利用array自帶的filter方法,返回arr.indexOf(num)等于index的num,原理是indexOf會(huì)返回最先找到的數(shù)字索引,優(yōu)點(diǎn):可以在去重的時(shí)候插入對(duì)元素的操作,可擴(kuò)展性強(qiáng)
reduce+includes去重:這個(gè)方法就是利用reduce遍歷和傳入一個(gè)空數(shù)組作為去重后的數(shù)組,然后內(nèi)部判斷新數(shù)組中是否存在當(dāng)前遍歷的元素,不存在就插入到新數(shù)組中,這個(gè)方法消耗多,內(nèi)存也有額外占用,方法還有很多,常用這些

加分回答:在數(shù)據(jù)低于10000條的時(shí)候沒有明顯的差別,高于1w條的,利用對(duì)象屬性和set方法時(shí)間消耗最少,后面兩條的時(shí)間消耗較多,由于key方法內(nèi)存空間消耗比較多,且現(xiàn)在很多項(xiàng)目不考慮低版本瀏覽器的兼容性問題,建議使用set方法,簡(jiǎn)潔方便


8. vue2雙向綁定的原理和缺陷

得分點(diǎn):
Object.defineProperty、getter、setter
標(biāo)準(zhǔn)回答:Vue響應(yīng)式指的是: 組件的data發(fā)生變化,立即觸發(fā)視圖的更新
原理:
Vue采用數(shù)據(jù)劫持 結(jié)合 發(fā)布者-訂閱者的方式來實(shí)現(xiàn)數(shù)據(jù)的響應(yīng)式,通過Object.defineProperty來劫持?jǐn)?shù)據(jù)的getter、setter,在數(shù)據(jù)變動(dòng)時(shí)發(fā)布消息給訂閱者,訂閱者收到消息后進(jìn)行相應(yīng)的處理,通過原生js提供的監(jiān)聽數(shù)據(jù)的API,當(dāng)數(shù)據(jù)發(fā)生變化的時(shí)候,在回調(diào)函數(shù)中修改DOM。 核心API:Object.dedineproperty
缺點(diǎn):
一次性遞歸到底開銷很大,如果數(shù)據(jù)很大,大量的遞歸導(dǎo)致調(diào)用棧溢出、 不能監(jiān)聽對(duì)象的新增屬性和刪除屬性 無法正確的監(jiān)聽數(shù)組的方法


9.vue2和vue3的區(qū)別

vue2不管數(shù)據(jù)多大,都會(huì)在一開始就為其創(chuàng)建觀察者,當(dāng)數(shù)據(jù)很大時(shí),這可能會(huì)在頁面載入時(shí)造成明顯的性能壓力,vue3只會(huì)對(duì)被用于渲染初始可見部分的數(shù)據(jù)創(chuàng)建觀察者,而且vue3的觀察者更高效
object.defineProperty無法監(jiān)聽到新增和刪除屬性,但是proxy可以監(jiān)聽到
object.defineProperty需要遍歷對(duì)象每個(gè)數(shù)據(jù),對(duì)性能影響,proxy監(jiān)控對(duì)象本身


10.ES6的箭頭函數(shù)

得分點(diǎn):
沒有this、this是從外部獲取、不能使用new、沒有arguments、沒有原型和super

標(biāo)準(zhǔn)回答:箭頭函數(shù)相當(dāng)于匿名函數(shù),簡(jiǎn)化了函數(shù)定義。箭頭函數(shù)有兩種寫法,當(dāng)函數(shù)體是單條語句的時(shí)候可以省略{}和return,另一種是多條語句,不可以省略{}和return,
箭頭函數(shù)最大的他特點(diǎn)就是沒有this。所以this是從外部獲取,就是繼承外部的執(zhí)行上下文中的this。由于沒有this關(guān)鍵字,所以箭頭函數(shù)也不能作為構(gòu)造函數(shù)。同時(shí)通關(guān)call() 或者apply() 方法調(diào)用一個(gè)函數(shù)是,只能傳遞參數(shù),不能綁定this,第一個(gè)參數(shù)會(huì)被忽略,箭頭函數(shù)也沒有原型和super


11. call apply bind的作用和區(qū)別

得分點(diǎn):
bind改變this指向不直接調(diào)用、call和apply改變this指向直接調(diào)用、apply接受第二個(gè)參數(shù)為數(shù)組、call用于對(duì)象的繼承、偽數(shù)組轉(zhuǎn)化為真數(shù)組、apply用于找出數(shù)組中的最大值和最小值以及數(shù)組合并,bind用于vue改變函數(shù)的this指向

標(biāo)準(zhǔn)回答:
call、apply、bind的作用都是改變函數(shù)運(yùn)行時(shí)的this指向,bind和call、apply在使用上有所不同、bind在改變this指向返回一個(gè)改變執(zhí)行上下文的函數(shù)。不會(huì)立即執(zhí)行函數(shù),需要調(diào)用函數(shù)的時(shí)候在調(diào)用
但是call和apply在改變this指向的通時(shí)執(zhí)行了該函數(shù),call和apply接收多個(gè)參數(shù),第一個(gè)參數(shù)都是this指向的上下文,后面的參數(shù)都是作為改變this指向的函數(shù)的參數(shù)。
call和apply的參數(shù)格式不同,call時(shí)一個(gè)參數(shù)對(duì)應(yīng)一個(gè)原函數(shù)的參數(shù),但是apply第二個(gè)參數(shù)時(shí)數(shù)組,數(shù)組中每個(gè)元素代表函數(shù)接口的參數(shù),數(shù)組有幾個(gè)元素函數(shù)就接受幾個(gè)參數(shù)


12.HTML語義化

得分點(diǎn):語義化標(biāo)簽、利于頁面內(nèi)容結(jié)構(gòu)化、利于無css頁面可讀、利于SEO、利于代碼可讀

標(biāo)準(zhǔn)回答:HTML語義化比就是指在使用HTML標(biāo)簽構(gòu)建頁面時(shí),避免大幅度的使用無語義的標(biāo)簽,語義標(biāo)簽:header footer h1-h6 p br


13. this指向

得分點(diǎn): 全局執(zhí)行上下文、函數(shù)執(zhí)行上下文、this嚴(yán)格模式undefined、非嚴(yán)格模式window、構(gòu)造函數(shù)新對(duì)象本身、普通函數(shù)不繼承this、箭頭函數(shù)無this

標(biāo)準(zhǔn)回答:
this關(guān)鍵字的由來: 在對(duì)象內(nèi)部的方法中使用對(duì)象內(nèi)部的屬性是一個(gè)普遍的需求,但是javascript的作用域機(jī)制并不支持這一點(diǎn),基于這個(gè)需求,javascript又搞出來一套this機(jī)制,this存在場(chǎng)景有三種,全局執(zhí)行上下文和函數(shù)執(zhí)行上下文和eval執(zhí)行上下文(暫不討論),
在全局執(zhí)行環(huán)境中無論是否在嚴(yán)格模式下,this都是指向全局對(duì)象,在函數(shù)執(zhí)行上下文中訪問this,函數(shù)的調(diào)用方式?jīng)Q定了this的值,在全局環(huán)境中調(diào)用一個(gè)函數(shù),函數(shù)內(nèi)部的this指向的是全局變量window,通關(guān)一個(gè)對(duì)象來調(diào)用其內(nèi)部的一個(gè)方法,該方法的執(zhí)行上下文中的this指向?qū)ο蟊旧恚?br> 普通函數(shù)this指向:當(dāng)函數(shù)被正常調(diào)用時(shí),在嚴(yán)格模式下this指向undefined,非嚴(yán)格模式下this指向的是全局對(duì)象window,通過一個(gè)對(duì)象來調(diào)用其內(nèi)部的一個(gè)方法,該方法的執(zhí)行上下文中的this指向?qū)ο蟊旧?。new 關(guān)鍵字構(gòu)架好了一個(gè)新對(duì)象,并且構(gòu)造函數(shù)的this其實(shí)就是新對(duì)象本身。
嵌套函數(shù)的this不會(huì)繼承外層函數(shù)的this。箭頭函數(shù)沒有this,箭頭函數(shù)并不會(huì)創(chuàng)建自身的執(zhí)行上下文,所以箭頭函數(shù)中的this取決于它的外部函數(shù)

加分回答: 箭頭函數(shù)沒有this。所以也不能作為構(gòu)造函數(shù),但是需要繼承函數(shù)外部的this時(shí),使用箭頭函數(shù)比較方便


14.css尺寸單位

得分點(diǎn):px、rem、em、vw、vh
標(biāo)準(zhǔn)回答:
px絕對(duì)長(zhǎng)度單位,它的大小取決于屏幕的分辨率,是開發(fā)網(wǎng)頁中常常使用的單位
em相對(duì)長(zhǎng)度單位,在font-size中使用相對(duì)于父元素的字體大小,在其他屬性中使用相對(duì)自身的字體大小
rem 相對(duì)長(zhǎng)度單位 根據(jù)根元素的字體大小,如果根元素未設(shè)置,使用瀏覽器默認(rèn)字體大小
vw,vh相對(duì)長(zhǎng)度單位,相對(duì)與視窗寬度的1%


15.js變量提升

得分點(diǎn): var聲明的變量提升、函數(shù)聲明提升、let和const變量不提示

標(biāo)準(zhǔn)回答:
變量提升是指js的變量和函數(shù)聲明會(huì)在代碼編譯期提升到代碼的最前面,變量提升成立的前提是使用var關(guān)鍵字進(jìn)行聲明的變量,并且變量提升的時(shí)候只有聲明被提升,賦值并不會(huì)被提升,同時(shí)函數(shù)的聲明提升會(huì)比變量的提升優(yōu)先,變量提升的結(jié)果,可以在變量初始化之前訪問該變量,返回的是undefined。在函數(shù)聲明前可以調(diào)用該函數(shù)

加分回答: 使用let 和const聲明的變量是創(chuàng)建提升,形成暫時(shí)性死區(qū),在初始化之前訪問let和const創(chuàng)建的變量會(huì)報(bào)錯(cuò)


16.hashRouter和HistoryRouter的區(qū)別和原理

得分點(diǎn):
window.onhashChange history.pushState window.onpopstate

標(biāo)準(zhǔn)回答:
history和hash都是利用瀏覽器的兩種特性實(shí)現(xiàn)的前端路由
history是利用瀏覽器歷史記錄棧的api實(shí)現(xiàn),hash是監(jiān)聽loaction對(duì)象的hash值變化事件來實(shí)現(xiàn)
history沒有#號(hào),hash有#號(hào),相同的url, history會(huì)觸發(fā)添加到瀏覽器歷史記錄棧中,hash不會(huì)觸發(fā)
history需要后端配合,在做進(jìn)一步處理,如果后端不配合,會(huì)出現(xiàn)404,hash不需要
history原理 通過history.pushstate使用它做頁面跳轉(zhuǎn)不會(huì)觸發(fā)頁面刷新,使用window.onpopstate監(jiān)聽瀏覽器的前進(jìn)和后退,在做其他處理

加分回答: hash模式下有#號(hào),需要url更加優(yōu)雅時(shí),可以使用history模式,需要兼容低版本瀏覽器時(shí)建議使用hash模式


17.map和forEach的區(qū)別

得分點(diǎn):map創(chuàng)建新數(shù)組,map返回處理后的值、forEach不修改原數(shù)組、forEach方法返回undfined

標(biāo)準(zhǔn)回答:
map有返回值、可以開辟新空間,return出來一個(gè)length和原數(shù)組一致的數(shù)組,即便數(shù)組元素是undefined或者null。
forEach默認(rèn)無返回值。返回結(jié)果為undfined??梢酝ㄟ^在函數(shù)體內(nèi)部使用索引改變數(shù)組元素

加分回答:map的處理速度比forEach快,。而且返回一個(gè)新數(shù)組,方便鏈?zhǔn)秸{(diào)用數(shù)組的其他方法


18.事件循環(huán)Event loop, 宏任務(wù)、微任務(wù)

得分點(diǎn):任務(wù)掛起、同步任務(wù)執(zhí)行結(jié)束執(zhí)行隊(duì)列中的異步任務(wù)、執(zhí)行script標(biāo)簽內(nèi)部代碼、setTimeout/setInterval、ajax請(qǐng)求、postMessage。promise、nextTick

標(biāo)準(zhǔn)回答:
瀏覽器的事件循環(huán):執(zhí)行js代碼的時(shí)候,遇見同步任務(wù),直接推入調(diào)用棧中執(zhí)行,遇到異步任務(wù),將該任務(wù)掛起,等到異步任務(wù)有返回之后推入任務(wù)隊(duì)列中,當(dāng)調(diào)用棧中的同步任務(wù)全部執(zhí)行完成,將任務(wù)隊(duì)列中的任務(wù)按順序一個(gè)個(gè)推入執(zhí)行,重復(fù)執(zhí)行這一系列的行為, 異步任務(wù)又分為宏任務(wù)和微任務(wù)。
宏任務(wù): 任務(wù)隊(duì)列中的任務(wù)稱為宏任務(wù),每個(gè)宏任務(wù)都包含一個(gè)微任務(wù)隊(duì)列
微任務(wù): 等宏任務(wù)中的主要功能都完成后,渲染殷勤不急著去執(zhí)行下一個(gè)宏任務(wù),而是執(zhí)行當(dāng)前宏任務(wù)中的微任務(wù)
宏任務(wù)包括:執(zhí)行script標(biāo)簽內(nèi)部代碼、setTimeout、ajax請(qǐng)求
微任務(wù)包括:pormise、MutonObserver、Object.observer


19. vue3實(shí)現(xiàn)數(shù)據(jù)雙向綁定的方法

得分點(diǎn):proxy、數(shù)據(jù)攔截、劫持整個(gè)對(duì)象、返回一個(gè)新對(duì)象

標(biāo)準(zhǔn)回答:
vue3通過proxy實(shí)現(xiàn)數(shù)據(jù)的雙向綁定。
proxy是ES6中新增的一個(gè)特性、實(shí)現(xiàn)的過程是在目標(biāo)對(duì)象之前設(shè)置了一層攔截。外界對(duì)該對(duì)象的訪問,都必須先通關(guān)這層攔截、因此提供了一種機(jī)制,可以對(duì)外界的訪問進(jìn)行過濾和改寫
用法:ES6提供的proxy構(gòu)建函數(shù)、用來生成proxy實(shí)例,var proxy = new proxy(targer, hanler)
target:是用于proxy包裝的被代理對(duì)象(可以是任何類型的對(duì)象,包括原生數(shù)組、函數(shù)甚至另一個(gè)代理)
handler:是一個(gè)對(duì)象,其聲明了代理target的一些操作,其屬性是當(dāng)執(zhí)行一個(gè)操作時(shí)定義代理的行為的函數(shù)

加分回答:
object.defineproperty的問題:在vue中,object.defineProperty無法監(jiān)控?cái)?shù)組下標(biāo)的變化,導(dǎo)致直接通過數(shù)組下標(biāo)給數(shù)組設(shè)置值,不能實(shí)時(shí)響應(yīng)。vue2里面是通過遞歸以及遍歷data對(duì)象來實(shí)現(xiàn)對(duì)數(shù)據(jù)的監(jiān)控,如果屬性值也是對(duì)象,那么需要深度遍歷,顯然如果能劫持整個(gè)對(duì)象,不管是對(duì)操作還是性能都會(huì)有很大提升
proxy的有點(diǎn),劫持整個(gè)對(duì)象,并返回一個(gè)新對(duì)象

?著作權(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)容