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