公司郵箱價(jià)格免費(fèi)的seo
1.如何理解this?
this表示的是函數(shù)運(yùn)行時(shí)自動(dòng)生成的一個(gè)內(nèi)部對(duì)象,只能在函數(shù)內(nèi)部使用,總是指向調(diào)用它的對(duì)象。
this是在運(yùn)行時(shí)進(jìn)行綁定的,并不是在編寫的時(shí)候綁定,它的上下文取決于函數(shù)調(diào)用時(shí)的各種條件。this的綁定和函數(shù)聲明的位置沒有任何關(guān)系,只取決于函數(shù)的調(diào)用方式。
2.瀏覽器的多進(jìn)程和javaScript的單線程
一個(gè)進(jìn)程是由一個(gè)或者多個(gè)線程組成的,線程是一個(gè)進(jìn)程中代碼的不同執(zhí)行路線。一個(gè)進(jìn)程的內(nèi)存空間是共享的,所有的線程都能夠訪問這些內(nèi)存。打開一個(gè)tab頁,其實(shí)就是創(chuàng)建了一個(gè)進(jìn)程,一個(gè)進(jìn)程可以有多個(gè)線程,比如JS引擎線程、GUI渲染線程、HTTP請(qǐng)求線程、定時(shí)器觸發(fā)線程、事件觸發(fā)線程等。當(dāng)發(fā)起一個(gè)請(qǐng)求的時(shí)候,其實(shí)就是創(chuàng)建了一個(gè)線程。當(dāng)請(qǐng)求結(jié)束時(shí),線程可能就會(huì)銷毀。
JavaScript的單進(jìn)程與它的用途有關(guān),作為瀏覽器的腳本語言,javaScript主要是和用戶互動(dòng),以及操作DOM。如果有兩個(gè)線程同時(shí)操作DOM的話。會(huì)帶來很復(fù)雜的同步問題。
3.事件循環(huán)
事件循環(huán)的異步隊(duì)列有兩種:一種是宏任務(wù),一種是微任務(wù)。宏任務(wù)隊(duì)列可以有多個(gè),微任務(wù)隊(duì)列只有一個(gè)。
所有的同步任務(wù)都在主線程上執(zhí)行,形成“執(zhí)行?!?。首先主線程會(huì)去執(zhí)行所有的同步任務(wù),等所有的同步任務(wù)執(zhí)行完,會(huì)查看任務(wù)隊(duì)列里面的異步任務(wù)。如果滿足條件,那么就重新進(jìn)入主線程開始執(zhí)行,這時(shí)它就變成了同步任務(wù)。等它執(zhí)行完后,下一個(gè)異步任務(wù)會(huì)進(jìn)入到主線程開始執(zhí)行。直到所有的任務(wù)執(zhí)行結(jié)束。
第一次事件循環(huán)中,js引擎會(huì)把整個(gè)script代碼當(dāng)成一個(gè)宏任務(wù)執(zhí)行。執(zhí)行完成之后,會(huì)查看任務(wù)中是否存在微任務(wù),如果有微任務(wù),那么會(huì)依次從微任務(wù)的隊(duì)列中將讀取執(zhí)行完所有的微任務(wù)。執(zhí)行完微任務(wù)之后,js引擎會(huì)繼續(xù)查看宏任務(wù)隊(duì)列中的任務(wù),依次執(zhí)行。再執(zhí)行微任務(wù)隊(duì)列。如此循環(huán)。
4.hash路由和history路由
hash(#)是URL的錨點(diǎn),代表網(wǎng)頁中的一個(gè)位置,單是改變hash(#)后面的部分,只會(huì)滾動(dòng)到網(wǎng)頁響應(yīng)的位置,并不會(huì)重新刷新頁面。也就是說hash出現(xiàn)在URL中,但不會(huì)被包含在http請(qǐng)求中。因此改變hash不會(huì)重新加載頁面。同時(shí)每一次更改#后面的部分就會(huì)在瀏覽器的歷史記錄中添加一條數(shù)據(jù),使用瀏覽器的后退按鈕就能返回到上一個(gè)位置。hash模式通過錨點(diǎn)值的改變,根據(jù)不同的值,渲染指定DOM位置的不同數(shù)據(jù)。
監(jiān)聽hash的改變通過==》hashchange()
histoy模式利用了h5中history interface新增的pushState()和replaceState(),提供了對(duì)瀏覽器記錄棧修改的功能,當(dāng)它們執(zhí)行修改時(shí),雖然會(huì)改變URL,但是不會(huì)立即向后端發(fā)送請(qǐng)求。這種情況需要后臺(tái)配置支持。我們的頁面時(shí)SPA,如果后臺(tái)沒有相應(yīng)的配置,用戶直接訪問其中一個(gè)頁面的時(shí)候就會(huì)404。在服務(wù)端增加一個(gè)覆蓋所有資源的默認(rèn)情況。URL如果匹配不到相應(yīng)的資源,那么返回一個(gè)index.html頁面。這個(gè)頁面就是app依賴的頁面。
5.深拷貝和淺拷貝的區(qū)別?
淺拷貝是拷貝一層。屬性為對(duì)象時(shí),那么淺拷貝是復(fù)制,兩個(gè)對(duì)象會(huì)指向同一個(gè)地址。
深拷貝是遞歸拷貝深層次,屬性為對(duì)象時(shí),深拷貝是新開棧,兩個(gè)對(duì)象指向的是不同地址。
如何實(shí)現(xiàn)淺拷貝
(1)Object.assign
(2)ES6的擴(kuò)展運(yùn)算符
(3)slice()
(4)concat()
如何實(shí)現(xiàn)深拷貝
(1)通過遞歸的方式實(shí)現(xiàn)
6.如何將類數(shù)組轉(zhuǎn)換成數(shù)組?
Array.from()
Array.apply(null, array)
Array.prototype.concat.apply([], array)
7.如何剪裁圖片(選擇頭像)
https://q.shanyue.tech/fe/js/231.html
8.bind 與 call/apply 的區(qū)別是什么
他們都是綁定 this 的,但是bind
?返回函數(shù),call/apply
?直接執(zhí)行函數(shù)