<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          某中型公司面試原題

          共 14983字,需瀏覽 30分鐘

           ·

          2022-03-09 17:29

          本文適合最近在考慮新機會的的小伙伴閱讀

          歡迎關(guān)注前端早茶,與廣東靚仔攜手共同進階~

          作者:廣東靚仔

          一、前言

          ?這套題目是某位群友親身經(jīng)歷過的,感謝小伙伴share~

          這套題目,考得比較實用也還挺全面,下面我們來看看具體的內(nèi)容。

          二、原題

          講講事件循環(huán)

          JavaScript 是一門單線程語言,異步操作都是放到事件循環(huán)隊列里面,等待主執(zhí)行棧來執(zhí)行的,并沒有專門的異步執(zhí)行線程。
          一、同步和異步

          所謂單線程,無非就是同步隊列和異步隊列,js代碼是自上向下執(zhí)行的,在主線程中立即執(zhí)行的就是同步任務(wù),比如簡單的邏輯操作及函數(shù),而異步任務(wù)不會立馬立馬執(zhí)行,會挪步放到到異步隊列中,比如ajax、promise、事件、計時器等等。

          也就是先執(zhí)行同步,主線程結(jié)束后再按照異步的順序再次執(zhí)行。

          二、事件循環(huán)(Event Loop)

          事件循環(huán)意思就是:等待主線程中任務(wù)全部完成后,再回來把異步隊列中任務(wù)放到主程序中運行,這樣反復(fù)的循環(huán)

          三、宏觀任務(wù)和微觀任務(wù)(先執(zhí)行微觀任務(wù),再執(zhí)行宏觀任務(wù)):

          在事件循環(huán)中,每進行一次循環(huán)操作稱為tick,tick 的任務(wù)處理模型是比較復(fù)雜的,里邊有兩個詞:分別是 Macro Task (宏任務(wù))和 Micro Task(微任務(wù))。

          簡單來說:
          宏觀任務(wù)主要包含:setTimeout、setInterval、script(整體代碼)、I/O、UI 交互事件、setImmediate(Node.js 環(huán)境)
          微觀任務(wù)主要包括:Promise、MutaionObserver、process.nextTick(Node.js 環(huán)境)
          規(guī)范:先執(zhí)行微觀任務(wù),再執(zhí)行宏觀任務(wù)
          (microtask 優(yōu)先于 task 執(zhí)行,所以如果有需要優(yōu)先執(zhí)行的邏輯,放入microtask 隊列會比 task 更早的被執(zhí)行。)

          事件委托

          事件冒泡:
          JS中當(dāng)出發(fā)某些具有冒泡性質(zhì)的事件是,首先在觸發(fā)元素尋找是否有相應(yīng)的注冊事件,如果沒有再繼續(xù)向上級父元素尋找是否有相應(yīng)的注冊事件作出相應(yīng),這就是事件冒泡。
          事件委托:
          利用事件冒泡的特性,將本應(yīng)該注冊在子元素上的處理事件注冊在父元素上,這樣點擊子元素時發(fā)現(xiàn)其本身沒有相應(yīng)事件就到父元素上尋找作出相應(yīng)。
          這樣做的優(yōu)勢有:
          1.減少DOM操作,提高性能。
          2.隨時可以添加子元素,添加的子元素會自動有相應(yīng)的處理事件。
          適合用事件委托的事件:click,mousedown,mouseup,keydown,keyup,keypress。
          Tips: mouseover和mouseout雖然也有事件冒泡,但是處理它們的時候需要特別的注意,因為需要經(jīng)常計算它們的位置,處理起來不太容易。

          sass和less的區(qū)別

          共同點:

          sass和less都是css的預(yù)編譯處理語言,他們引入了mixins,參數(shù),嵌套規(guī)則,運算,顏色,名字空間,作用域,JavaScript賦值等 加快了css開發(fā)效率,

          當(dāng)然這兩者都可以配合gulp和grunt等前端構(gòu)建工具使用

          主要區(qū)別:
          1.編譯環(huán)境不一樣:

          sass的安裝需要Ruby環(huán)境的,是在服務(wù)端上處理的,而Less是需要引入less.js來處理Less代碼輸出css到瀏覽器,也可以在開發(fā)環(huán)節(jié)使用Less,然后編譯成css文件,直接放到項目中。

          2.變量符不一樣:

          Less是@,而Scss是$

          3.輸出設(shè)置

          Sass提供4中輸出選項:nested, compact, compressed 和 expanded.

          4.Sass支持條件語句,可以使用if{}else{},for{}循環(huán)等等。而Less不支持。
          5. 引用外部CSS文件

          scss引用的外部文件命名必須以開頭, 文件名如果以下劃線開頭的話,Sass會認為該文件是一個引用文件,不會將其編譯為css文件.

          6.Sass和Less的工具庫不同

          Sass有工具庫Compass

          Less有UI組件庫Bootstrap

          http的狀態(tài)碼、http緩存

          狀態(tài)碼分為5類:

          狀態(tài)碼分為5類:
          1**信息,服務(wù)器收到請求,需要請求者繼續(xù)執(zhí)行操作
          2**成功,操作被成功接收并處理
          3**重定向,需要進一步的操作以完成請求
          4**客戶端錯誤,請求包含語法錯誤或無法完成請求
          5**服務(wù)器錯誤,服務(wù)器在處理請求的過程中發(fā)生了錯誤

          301:

          (永久移動)請求的網(wǎng)頁已被永久移動到新位置。服務(wù)器返回此響應(yīng)(作為對GET或HEAD請求的響應(yīng))時,會自動將請求者轉(zhuǎn)到新位置。

          302:

          (臨時移動)服務(wù)器目前正從不同位置的網(wǎng)頁響應(yīng)請求,但請求者應(yīng)繼續(xù)使用原有位置來進行以后的請求。此代碼與響應(yīng)GET和HEAD請求的301代碼類似,會自動將請求者轉(zhuǎn)到不同的位置。

          304:

          響應(yīng)禁止包含消息體,如果客戶端發(fā)送了一個帶條件的 GET 請求且該請求已被允許,而文檔的內(nèi)容(自上次訪問以來或者根據(jù)請求的條件)并沒有改變,則服務(wù)器應(yīng)當(dāng)返回這個狀態(tài)碼。

          305:被請求的資源必須通過指定的代理才能被訪問。

          400:

          語義有誤,當(dāng)前請求無法被服務(wù)器理解。除非進行修改,否則客戶端不應(yīng)該重復(fù)提交這個請求,或者請求參數(shù)有誤。

          403:服務(wù)器已經(jīng)理解請求,但是拒絕執(zhí)行它。

          404:請求失敗,請求所希望得到的資源未被在服務(wù)器上發(fā)現(xiàn)。

          500:

          服務(wù)器遇到了一個未曾預(yù)料的狀況,導(dǎo)致了它無法完成對請求的處理。一般來說,這個問題都會在服務(wù)器端的源代碼出現(xiàn)錯誤時出現(xiàn)。


          http緩存請求相應(yīng)頭:

          1.Cache-Control
          請求/響應(yīng)頭,緩存控制字段,可以說是控制http緩存的最高指令,要不要緩存也是它說了算。
          它有以下常用值
            1.1 no-store:所有內(nèi)容都不緩存
            1.2 no-cache:緩存,但是瀏覽器使用緩存前,都會請求服務(wù)器判斷緩存資源是否是最新,它是個比較高貴的存在,因為它只用不過期的緩存。
            1.3 ?max-age=x(單位秒) 請求緩存后的X秒不再發(fā)起請求,屬于http1.1屬性,與下方Expires(http1.0屬性)類似,但優(yōu)先級要比Expires高。
            1.4 s-maxage=x(單位秒) 代理服務(wù)器請求源站緩存后的X秒不再發(fā)起請求,只對CDN緩存有效(這個在后面會細說)
            1.5 public 客戶端和代理服務(wù)器(CDN)都可緩存
            1.6 private 只有客戶端可以緩存
          2.Expires 響應(yīng)頭,代表資源過期時間,由服務(wù)器返回提供,GMT格式日期,是http1.0的屬性,在與max-age(http1.1)共存的情況下,優(yōu)先級要低。
          3.Last-Modified 響應(yīng)頭,資源最新修改時間,由服務(wù)器告訴瀏覽器。
          4.if-Modified-Since 請求頭,資源最新修改時間,由瀏覽器告訴服務(wù)器(其實就是上次服務(wù)器給的Last-Modified,請求又還給服務(wù)器對比),和Last-Modified是一對,它兩會進行對比。
          5.Etag 響應(yīng)頭,資源標(biāo)識,由服務(wù)器告訴瀏覽器。
          6.if-None-Match 請求頭,緩存資源標(biāo)識,由瀏覽器告訴服務(wù)器(其實就是上次服務(wù)器給的Etag),和Etag是一對,它兩會進行對比。


          http緩存方案

          1.md5/hash緩存

          不推薦緩存html文件,這樣每次html加載渲染都可以感知文件變化,反正文件沒變還是使用本地緩存,文件名都變了說明修改過,重新請求緩存就好了。

          2.CDN緩存(作為了解)
          1.CDN通過分流的形式,大大減輕源站的訪問壓力。
          2.CDN也解決了跨地區(qū)訪問問題,根本上為訪問提供了加速。

          強緩存與協(xié)商性緩存(弱緩存)

          了解了上面不同瀏覽器行為對http緩存的不同影響,理解強緩存與協(xié)商性緩存就很容易了。

          強緩存:

          不發(fā)起http請求,直接使用本地緩存,比如瀏覽器地址欄回車,使用瀏覽器的刷新按鈕,在Expires或max-age生效的情況下,觸發(fā)的都是強緩存。

          協(xié)商性緩存(弱緩存):

          在使用本地緩存前,先與服務(wù)器協(xié)商,核對緩存文件是否為最新。比如設(shè)置了cache-control=no-cache,不管你做任何操作,都會發(fā)起請求,這一類就是協(xié)商性緩存了。

          css盒模型

          1. 基本概念:
          ? ? 標(biāo)準模型和IE模型
          /*?標(biāo)準模型?*/
          box-sizing:content-box;

          ?/*IE模型*/
          box-sizing:border-box;
          根據(jù)盒模型解釋邊距重疊:父元素沒有設(shè)置margin-top,而子元素設(shè)置了margin-top:20px;可以看出,父元素也一起有了邊距。

          BFC(邊距重疊解決方案)

          BFC(block formatting context)塊級格式化上下文

          BFC原理:

          (1). 內(nèi)部的box會在垂直方向上,一個接一個地放

          (2). 每個元素的margin box的左邊,與包含塊border box的左邊相接觸(對于從做往右的格式化,否則相反)

          (3). box垂直方向的距離由margin決定,屬于同一個bfc的兩個相鄰box的margin會發(fā)生重疊

          (4). bfc的區(qū)域不會與浮動區(qū)域的box重疊

          (5). bfc是一個頁面上的獨立的容器,外面的元素不會影響bfc里的元素,反過來,里面的也不會影響外面的

          (6). 計算bfc高度的時候,浮動元素也會參與計算

          創(chuàng)建方式:

          1. 脫離文檔流(float不為none時)

          2.position為absolute或fixed

          3. display 為inline-block、table-cell、table-caption、flex、inline-flex。

          4. overflow不為visible

          5. 根元素。

          應(yīng)用場景:

          1. 自適應(yīng)兩欄布局

          2. 清除內(nèi)部浮動

          3. 防止垂直margin重疊

          小程序分包機制

          離線包機制

          微信小程序采用的是類似離線包加載方案,用戶第一次打開時會先下載好所有代碼,然后再加載頁面;當(dāng)用戶再次進入時,會直接使用已下載的代碼,省去了代碼下載的過程,打開速度更快。

          存在問題:

          第一次打開小程序時白屏?xí)r間很長,因為要先下載好所有的代碼,代碼越多,白屏?xí)r間越長

          代碼有部分更新時,沒辦法進行增量更新,每次發(fā)版用戶都需要重新下載全部代碼
          分包加載

          離線包和M頁的一種結(jié)合機制,即把代碼劃分成主包+N個分包

          打開小程序,默認先加載主包
          進入分包頁面時,再加載對應(yīng)分包
          好處:進入主包頁面時,需要下載的代碼量小了很多,白屏?xí)r間更短,體驗更佳

          目錄

          ├──?app.js
          ├──?app.json
          ├──?app.wxss
          ├──?packageA
          │???└──?pages
          │???????├──?cat
          │???????└──?dog
          ├──?packageB
          │???└──?pages
          │???????├──?apple
          │???????└──?banana
          ├──?pages
          │???├──?index
          │???└──?logs
          └──?utils

          ?

          app.json?

          subpackages 字段聲明項目分包結(jié)構(gòu):

          {
          ??"pages":[
          ????"pages/index",
          ????"pages/logs"
          ??],
          "subpackages":?[
          ??{
          ????"root":?"packageA",
          ????"pages":?[
          ??????"pages/cat",
          ??????"pages/dog"
          ????]
          ??},?{
          ????"root":?"packageB",
          ????"name":?"pack2",
          ????"pages":?[
          ??????"pages/apple",
          ??????"pages/banana"
          ????]
          ??}
          ??]
          }

          subpackages 中,每個分包的配置有以下幾項:

          字段類型說明rootString分包根目錄nameString分包別名,分包預(yù)下載時可以使用pagesStringArray分包頁面路徑,相對與分包根目錄independentBoolean分包是否是獨立分包


          打包原則

          聲明 subpackages 后,將按 subpackages 配置路徑進行打包,subpackages 配置路徑外的目錄將被打包到 app(主包) 中

          app(主包)也可以有自己的 pages(即最外層的 pages 字段)

          subpackage 的根目錄不能是另外一個 subpackage 內(nèi)的子目錄

          tabBar 頁面必須在 app(主包)內(nèi)

          引用原則

          packageA 無法 require packageB JS 文件,但可以 require app、自己 package 內(nèi)的 JS 文件

          packageA 無法 import packageB 的 template,但可以 require app、自己 package 內(nèi)的 template

          packageA 無法使用 packageB 的資源,但可以使用 app、自己 package 內(nèi)的資源

          js的基本數(shù)據(jù)類型和引用類型

          值類型(基本類型):
          字符串(String)、數(shù)字(Number)、布爾(Boolean)、對空(Null)、未定義(Undefined)、Symbol。

          引用數(shù)據(jù)類型:
          對象(Object)、數(shù)組(Array)、函數(shù)(Function)。

          說說js緩存

          緩存的好處:

          (1).當(dāng)頁面渲染的數(shù)據(jù)過多時,為了減輕對內(nèi)存的占用,對初次接收且會用到的數(shù)據(jù)進行本地緩存,是有著大好處的.
          (2).受網(wǎng)速等各種因素的影響,當(dāng)渲染數(shù)據(jù)過多時,若存在頻繁的切換頁面,用戶體驗效果不佳。

          本地存儲

          storage來對數(shù)據(jù)進行存儲(sessionStorage、localStorage)

          sessionStorage

          臨時的會話存儲,只要當(dāng)前的會話窗口未關(guān)閉,存儲的信息就不會丟失,即便刷新了頁面或者在編輯器中更改了代碼,存儲的會話信息也不會丟失。

          localStorage

          不主動去清除,會一直將數(shù)據(jù)存儲在客戶端的儲存方式,即使關(guān)閉了瀏覽器,下次打開的時候仍然可以看到之前存儲的未主動清除的數(shù)據(jù)(即便是
          殺毒軟件或者瀏覽器自帶的清除功能,也不能將localStorage存儲的數(shù)據(jù)清除掉)
          storage存儲的數(shù)據(jù)只能是字符串類型,其他類型的數(shù)據(jù)需做類型轉(zhuǎn)換
          storage直接屬于頂層對象window.

          cookie

          cookie屬于較老且最常見用的最多的技術(shù)了,cookie的優(yōu)點很多,用起來也比較方便
          cookie缺陷:4kb,cookie本地存儲的數(shù)據(jù)會被發(fā)送到服務(wù)器

          cookie和storage的區(qū)別

          1.cookie兼容所有的瀏覽器(本地cookie谷歌不支持),storage不支持IE6~8;
          2.二者對存儲的內(nèi)容均有大小限制,前者同源情況寫一般不能存儲4kb的內(nèi)容,后者同源一般能存儲只能存儲5MB的數(shù)據(jù)
          3.cookie有過期時間,localStorage是永久存儲(如果你不手動去刪除的話)
          4.一些瀏覽器處于安全的角度可能會禁用cookie,但無法禁用localStorage

          jquery的ajax實現(xiàn)原理

          1.jQuery底層在實現(xiàn)ajax功能時,調(diào)用了瀏覽器中的XMLHttpRequest對象,在最新的2.0版本后,由于不考慮IE瀏覽器的支持,直接使用該對象獲取用戶請求的數(shù)據(jù),包括地址和參數(shù)等。
          2.它將對象打開請求地址時的相關(guān)參數(shù)封裝在相關(guān)函數(shù)如ajax()的配置項中,一旦傳入了必需選項,則直接調(diào)用相應(yīng)的send()方法進行數(shù)據(jù)的請求。
          3.jQuery底層將對象請求后返回的數(shù)據(jù)結(jié)果,直接封裝到相關(guān)函數(shù)的success方法中,所以,一旦異步請求成功,返回的數(shù)據(jù)對象直接注入到方法中,因此,可以調(diào)用success方法獲取服務(wù)端返回的數(shù)據(jù)。
          拓展:

          1、ajax和jsonp這兩種技術(shù)在調(diào)用方式上“看起來”很像,目的也一樣,都是請求一個url,然后把服務(wù)器返回的數(shù)據(jù)進行處理,因此jquery和ext等框架都把jsonp作為ajax的一種形式進行了封裝;

            2、ajax和jsonp其實本質(zhì)上是不同的東西。ajax的核心是通過XmlHttpRequest獲取非本頁內(nèi)容,而jsonp的核心則是通過HTTP來動態(tài)添加
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                    <th id="afajh"><progress id="afajh"></progress></th>
                    亚洲综合五月天婷婷丁香2 | 日韩mv国产视频 | 久久中文综合网 | 麻豆三级av | 特级特黄A片一级一片 |