2022秋招前端面試題(五)(附答案)

實(shí)現(xiàn)一個(gè)扇形

用CSS實(shí)現(xiàn)扇形的思路和三角形基本一致规婆,就是多了一個(gè)圓角的樣式眉孩,實(shí)現(xiàn)一個(gè)90°的扇形:

div{
    border: 100px solid transparent;
    width: 0;
    heigt: 0;
    border-radius: 100px;
    border-top-color: red;
}
復(fù)制代碼

數(shù)組有哪些原生方法凑术?

  • 數(shù)組和字符串的轉(zhuǎn)換方法:toString()宾添、toLocalString()、join() 其中 join() 方法可以指定轉(zhuǎn)換為字符串時(shí)的分隔符堪澎。
  • 數(shù)組尾部操作的方法 pop() 和 push()擂错,push 方法可以傳入多個(gè)參數(shù)味滞。
  • 數(shù)組首部操作的方法 shift() 和 unshift() 重排序的方法 reverse() 和 sort()樱蛤,sort() 方法可以傳入一個(gè)函數(shù)來進(jìn)行比較,傳入前后兩個(gè)值剑鞍,如果返回值為正數(shù)昨凡,則交換兩個(gè)參數(shù)的位置。
  • 數(shù)組連接的方法 concat() 蚁署,返回的是拼接好的數(shù)組便脊,不影響原數(shù)組。
  • 數(shù)組截取辦法 slice()光戈,用于截取數(shù)組中的一部分返回哪痰,不影響原數(shù)組遂赠。
  • 數(shù)組插入方法 splice(),影響原數(shù)組查找特定項(xiàng)的索引的方法晌杰,indexOf() 和 lastIndexOf() 迭代方法 every()跷睦、some()、filter()肋演、map() 和 forEach() 方法
  • 數(shù)組歸并方法 reduce() 和 reduceRight() 方法

HTTP和HTTPS協(xié)議的區(qū)別

HTTP和HTTPS協(xié)議的主要區(qū)別如下:

  • HTTPS協(xié)議需要CA證書抑诸,費(fèi)用較高;而HTTP協(xié)議不需要爹殊;
  • HTTP協(xié)議是超文本傳輸協(xié)議蜕乡,信息是明文傳輸?shù)模琀TTPS則是具有安全性的SSL加密傳輸協(xié)議梗夸;
  • 使用不同的連接方式层玲,端口也不同,HTTP協(xié)議端口是80绒瘦,HTTPS協(xié)議端口是443称簿;
  • HTTP協(xié)議連接很簡單,是無狀態(tài)的惰帽;HTTPS協(xié)議是有SSL和HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸憨降、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比HTTP更加安全该酗。

DNS 協(xié)議是什么

概念: DNS 是域名系統(tǒng) (Domain Name System) 的縮寫授药,提供的是一種主機(jī)名到 IP 地址的轉(zhuǎn)換服務(wù),就是我們常說的域名系統(tǒng)呜魄。它是一個(gè)由分層的 DNS 服務(wù)器組成的分布式數(shù)據(jù)庫悔叽,是定義了主機(jī)如何查詢這個(gè)分布式數(shù)據(jù)庫的方式的應(yīng)用層協(xié)議。能夠使人更方便的訪問互聯(lián)網(wǎng)爵嗅,而不用去記住能夠被機(jī)器直接讀取的IP數(shù)串娇澎。

作用: 將域名解析為IP地址,客戶端向DNS服務(wù)器(DNS服務(wù)器有自己的IP地址)發(fā)送域名查詢請(qǐng)求睹晒,DNS服務(wù)器告知客戶機(jī)Web服務(wù)器的 IP 地址趟庄。

HTTPS是如何保證安全的?

先理解兩個(gè)概念:

  • 對(duì)稱加密:即通信的雙?都使?同?個(gè)秘鑰進(jìn)?加解密伪很,對(duì)稱加密雖然很簡單性能也好戚啥,但是?法解決?次把秘鑰發(fā)給對(duì)?的問題,很容易被?客攔截秘鑰锉试。
  • ?對(duì)稱加密:
  1. 私鑰 + 公鑰= 密鑰對(duì)
  2. 即?私鑰加密的數(shù)據(jù),只有對(duì)應(yīng)的公鑰才能解密,?公鑰加密的數(shù)據(jù),只有對(duì)應(yīng)的私鑰才能解密
  3. 因?yàn)橥ㄐ烹p?的??都有?套??的密鑰對(duì),通信之前雙?會(huì)先把??的公鑰都先發(fā)給對(duì)?
  4. 然后對(duì)?再拿著這個(gè)公鑰來加密數(shù)據(jù)響應(yīng)給對(duì)?,等到到了對(duì)?那?,對(duì)?再???的私鑰進(jìn)?解密

?對(duì)稱加密雖然安全性更?猫十,但是帶來的問題就是速度很慢,影響性能。

解決?案:

結(jié)合兩種加密?式拖云,將對(duì)稱加密的密鑰使??對(duì)稱加密的公鑰進(jìn)?加密贷笛,然后發(fā)送出去,接收?使?私鑰進(jìn)?解密得到對(duì)稱加密的密鑰宙项,然后雙?可以使?對(duì)稱加密來進(jìn)?溝通昨忆。

此時(shí)?帶來?個(gè)問題,中間?問題:
如果此時(shí)在客戶端和服務(wù)器之間存在?個(gè)中間?,這個(gè)中間?只需要把原本雙?通信互發(fā)的公鑰,換成??的公鑰,這樣中間?就可以輕松解密通信雙?所發(fā)送的所有數(shù)據(jù)杉允。

所以這個(gè)時(shí)候需要?個(gè)安全的第三?頒發(fā)證書(CA)邑贴,證明身份的身份,防?被中間?攻擊叔磷。 證書中包括:簽發(fā)者拢驾、證書?途、使?者公鑰改基、使?者私鑰繁疤、使?者的HASH算法、證書到期時(shí)間等秕狰。

但是問題來了稠腊,如果中間?篡改了證書,那么身份證明是不是就?效了鸣哀?這個(gè)證明就?買了架忌,這個(gè)時(shí)候需要?個(gè)新的技術(shù),數(shù)字簽名我衬。

數(shù)字簽名就是?CA?帶的HASH算法對(duì)證書的內(nèi)容進(jìn)?HASH得到?個(gè)摘要叹放,再?CA的私鑰加密,最終組成數(shù)字簽名挠羔。當(dāng)別?把他的證書發(fā)過來的時(shí)候,我再?同樣的Hash算法,再次?成消息摘要井仰,然后?CA的公鑰對(duì)數(shù)字簽名解密,得到CA創(chuàng)建的消息摘要,兩者??,就知道中間有沒有被?篡改了。這個(gè)時(shí)候就能最?程度保證通信的安全了破加。

DNS完整的查詢過程

DNS服務(wù)器解析域名的過程:

  • 首先會(huì)在瀏覽器的緩存中查找對(duì)應(yīng)的IP地址俱恶,如果查找到直接返回,若找不到繼續(xù)下一步
  • 將請(qǐng)求發(fā)送給本地DNS服務(wù)器范舀,在本地域名服務(wù)器緩存中查詢合是,如果查找到诗茎,就直接將查找結(jié)果返回兰伤,若找不到繼續(xù)下一步
  • 本地DNS服務(wù)器向根域名服務(wù)器發(fā)送請(qǐng)求,根域名服務(wù)器會(huì)返回一個(gè)所查詢域的頂級(jí)域名服務(wù)器地址
  • 本地DNS服務(wù)器向頂級(jí)域名服務(wù)器發(fā)送請(qǐng)求,接受請(qǐng)求的服務(wù)器查詢自己的緩存田藐,如果有記錄,就返回查詢結(jié)果,如果沒有就返回相關(guān)的下一級(jí)的權(quán)威域名服務(wù)器的地址
  • 本地DNS服務(wù)器向權(quán)威域名服務(wù)器發(fā)送請(qǐng)求汽久,域名服務(wù)器返回對(duì)應(yīng)的結(jié)果
  • 本地DNS服務(wù)器將返回結(jié)果保存在緩存中鹤竭,便于下次使用
  • 本地DNS服務(wù)器將返回結(jié)果返回給瀏覽器

比如要查詢 IP 地址,首先會(huì)在瀏覽器的緩存中查找是否有該域名的緩存景醇,如果不存在就將請(qǐng)求發(fā)送到本地的 DNS 服務(wù)器中臀稚,本地DNS服務(wù)器會(huì)判斷是否存在該域名的緩存,如果不存在三痰,則向根域名服務(wù)器發(fā)送一個(gè)請(qǐng)求吧寺,根域名服務(wù)器返回負(fù)責(zé) .com 的頂級(jí)域名服務(wù)器的 IP 地址的列表。然后本地 DNS 服務(wù)器再向其中一個(gè)負(fù)責(zé) .com 的頂級(jí)域名服務(wù)器發(fā)送一個(gè)請(qǐng)求散劫,負(fù)責(zé) .com 的頂級(jí)域名服務(wù)器返回負(fù)責(zé) .baidu 的權(quán)威域名服務(wù)器的 IP 地址列表稚机。然后本地 DNS 服務(wù)器再向其中一個(gè)權(quán)威域名服務(wù)器發(fā)送一個(gè)請(qǐng)求,最后權(quán)威域名服務(wù)器返回一個(gè)對(duì)應(yīng)的主機(jī)名的 IP 地址列表获搏。

HTTP協(xié)議的優(yōu)點(diǎn)和缺點(diǎn)

HTTP 是超文本傳輸協(xié)議赖条,它定義了客戶端和服務(wù)器之間交換報(bào)文的格式和方式,默認(rèn)使用 80 端口常熙。它使用 TCP 作為傳輸層協(xié)議纬乍,保證了數(shù)據(jù)傳輸?shù)目煽啃浴?/p>

HTTP協(xié)議具有以下優(yōu)點(diǎn)

  • 支持客戶端/服務(wù)器模式
  • 簡單快速:客戶向服務(wù)器請(qǐng)求服務(wù)時(shí),只需傳送請(qǐng)求方法和路徑裸卫。由于 HTTP 協(xié)議簡單仿贬,使得 HTTP 服務(wù)器的程序規(guī)模小,因而通信速度很快墓贿。
  • 無連接:無連接就是限制每次連接只處理一個(gè)請(qǐng)求诅蝶。服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后募壕,即斷開連接调炬,采用這種方式可以節(jié)省傳輸時(shí)間。
  • 無狀態(tài):HTTP 協(xié)議是無狀態(tài)協(xié)議舱馅,這里的狀態(tài)是指通信過程的上下文信息缰泡。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳代嗤,這樣可能會(huì)導(dǎo)致每次連接傳送的數(shù)據(jù)量增大棘钞。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就比較快干毅。
  • 靈活:HTTP 允許傳輸任意類型的數(shù)據(jù)對(duì)象宜猜。正在傳輸?shù)念愋陀?Content-Type 加以標(biāo)記。

HTTP協(xié)議具有以下缺點(diǎn)

  • 無狀態(tài): HTTP 是一個(gè)無狀態(tài)的協(xié)議硝逢,HTTP 服務(wù)器不會(huì)保存關(guān)于客戶的任何信息姨拥。
  • 明文傳輸: 協(xié)議中的報(bào)文使用的是文本形式绅喉,這就直接暴露給外界,不安全叫乌。
  • 不安全

(1)通信使用明文(不加密)柴罐,內(nèi)容可能會(huì)被竊聽;
(2)不驗(yàn)證通信方的身份憨奸,因此有可能遭遇偽裝革屠;
(3)無法證明報(bào)文的完整性,所以有可能已遭篡改排宰;

ajax似芝、axios、fetch的區(qū)別

(1)AJAX Ajax 即“AsynchronousJavascriptAndXML”(異步 JavaScript 和 XML)板甘,是指一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù)国觉。它是一種在無需重新加載整個(gè)網(wǎng)頁的情況下,能夠更新部分網(wǎng)頁的技術(shù)虾啦。通過在后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換麻诀,Ajax 可以使網(wǎng)頁實(shí)現(xiàn)異步更新。這意味著可以在不重新加載整個(gè)網(wǎng)頁的情況下傲醉,對(duì)網(wǎng)頁的某部分進(jìn)行更新蝇闭。傳統(tǒng)的網(wǎng)頁(不使用 Ajax)如果需要更新內(nèi)容,必須重載整個(gè)網(wǎng)頁頁面硬毕。其缺點(diǎn)如下:

  • 本身是針對(duì)MVC編程呻引,不符合前端MVVM的浪潮
  • 基于原生XHR開發(fā),XHR本身的架構(gòu)不清晰
  • 不符合關(guān)注分離(Separation of Concerns)的原則
  • 配置和調(diào)用方式非惩驴龋混亂逻悠,而且基于事件的異步模型不友好。

(2)Fetch fetch號(hào)稱是AJAX的替代品韭脊,是在ES6出現(xiàn)的童谒,使用了ES6中的promise對(duì)象。Fetch是基于promise設(shè)計(jì)的沪羔。Fetch的代碼結(jié)構(gòu)比起ajax簡單多饥伊。fetch不是ajax的進(jìn)一步封裝,而是原生js蔫饰,沒有使用XMLHttpRequest對(duì)象琅豆。

fetch的優(yōu)點(diǎn):

  • 語法簡潔,更加語義化
  • 基于標(biāo)準(zhǔn) Promise 實(shí)現(xiàn)篓吁,支持 async/await
  • 更加底層茫因,提供的API豐富(request, response)
  • 脫離了XHR,是ES規(guī)范里新的實(shí)現(xiàn)方式

fetch的缺點(diǎn):

  • fetch只對(duì)網(wǎng)絡(luò)請(qǐng)求報(bào)錯(cuò)杖剪,對(duì)400冻押,500都當(dāng)做成功的請(qǐng)求驰贷,服務(wù)器返回 400,500 錯(cuò)誤碼時(shí)并不會(huì) reject翼雀,只有網(wǎng)絡(luò)錯(cuò)誤這些導(dǎo)致請(qǐng)求不能完成時(shí),fetch 才會(huì)被 reject孩擂。
  • fetch默認(rèn)不會(huì)帶cookie狼渊,需要添加配置項(xiàng): fetch(url, {credentials: 'include'})
  • fetch不支持abort,不支持超時(shí)控制类垦,使用setTimeout及Promise.reject的實(shí)現(xiàn)的超時(shí)控制并不能阻止請(qǐng)求過程繼續(xù)在后臺(tái)運(yùn)行狈邑,造成了流量的浪費(fèi)
  • fetch沒有辦法原生監(jiān)測(cè)請(qǐng)求的進(jìn)度,而XHR可以

(3)Axios Axios 是一種基于Promise封裝的HTTP客戶端蚤认,其特點(diǎn)如下:

  • 瀏覽器端發(fā)起XMLHttpRequests請(qǐng)求
  • node端發(fā)起http請(qǐng)求
  • 支持Promise API
  • 監(jiān)聽請(qǐng)求和返回
  • 對(duì)請(qǐng)求和返回進(jìn)行轉(zhuǎn)化
  • 取消請(qǐng)求
  • 自動(dòng)轉(zhuǎn)換json數(shù)據(jù)
  • 客戶端支持抵御XSRF攻擊

HTTP狀態(tài)碼

狀態(tài)碼的類別:

類別 原因 描述
1xx Informational(信息性狀態(tài)碼) 接受的請(qǐng)求正在處理
2xx Success(成功狀態(tài)碼) 請(qǐng)求正常處理完畢
3xx Redirection(重定向狀態(tài)碼) 需要進(jìn)行附加操作一完成請(qǐng)求
4xx Client Error (客戶端錯(cuò)誤狀態(tài)碼) 服務(wù)器無法處理請(qǐng)求
5xx Server Error(服務(wù)器錯(cuò)誤狀態(tài)碼) 服務(wù)器處理請(qǐng)求出錯(cuò)

1. 2XX (Success 成功狀態(tài)碼)

狀態(tài)碼2XX表示請(qǐng)求被正常處理了米苹。

(1)200 OK

200 OK表示客戶端發(fā)來的請(qǐng)求被服務(wù)器端正常處理了。

(2)204 No Content

該狀態(tài)碼表示客戶端發(fā)送的請(qǐng)求已經(jīng)在服務(wù)器端正常處理了砰琢,但是沒有返回的內(nèi)容蘸嘶,響應(yīng)報(bào)文中不包含實(shí)體的主體部分。一般在只需要從客戶端往服務(wù)器端發(fā)送信息陪汽,而服務(wù)器端不需要往客戶端發(fā)送內(nèi)容時(shí)使用训唱。

(3)206 Partial Content

該狀態(tài)碼表示客戶端進(jìn)行了范圍請(qǐng)求,而服務(wù)器端執(zhí)行了這部分的 GET 請(qǐng)求挚冤。響應(yīng)報(bào)文中包含由 Content-Range 指定范圍的實(shí)體內(nèi)容况增。

2. 3XX (Redirection 重定向狀態(tài)碼)

3XX 響應(yīng)結(jié)果表明瀏覽器需要執(zhí)行某些特殊的處理以正確處理請(qǐng)求。

(1)301 Moved Permanently

永久重定向训挡。 該狀態(tài)碼表示請(qǐng)求的資源已經(jīng)被分配了新的 URI澳骤,以后應(yīng)使用資源指定的 URI。新的 URI 會(huì)在 HTTP 響應(yīng)頭中的 Location 首部字段指定澜薄。若用戶已經(jīng)把原來的URI保存為書簽为肮,此時(shí)會(huì)按照 Location 中新的URI重新保存該書簽。同時(shí)肤京,搜索引擎在抓取新內(nèi)容的同時(shí)也將舊的網(wǎng)址替換為重定向之后的網(wǎng)址弥锄。

使用場(chǎng)景:

  • 當(dāng)我們想換個(gè)域名,舊的域名不再使用時(shí)蟆沫,用戶訪問舊域名時(shí)用301就重定向到新的域名籽暇。其實(shí)也是告訴搜索引擎收錄的域名需要對(duì)新的域名進(jìn)行收錄。
  • 在搜索引擎的搜索結(jié)果中出現(xiàn)了不帶www的域名饭庞,而帶www的域名卻沒有收錄戒悠,這個(gè)時(shí)候可以用301重定向來告訴搜索引擎我們目標(biāo)的域名是哪一個(gè)。
(2)302 Found

臨時(shí)重定向舟山。 該狀態(tài)碼表示請(qǐng)求的資源被分配到了新的 URI绸狐,希望用戶(本次)能使用新的 URI 訪問資源卤恳。和 301 Moved Permanently 狀態(tài)碼相似,但是 302 代表的資源不是被永久重定向寒矿,只是臨時(shí)性質(zhì)的突琳。也就是說已移動(dòng)的資源對(duì)應(yīng)的 URI 將來還有可能發(fā)生改變。若用戶把 URI 保存成書簽符相,但不會(huì)像 301 狀態(tài)碼出現(xiàn)時(shí)那樣去更新書簽拆融,而是仍舊保留返回 302 狀態(tài)碼的頁面對(duì)應(yīng)的 URI。同時(shí)啊终,搜索引擎會(huì)抓取新的內(nèi)容而保留舊的網(wǎng)址镜豹。因?yàn)榉?wù)器返回302代碼,搜索引擎認(rèn)為新的網(wǎng)址只是暫時(shí)的蓝牲。

使用場(chǎng)景:

  • 當(dāng)我們?cè)谧龌顒?dòng)時(shí)趟脂,登錄到首頁自動(dòng)重定向,進(jìn)入活動(dòng)頁面例衍。
  • 未登陸的用戶訪問用戶中心重定向到登錄頁面昔期。
  • 訪問404頁面重新定向到首頁。
(3)303 See Other

該狀態(tài)碼表示由于請(qǐng)求對(duì)應(yīng)的資源存在著另一個(gè) URI佛玄,應(yīng)使用 GET 方法定向獲取請(qǐng)求的資源镇眷。
303 狀態(tài)碼和 302 Found 狀態(tài)碼有著相似的功能,但是 303 狀態(tài)碼明確表示客戶端應(yīng)當(dāng)采用 GET 方法獲取資源翎嫡。

303 狀態(tài)碼通常作為 PUT 或 POST 操作的返回結(jié)果欠动,它表示重定向鏈接指向的不是新上傳的資源,而是另外一個(gè)頁面惑申,比如消息確認(rèn)頁面或上傳進(jìn)度頁面具伍。而請(qǐng)求重定向頁面的方法要總是使用 GET。

注意:

  • 當(dāng) 301圈驼、302人芽、303 響應(yīng)狀態(tài)碼返回時(shí),幾乎所有的瀏覽器都會(huì)把 POST 改成GET绩脆,并刪除請(qǐng)求報(bào)文內(nèi)的主體萤厅,之后請(qǐng)求會(huì)再次自動(dòng)發(fā)送。
  • 301靴迫、302 標(biāo)準(zhǔn)是禁止將 POST 方法變成 GET方法的惕味,但實(shí)際大家都會(huì)這么做。
(4)304 Not Modified

瀏覽器緩存相關(guān)玉锌。 該狀態(tài)碼表示客戶端發(fā)送附帶條件的請(qǐng)求時(shí)名挥,服務(wù)器端允許請(qǐng)求訪問資源,但未滿足條件的情況主守。304 狀態(tài)碼返回時(shí)禀倔,不包含任何響應(yīng)的主體部分榄融。304 雖然被劃分在 3XX 類別中,但是和重定向沒有關(guān)系救湖。

帶條件的請(qǐng)求(Http 條件請(qǐng)求):使用 Get方法 請(qǐng)求愧杯,請(qǐng)求報(bào)文中包含(if-matchif-none-match鞋既、if-modified-since力九、if-unmodified-sinceif-range)中任意首部涛救。

狀態(tài)碼304并不是一種錯(cuò)誤畏邢,而是告訴客戶端有緩存业扒,直接使用緩存中的數(shù)據(jù)检吆。返回頁面的只有頭部信息,是沒有內(nèi)容部分的程储,這樣在一定程度上提高了網(wǎng)頁的性能蹭沛。

(5)307 Temporary Redirect

307表示臨時(shí)重定向。 該狀態(tài)碼與 302 Found 有著相同含義章鲤,盡管 302 標(biāo)準(zhǔn)禁止 POST 變成 GET摊灭,但是實(shí)際使用時(shí)還是這樣做了。

307 會(huì)遵守瀏覽器標(biāo)準(zhǔn)败徊,不會(huì)從 POST 變成 GET帚呼。但是對(duì)于處理請(qǐng)求的行為時(shí),不同瀏覽器還是會(huì)出現(xiàn)不同的情況皱蹦。規(guī)范要求瀏覽器繼續(xù)向 Location 的地址 POST 內(nèi)容煤杀。規(guī)范要求瀏覽器繼續(xù)向 Location 的地址 POST 內(nèi)容。

3. 4XX (Client Error 客戶端錯(cuò)誤狀態(tài)碼)

4XX 的響應(yīng)結(jié)果表明客戶端是發(fā)生錯(cuò)誤的原因所在沪哺。

(1)400 Bad Request

該狀態(tài)碼表示請(qǐng)求報(bào)文中存在語法錯(cuò)誤沈自。當(dāng)錯(cuò)誤發(fā)生時(shí),需修改請(qǐng)求的內(nèi)容后再次發(fā)送請(qǐng)求辜妓。另外枯途,瀏覽器會(huì)像 200 OK 一樣對(duì)待該狀態(tài)碼。

(2)401 Unauthorized

該狀態(tài)碼表示發(fā)送的請(qǐng)求需要有通過 HTTP 認(rèn)證(BASIC 認(rèn)證籍滴、DIGEST 認(rèn)證)的認(rèn)證信息酪夷。若之前已進(jìn)行過一次請(qǐng)求,則表示用戶認(rèn)證失敗

返回含有 401 的響應(yīng)必須包含一個(gè)適用于被請(qǐng)求資源的 WWW-Authenticate 首部用以質(zhì)詢(challenge)用戶信息孽惰。當(dāng)瀏覽器初次接收到 401 響應(yīng)捶索,會(huì)彈出認(rèn)證用的對(duì)話窗口。

以下情況會(huì)出現(xiàn)401:

  • 401.1 - 登錄失敗灰瞻。
  • 401.2 - 服務(wù)器配置導(dǎo)致登錄失敗腥例。
  • 401.3 - 由于 ACL 對(duì)資源的限制而未獲得授權(quán)辅甥。
  • 401.4 - 篩選器授權(quán)失敗。
  • 401.5 - ISAPI/CGI 應(yīng)用程序授權(quán)失敗燎竖。
  • 401.7 - 訪問被 Web 服務(wù)器上的 URL 授權(quán)策略拒絕璃弄。這個(gè)錯(cuò)誤代碼為 IIS 6.0 所專用。
(3)403 Forbidden

該狀態(tài)碼表明請(qǐng)求資源的訪問被服務(wù)器拒絕了构回,服務(wù)器端沒有必要給出詳細(xì)理由夏块,但是可以在響應(yīng)報(bào)文實(shí)體的主體中進(jìn)行說明。進(jìn)入該狀態(tài)后纤掸,不能再繼續(xù)進(jìn)行驗(yàn)證脐供。該訪問是永久禁止的,并且與應(yīng)用邏輯密切相關(guān)借跪。

IIS 定義了許多不同的 403 錯(cuò)誤政己,它們指明更為具體的錯(cuò)誤原因:

  • 403.1 - 執(zhí)行訪問被禁止。
  • 403.2 - 讀訪問被禁止掏愁。
  • 403.3 - 寫訪問被禁止歇由。
  • 403.4 - 要求 SSL。
  • 403.5 - 要求 SSL 128果港。
  • 403.6 - IP 地址被拒絕沦泌。
  • 403.7 - 要求客戶端證書。
  • 403.8 - 站點(diǎn)訪問被拒絕辛掠。
  • 403.9 - 用戶數(shù)過多谢谦。
  • 403.10 - 配置無效。
  • 403.11 - 密碼更改萝衩。
  • 403.12 - 拒絕訪問映射表回挽。
  • 403.13 - 客戶端證書被吊銷。
  • 403.14 - 拒絕目錄列表欠气。
  • 403.15 - 超出客戶端訪問許可厅各。
  • 403.16 - 客戶端證書不受信任或無效。
  • 403.17 - 客戶端證書已過期或尚未生效
  • 403.18 - 在當(dāng)前的應(yīng)用程序池中不能執(zhí)行所請(qǐng)求的 URL预柒。這個(gè)錯(cuò)誤代碼為 IIS 6.0 所專用队塘。
  • 403.19 - 不能為這個(gè)應(yīng)用程序池中的客戶端執(zhí)行 CGI。這個(gè)錯(cuò)誤代碼為 IIS 6.0 所專用宜鸯。
  • 403.20 - Passport 登錄失敗憔古。這個(gè)錯(cuò)誤代碼為 IIS 6.0 所專用。
(4)404 Not Found

該狀態(tài)碼表明服務(wù)器上無法找到請(qǐng)求的資源淋袖。除此之外鸿市,也可以在服務(wù)器端拒絕請(qǐng)求且不想說明理由時(shí)使用。
以下情況會(huì)出現(xiàn)404:

  • 404.0 -(無) – 沒有找到文件或目錄。
  • 404.1 - 無法在所請(qǐng)求的端口上訪問 Web 站點(diǎn)焰情。
  • 404.2 - Web 服務(wù)擴(kuò)展鎖定策略阻止本請(qǐng)求陌凳。
  • 404.3 - MIME 映射策略阻止本請(qǐng)求煎殷。
(5)405 Method Not Allowed

該狀態(tài)碼表示客戶端請(qǐng)求的方法雖然能被服務(wù)器識(shí)別闲延,但是服務(wù)器禁止使用該方法皆串。GET 和 HEAD 方法沼溜,服務(wù)器應(yīng)該總是允許客戶端進(jìn)行訪問∩淮保客戶端可以通過 OPTIONS 方法(預(yù)檢)來查看服務(wù)器允許的訪問方法, 如下

Access-Control-Allow-Methods: GET,HEAD,PUT,PATCH,POST,DELETE
復(fù)制代碼

4. 5XX (Server Error 服務(wù)器錯(cuò)誤狀態(tài)碼)

5XX 的響應(yīng)結(jié)果表明服務(wù)器本身發(fā)生錯(cuò)誤.

(1)500 Internal Server Error

該狀態(tài)碼表明服務(wù)器端在執(zhí)行請(qǐng)求時(shí)發(fā)生了錯(cuò)誤盹憎。也有可能是 Web 應(yīng)用存在的 bug 或某些臨時(shí)的故障拒贱。

(2)502 Bad Gateway

該狀態(tài)碼表明扮演網(wǎng)關(guān)或代理角色的服務(wù)器耕蝉,從上游服務(wù)器中接收到的響應(yīng)是無效的崔梗。注意,502 錯(cuò)誤通常不是客戶端能夠修復(fù)的垒在,而是需要由途經(jīng)的 Web 服務(wù)器或者代理服務(wù)器對(duì)其進(jìn)行修復(fù)蒜魄。以下情況會(huì)出現(xiàn)502:

  • 502.1 - CGI (通用網(wǎng)關(guān)接口)應(yīng)用程序超時(shí)。
  • 502.2 - CGI (通用網(wǎng)關(guān)接口)應(yīng)用程序出錯(cuò)爪膊。
(3)503 Service Unavailable

該狀態(tài)碼表明服務(wù)器暫時(shí)處于超負(fù)載或正在進(jìn)行停機(jī)維護(hù)权悟,現(xiàn)在無法處理請(qǐng)求砸王。如果事先得知解除以上狀況需要的時(shí)間推盛,最好寫入 RetryAfter 首部字段再返回給客戶端。

使用場(chǎng)景:

  • 服務(wù)器停機(jī)維護(hù)時(shí)谦铃,主動(dòng)用503響應(yīng)請(qǐng)求耘成;
  • nginx 設(shè)置限速,超過限速驹闰,會(huì)返回503瘪菌。
(4)504 Gateway Timeout

該狀態(tài)碼表示網(wǎng)關(guān)或者代理的服務(wù)器無法在規(guī)定的時(shí)間內(nèi)獲得想要的響應(yīng)。他是HTTP 1.1中新加入的嘹朗。

使用場(chǎng)景:代碼執(zhí)行時(shí)間超時(shí)师妙,或者發(fā)生了死循環(huán)。

5. 總結(jié)

(1)2XX 成功

  • 200 OK屹培,表示從客戶端發(fā)來的請(qǐng)求在服務(wù)器端被正確處理
  • 204 No content默穴,表示請(qǐng)求成功,但響應(yīng)報(bào)文不含實(shí)體的主體部分
  • 205 Reset Content褪秀,表示請(qǐng)求成功蓄诽,但響應(yīng)報(bào)文不含實(shí)體的主體部分,但是與 204 響應(yīng)不同在于要求請(qǐng)求方重置內(nèi)容
  • 206 Partial Content媒吗,進(jìn)行范圍請(qǐng)求

(2)3XX 重定向

  • 301 moved permanently仑氛,永久性重定向,表示資源已被分配了新的 URL
  • 302 found,臨時(shí)性重定向锯岖,表示資源臨時(shí)被分配了新的 URL
  • 303 see other介袜,表示資源存在著另一個(gè) URL,應(yīng)使用 GET 方法獲取資源
  • 304 not modified出吹,表示服務(wù)器允許訪問資源米酬,但因發(fā)生請(qǐng)求未滿足條件的情況
  • 307 temporary redirect,臨時(shí)重定向趋箩,和302含義類似赃额,但是期望客戶端保持請(qǐng)求方法不變向新的地址發(fā)出請(qǐng)求

(3)4XX 客戶端錯(cuò)誤

  • 400 bad request,請(qǐng)求報(bào)文存在語法錯(cuò)誤
  • 401 unauthorized叫确,表示發(fā)送的請(qǐng)求需要有通過 HTTP 認(rèn)證的認(rèn)證信息
  • 403 forbidden跳芳,表示對(duì)請(qǐng)求資源的訪問被服務(wù)器拒絕
  • 404 not found,表示在服務(wù)器上沒有找到請(qǐng)求的資源

(4)5XX 服務(wù)器錯(cuò)誤

  • 500 internal sever error竹勉,表示服務(wù)器端在執(zhí)行請(qǐng)求時(shí)發(fā)生了錯(cuò)誤
  • 501 Not Implemented飞盆,表示服務(wù)器不支持當(dāng)前請(qǐng)求所需要的某個(gè)功能
  • 503 service unavailable,表明服務(wù)器暫時(shí)處于超負(fù)載或正在停機(jī)維護(hù)次乓,無法處理請(qǐng)求

UDP協(xié)議為什么不可靠吓歇?

UDP在傳輸數(shù)據(jù)之前不需要先建立連接,遠(yuǎn)地主機(jī)的運(yùn)輸層在接收到UDP報(bào)文后票腰,不需要確認(rèn)城看,提供不可靠交付⌒游浚總結(jié)就以下四點(diǎn):

  • 不保證消息交付:不確認(rèn)测柠,不重傳,無超時(shí)
  • 不保證交付順序:不設(shè)置包序號(hào)缘滥,不重排轰胁,不會(huì)發(fā)生隊(duì)首阻塞
  • 不跟蹤連接狀態(tài):不必建立連接或重啟狀態(tài)機(jī)
  • 不進(jìn)行擁塞控制:不內(nèi)置客戶端或網(wǎng)絡(luò)反饋機(jī)制

即時(shí)通訊的實(shí)現(xiàn):短輪詢、長輪詢朝扼、SSE 和 WebSocket 間的區(qū)別赃阀?

短輪詢和長輪詢的目的都是用于實(shí)現(xiàn)客戶端和服務(wù)器端的一個(gè)即時(shí)通訊。

短輪詢的基本思路: 瀏覽器每隔一段時(shí)間向?yàn)g覽器發(fā)送 http 請(qǐng)求擎颖,服務(wù)器端在收到請(qǐng)求后榛斯,不論是否有數(shù)據(jù)更新,都直接進(jìn)行響應(yīng)肠仪。這種方式實(shí)現(xiàn)的即時(shí)通信肖抱,本質(zhì)上還是瀏覽器發(fā)送請(qǐng)求,服務(wù)器接受請(qǐng)求的一個(gè)過程异旧,通過讓客戶端不斷的進(jìn)行請(qǐng)求意述,使得客戶端能夠模擬實(shí)時(shí)地收到服務(wù)器端的數(shù)據(jù)的變化。這種方式的優(yōu)點(diǎn)是比較簡單,易于理解荤崇。缺點(diǎn)是這種方式由于需要不斷的建立 http 連接拌屏,嚴(yán)重浪費(fèi)了服務(wù)器端和客戶端的資源。當(dāng)用戶增加時(shí)术荤,服務(wù)器端的壓力就會(huì)變大倚喂,這是很不合理的。

長輪詢的基本思路: 首先由客戶端向服務(wù)器發(fā)起請(qǐng)求瓣戚,當(dāng)服務(wù)器收到客戶端發(fā)來的請(qǐng)求后端圈,服務(wù)器端不會(huì)直接進(jìn)行響應(yīng),而是先將這個(gè)請(qǐng)求掛起子库,然后判斷服務(wù)器端數(shù)據(jù)是否有更新舱权。如果有更新,則進(jìn)行響應(yīng)仑嗅,如果一直沒有數(shù)據(jù)宴倍,則到達(dá)一定的時(shí)間限制才返回〔旨迹客戶端 JavaScript 響應(yīng)處理函數(shù)會(huì)在處理完服務(wù)器返回的信息后鸵贬,再次發(fā)出請(qǐng)求,重新建立連接脖捻。長輪詢和短輪詢比起來阔逼,它的優(yōu)點(diǎn)是明顯減少了很多不必要的 http 請(qǐng)求次數(shù),相比之下節(jié)約了資源郭变。長輪詢的缺點(diǎn)在于颜价,連接掛起也會(huì)導(dǎo)致資源的浪費(fèi)涯保。

SSE 的基本思想: 服務(wù)器使用流信息向服務(wù)器推送信息诉濒。嚴(yán)格地說,http 協(xié)議無法做到服務(wù)器主動(dòng)推送信息夕春。但是未荒,有一種變通方法,就是服務(wù)器向客戶端聲明及志,接下來要發(fā)送的是流信息片排。也就是說,發(fā)送的不是一次性的數(shù)據(jù)包速侈,而是一個(gè)數(shù)據(jù)流率寡,會(huì)連續(xù)不斷地發(fā)送過來。這時(shí)倚搬,客戶端不會(huì)關(guān)閉連接冶共,會(huì)一直等著服務(wù)器發(fā)過來的新的數(shù)據(jù)流,視頻播放就是這樣的例子。SSE 就是利用這種機(jī)制捅僵,使用流信息向?yàn)g覽器推送信息家卖。它基于 http 協(xié)議,目前除了 IE/Edge庙楚,其他瀏覽器都支持上荡。它相對(duì)于前面兩種方式來說,不需要建立過多的 http 請(qǐng)求馒闷,相比之下節(jié)約了資源酪捡。

WebSocket 是 HTML5 定義的一個(gè)新協(xié)議議,與傳統(tǒng)的 http 協(xié)議不同纳账,該協(xié)議允許由服務(wù)器主動(dòng)的向客戶端推送信息沛善。使用 WebSocket 協(xié)議的缺點(diǎn)是在服務(wù)器端的配置比較復(fù)雜。WebSocket 是一個(gè)全雙工的協(xié)議塞祈,也就是通信雙方是平等的金刁,可以相互發(fā)送消息,而 SSE 的方式是單向通信的议薪,只能由服務(wù)器端向客戶端推送信息尤蛮,如果客戶端需要發(fā)送信息就是屬于下一個(gè) http 請(qǐng)求了。

上面的四個(gè)通信協(xié)議斯议,前三個(gè)都是基于HTTP協(xié)議的产捞。

對(duì)于這四種即使通信協(xié)議,從性能的角度來看: WebSocket > 長連接(SEE) > 長輪詢 > 短輪詢 但是哼御,我們?nèi)绻紤]瀏覽器的兼容性問題坯临,順序就恰恰相反了: 短輪詢 > 長輪詢 > 長連接(SEE) > WebSocket 所以,還是要根據(jù)具體的使用場(chǎng)景來判斷使用哪種方式恋昼。

HTTP狀態(tài)碼304是多好還是少好

服務(wù)器為了提高網(wǎng)站訪問速度看靠,對(duì)之前訪問的部分頁面指定緩存機(jī)制,當(dāng)客戶端在此對(duì)這些頁面進(jìn)行請(qǐng)求液肌,服務(wù)器會(huì)根據(jù)緩存內(nèi)容判斷頁面與之前是否相同挟炬,若相同便直接返回304,此時(shí)客戶端調(diào)用緩存內(nèi)容嗦哆,不必進(jìn)行二次下載谤祖。

狀態(tài)碼304不應(yīng)該認(rèn)為是一種錯(cuò)誤,而是對(duì)客戶端有緩存情況下服務(wù)端的一種響應(yīng)老速。

搜索引擎蜘蛛會(huì)更加青睞內(nèi)容源更新頻繁的網(wǎng)站粥喜。通過特定時(shí)間內(nèi)對(duì)網(wǎng)站抓取返回的狀態(tài)碼來調(diào)節(jié)對(duì)該網(wǎng)站的抓取頻次。若網(wǎng)站在一定時(shí)間內(nèi)一直處于304的狀態(tài)橘券,那么蜘蛛可能會(huì)降低對(duì)網(wǎng)站的抓取次數(shù)额湘。相反秕铛,若網(wǎng)站變化的頻率非常之快,每次抓取都能獲取新內(nèi)容缩挑,那么日積月累但两,的回訪率也會(huì)提高。

產(chǎn)生較多304狀態(tài)碼的原因:

  • 頁面更新周期長或不更新
  • 純靜態(tài)頁面或強(qiáng)制生成靜態(tài)html

304狀態(tài)碼出現(xiàn)過多會(huì)造成以下問題:

  • 網(wǎng)站快照停止供置;
  • 收錄減少谨湘;
  • 權(quán)重下降。

常見的位運(yùn)算符有哪些芥丧?其計(jì)算規(guī)則是什么紧阔?

現(xiàn)代計(jì)算機(jī)中數(shù)據(jù)都是以二進(jìn)制的形式存儲(chǔ)的,即0续担、1兩種狀態(tài)擅耽,計(jì)算機(jī)對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行的運(yùn)算加減乘除等都是叫位運(yùn)算,即將符號(hào)位共同參與運(yùn)算的運(yùn)算物遇。

常見的位運(yùn)算有以下幾種:

| 運(yùn)算符 | 描述 | 運(yùn)算規(guī)則 |
| --- | --- | --- | --- |
| & | 與 | 兩個(gè)位都為1時(shí)乖仇,結(jié)果才為1 |
| | | 或 | 兩個(gè)位都為0時(shí),結(jié)果才為0 |
| ^ | 異或 | 兩個(gè)位相同為0询兴,相異為1 |
| ~ | 取反 | 0變1乃沙,1變0 |
| << | 左移 | 各二進(jìn)制位全部左移若干位,高位丟棄诗舰,低位補(bǔ)0 |
| >> | 右移 | 各二進(jìn)制位全部右移若干位警儒,正數(shù)左補(bǔ)0,負(fù)數(shù)左補(bǔ)1眶根,右邊丟棄 |

1. 按位與運(yùn)算符(&)

定義: 參加運(yùn)算的兩個(gè)數(shù)據(jù)按二進(jìn)制位進(jìn)行“與”運(yùn)算蜀铲。 運(yùn)算規(guī)則:

0 & 0 = 0  
0 & 1 = 0  
1 & 0 = 0  
1 & 1 = 1
復(fù)制代碼

總結(jié):兩位同時(shí)為1,結(jié)果才為1属百,否則結(jié)果為0记劝。
例如:3&5 即:

0000 0011 
   0000 0101 
 = 0000 0001
復(fù)制代碼

因此 3&5 的值為1。
注意:負(fù)數(shù)按補(bǔ)碼形式參加按位與運(yùn)算诸老。

用途:

(1)判斷奇偶

只要根據(jù)最未位是0還是1來決定隆夯,為0就是偶數(shù),為1就是奇數(shù)别伏。因此可以用if ((i & 1) == 0)代替if (i % 2 == 0)來判斷a是不是偶數(shù)。

(2)清零

如果想將一個(gè)單元清零忧额,即使其全部二進(jìn)制位為0厘肮,只要與一個(gè)各位都為零的數(shù)值相與,結(jié)果為零睦番。

2. 按位或運(yùn)算符(|)

定義: 參加運(yùn)算的兩個(gè)對(duì)象按二進(jìn)制位進(jìn)行“或”運(yùn)算类茂。

運(yùn)算規(guī)則:

0 | 0 = 0
0 | 1 = 1  
1 | 0 = 1  
1 | 1 = 1
復(fù)制代碼

總結(jié):參加運(yùn)算的兩個(gè)對(duì)象只要有一個(gè)為1耍属,其值為1。
例如:3|5即:

0000 0011
  0000 0101 
= 0000 0111
復(fù)制代碼

因此巩检,3|5的值為7厚骗。
注意:負(fù)數(shù)按補(bǔ)碼形式參加按位或運(yùn)算。

3. 異或運(yùn)算符(^)

定義: 參加運(yùn)算的兩個(gè)數(shù)據(jù)按二進(jìn)制位進(jìn)行“異或”運(yùn)算兢哭。

運(yùn)算規(guī)則:

0 ^ 0 = 0  
0 ^ 1 = 1  
1 ^ 0 = 1  
1 ^ 1 = 0
復(fù)制代碼

總結(jié):參加運(yùn)算的兩個(gè)對(duì)象领舰,如果兩個(gè)相應(yīng)位相同為0,相異為1迟螺。
例如:3|5即:

0000 0011
  0000 0101 
= 0000 0110
復(fù)制代碼

因此冲秽,3^5的值為6。
異或運(yùn)算的性質(zhì):

  • 交換律:(a^b)^c == a^(b^c)
  • 結(jié)合律:(a + b)^c == a^b + b^c
  • 對(duì)于任何數(shù)x矩父,都有 x^x=0锉桑,x^0=x
  • 自反性: a^b^b=a^0=a;

4. 取反運(yùn)算符 (~)

定義: 參加運(yùn)算的一個(gè)數(shù)據(jù)按二進(jìn)制進(jìn)行“取反”運(yùn)算。

運(yùn)算規(guī)則:

~ 1 = 0~ 0 = 1
復(fù)制代碼

總結(jié):對(duì)一個(gè)二進(jìn)制數(shù)按位取反窍株,即將0變1民轴,1變0。
例如:~6 即:

0000 0110= 1111 1001
復(fù)制代碼

在計(jì)算機(jī)中球订,正數(shù)用原碼表示杉武,負(fù)數(shù)使用補(bǔ)碼存儲(chǔ),首先看最高位辙售,最高位1表示負(fù)數(shù)轻抱,0表示正數(shù)。此計(jì)算機(jī)二進(jìn)制碼為負(fù)數(shù)旦部,最高位為符號(hào)位祈搜。
當(dāng)發(fā)現(xiàn)按位取反為負(fù)數(shù)時(shí),就直接取其補(bǔ)碼士八,變?yōu)槭M(jìn)制:

0000 0110   = 1111 1001反碼:1000 0110補(bǔ)碼:1000 0111
復(fù)制代碼

因此容燕,~6的值為-7。

5. 左移運(yùn)算符(<<)

定義: 將一個(gè)運(yùn)算對(duì)象的各二進(jìn)制位全部左移若干位婚度,左邊的二進(jìn)制位丟棄蘸秘,右邊補(bǔ)0。
設(shè) a=1010 1110蝗茁,a = a<< 2 將a的二進(jìn)制位左移2位醋虏、右補(bǔ)0,即得a=1011 1000哮翘。
若左移時(shí)舍棄的高位不包含1颈嚼,則每左移一位,相當(dāng)于該數(shù)乘以2饭寺。

6. 右移運(yùn)算符(>>)

定義: 將一個(gè)數(shù)的各二進(jìn)制位全部右移若干位阻课,正數(shù)左補(bǔ)0叫挟,負(fù)數(shù)左補(bǔ)1,右邊丟棄限煞。
例如:a=a>>2 將a的二進(jìn)制位右移2位抹恳,左補(bǔ)0 或者 左補(bǔ)1得看被移數(shù)是正還是負(fù)。
操作數(shù)每右移一位署驻,相當(dāng)于該數(shù)除以2奋献。

7. 原碼、補(bǔ)碼硕舆、反碼

上面提到了補(bǔ)碼秽荞、反碼等知識(shí),這里就補(bǔ)充一下抚官。
計(jì)算機(jī)中的有符號(hào)數(shù)有三種表示方法扬跋,即原碼、反碼和補(bǔ)碼凌节。三種表示方法均有符號(hào)位和數(shù)值位兩部分钦听,符號(hào)位都是用0表示“正”,用1表示“負(fù)”倍奢,而數(shù)值位朴上,三種表示方法各不相同。

(1)原碼

原碼就是一個(gè)數(shù)的二進(jìn)制數(shù)卒煞。例如:10的原碼為0000 1010

(2)反碼

  • 正數(shù)的反碼與原碼相同痪宰,如:10 反碼為 0000 1010
  • 負(fù)數(shù)的反碼為除符號(hào)位,按位取反畔裕,即0變1衣撬,1變0。

例如:-10

原碼:1000 1010
反碼:1111 0101
復(fù)制代碼

(3)補(bǔ)碼

  • 正數(shù)的補(bǔ)碼與原碼相同扮饶,如:10 補(bǔ)碼為 0000 1010
  • 負(fù)數(shù)的補(bǔ)碼是原碼除符號(hào)位外的所有位取反即0變1具练,1變0,然后加1甜无,也就是反碼加1扛点。

例如:-10

原碼:1000 1010
反碼:1111 0101
補(bǔ)碼:1111 0110
復(fù)制代碼

說一下怎么取出數(shù)組最多的一項(xiàng)?

// 我這里只是一個(gè)示例
const d = {};
let ary = ['趙', '錢', '孫', '孫', '李', '周', '李', '周', '周', '李'];
ary.forEach(k => !d[k] ? d[k] = 1 : d[k]++);
const result = Object.keys(d).sort((a, b) => d[b] - d[a]).filter((k, i, l) => d[k] === d[l[0]]);
console.log(result)
復(fù)制代碼

Promise是什么?

Promise 是異步編程的一種解決方案:從語法上講岂丘,promise是一個(gè)對(duì)象陵究,從它可以獲取異步操作的消息;從本意上講元潘,它是承諾畔乙,承諾它過一段時(shí)間會(huì)給你一個(gè)結(jié)果肠牲。promise有三種狀態(tài): pending(等待態(tài))登下,fulfiled(成功態(tài)),rejected(失敗態(tài)) 逢净;狀態(tài)一旦改變钥庇,就不會(huì)再變牍鞠。創(chuàng)造promise實(shí)例后,它會(huì)立即執(zhí)行评姨。

const PENDING = "pending";
const RESOLVED = "resolved";
const REJECTED = "rejected";

function MyPromise(fn) {
  // 保存初始化狀態(tài)
  var self = this;

  // 初始化狀態(tài)
  this.state = PENDING;

  // 用于保存 resolve 或者 rejected 傳入的值
  this.value = null;

  // 用于保存 resolve 的回調(diào)函數(shù)
  this.resolvedCallbacks = [];

  // 用于保存 reject 的回調(diào)函數(shù)
  this.rejectedCallbacks = [];

  // 狀態(tài)轉(zhuǎn)變?yōu)?resolved 方法
  function resolve(value) {
    // 判斷傳入元素是否為 Promise 值难述,如果是,則狀態(tài)改變必須等待前一個(gè)狀態(tài)改變后再進(jìn)行改變
    if (value instanceof MyPromise) {
      return value.then(resolve, reject);
    }

    // 保證代碼的執(zhí)行順序?yàn)楸据喪录h(huán)的末尾
    setTimeout(() => {
      // 只有狀態(tài)為 pending 時(shí)才能轉(zhuǎn)變吐句,
      if (self.state === PENDING) {
        // 修改狀態(tài)
        self.state = RESOLVED;

        // 設(shè)置傳入的值
        self.value = value;

        // 執(zhí)行回調(diào)函數(shù)
        self.resolvedCallbacks.forEach(callback => {
          callback(value);
        });
      }
    }, 0);
  }

  // 狀態(tài)轉(zhuǎn)變?yōu)?rejected 方法
  function reject(value) {
    // 保證代碼的執(zhí)行順序?yàn)楸据喪录h(huán)的末尾
    setTimeout(() => {
      // 只有狀態(tài)為 pending 時(shí)才能轉(zhuǎn)變
      if (self.state === PENDING) {
        // 修改狀態(tài)
        self.state = REJECTED;

        // 設(shè)置傳入的值
        self.value = value;

        // 執(zhí)行回調(diào)函數(shù)
        self.rejectedCallbacks.forEach(callback => {
          callback(value);
        });
      }
    }, 0);
  }

  // 將兩個(gè)方法傳入函數(shù)執(zhí)行
  try {
    fn(resolve, reject);
  } catch (e) {
    // 遇到錯(cuò)誤時(shí)胁后,捕獲錯(cuò)誤,執(zhí)行 reject 函數(shù)
    reject(e);
  }
}

MyPromise.prototype.then = function(onResolved, onRejected) {
  // 首先判斷兩個(gè)參數(shù)是否為函數(shù)類型嗦枢,因?yàn)檫@兩個(gè)參數(shù)是可選參數(shù)
  onResolved =
    typeof onResolved === "function"
      ? onResolved
      : function(value) {
          return value;
        };

  onRejected =
    typeof onRejected === "function"
      ? onRejected
      : function(error) {
          throw error;
        };

  // 如果是等待狀態(tài)攀芯,則將函數(shù)加入對(duì)應(yīng)列表中
  if (this.state === PENDING) {
    this.resolvedCallbacks.push(onResolved);
    this.rejectedCallbacks.push(onRejected);
  }

  // 如果狀態(tài)已經(jīng)凝固,則直接執(zhí)行對(duì)應(yīng)狀態(tài)的函數(shù)

  if (this.state === RESOLVED) {
    onResolved(this.value);
  }

  if (this.state === REJECTED) {
    onRejected(this.value);
  }
};
復(fù)制代碼

for...in和for...of的區(qū)別

for…of 是ES6新增的遍歷方式文虏,允許遍歷一個(gè)含有iterator接口的數(shù)據(jù)結(jié)構(gòu)(數(shù)組侣诺、對(duì)象等)并且返回各項(xiàng)的值,和ES3中的for…in的區(qū)別如下

  • for…of 遍歷獲取的是對(duì)象的鍵值氧秘,for…in 獲取的是對(duì)象的鍵名年鸳;
  • for… in 會(huì)遍歷對(duì)象的整個(gè)原型鏈,性能非常差不推薦使用丸相,而 for … of 只遍歷當(dāng)前對(duì)象不會(huì)遍歷原型鏈搔确;
  • 對(duì)于數(shù)組的遍歷,for…in 會(huì)返回?cái)?shù)組中所有可枚舉的屬性(包括原型鏈上可枚舉的屬性)灭忠,for…of 只返回?cái)?shù)組的下標(biāo)對(duì)應(yīng)的屬性值膳算;

總結(jié): for...in 循環(huán)主要是為了遍歷對(duì)象而生,不適用于遍歷數(shù)組更舞;for...of 循環(huán)可以用來遍歷數(shù)組畦幢、類數(shù)組對(duì)象,字符串缆蝉、Set宇葱、Map 以及 Generator 對(duì)象。

解釋性語言和編譯型語言的區(qū)別

(1)解釋型語言
使用專門的解釋器對(duì)源程序逐行解釋成特定平臺(tái)的機(jī)器碼并立即執(zhí)行刊头。是代碼在執(zhí)行時(shí)才被解釋器一行行動(dòng)態(tài)翻譯和執(zhí)行黍瞧,而不是在執(zhí)行之前就完成翻譯。解釋型語言不需要事先編譯原杂,其直接將源代碼解釋成機(jī)器碼并立即執(zhí)行印颤,所以只要某一平臺(tái)提供了相應(yīng)的解釋器即可運(yùn)行該程序。其特點(diǎn)總結(jié)如下

  • 解釋型語言每次運(yùn)行都需要將源代碼解釋稱機(jī)器碼并執(zhí)行穿肄,效率較低年局;
  • 只要平臺(tái)提供相應(yīng)的解釋器际看,就可以運(yùn)行源代碼,所以可以方便源程序移植矢否;
  • JavaScript仲闽、Python等屬于解釋型語言。

(2)編譯型語言
使用專門的編譯器僵朗,針對(duì)特定的平臺(tái)赖欣,將高級(jí)語言源代碼一次性的編譯成可被該平臺(tái)硬件執(zhí)行的機(jī)器碼,并包裝成該平臺(tái)所能識(shí)別的可執(zhí)行性程序的格式验庙。在編譯型語言寫的程序執(zhí)行之前顶吮,需要一個(gè)專門的編譯過程,把源代碼編譯成機(jī)器語言的文件粪薛,如exe格式的文件悴了,以后要再運(yùn)行時(shí),直接使用編譯結(jié)果即可汗菜,如直接運(yùn)行exe文件让禀。因?yàn)橹恍杈幾g一次,以后運(yùn)行時(shí)不需要編譯陨界,所以編譯型語言執(zhí)行效率高巡揍。其特點(diǎn)總結(jié)如下:

  • 一次性的編譯成平臺(tái)相關(guān)的機(jī)器語言文件,運(yùn)行時(shí)脫離開發(fā)環(huán)境菌瘪,運(yùn)行效率高腮敌;
  • 與特定平臺(tái)相關(guān),一般無法移植到其他平臺(tái)俏扩;
  • C糜工、C++等屬于編譯型語言。

兩者主要區(qū)別在于: 前者源程序編譯后即可在該平臺(tái)運(yùn)行录淡,后者是在運(yùn)行期間才編譯捌木。所以前者運(yùn)行速度快,后者跨平臺(tái)性好嫉戚。

Vue的生命周期是什么 每個(gè)鉤子里面具體做了什么事情

Vue 實(shí)例有?個(gè)完整的?命周期刨裆,也就是從開始創(chuàng)建、初始化數(shù)據(jù)彬檀、編譯模版帆啃、掛載Dom -> 渲染、更新 -> 渲染窍帝、卸載 等?系列過程努潘,稱這是Vue的?命周期。
1、beforeCreate(創(chuàng)建前) :數(shù)據(jù)觀測(cè)和初始化事件還未開始疯坤,此時(shí) data 的響應(yīng)式追蹤报慕、event/watcher 都還沒有被設(shè)置,也就是說不能訪問到data贴膘、computed卖子、watch略号、methods上的方法和數(shù)據(jù)刑峡。
2、created(創(chuàng)建后) :實(shí)例創(chuàng)建完成玄柠,實(shí)例上配置的 options 包括 data突梦、computed、watch羽利、methods 等都配置完成宫患,但是此時(shí)渲染得節(jié)點(diǎn)還未掛載到 DOM,所以不能訪問到 `$el` 屬性这弧。
3娃闲、beforeMount(掛載前) :在掛載開始之前被調(diào)用,相關(guān)的render函數(shù)首次被調(diào)用匾浪。實(shí)例已完成以下的配置:編譯模板皇帮,把data里面的數(shù)據(jù)和模板生成html。此時(shí)還沒有掛載html到頁面上蛋辈。
4属拾、mounted(掛載后) :在el被新創(chuàng)建的 vm.$el 替換,并掛載到實(shí)例上去之后調(diào)用冷溶。實(shí)例已完成以下的配置:用上面編譯好的html內(nèi)容替換el屬性指向的DOM對(duì)象渐白。完成模板中的html渲染到html 頁面中。此過程中進(jìn)行ajax交互逞频。
5纯衍、beforeUpdate(更新前) :響應(yīng)式數(shù)據(jù)更新時(shí)調(diào)用,此時(shí)雖然響應(yīng)式數(shù)據(jù)更新了苗胀,但是對(duì)應(yīng)的真實(shí) DOM 還沒有被渲染襟诸。
6、updated(更新后):在由于數(shù)據(jù)更改導(dǎo)致的虛擬DOM重新渲染和打補(bǔ)丁之后調(diào)用柒巫。此時(shí) DOM 已經(jīng)根據(jù)響應(yīng)式數(shù)據(jù)的變化更新了励堡。調(diào)用時(shí),組件 DOM已經(jīng)更新堡掏,所以可以執(zhí)行依賴于DOM的操作应结。然而在大多數(shù)情況下,應(yīng)該避免在此期間更改狀態(tài),因?yàn)檫@可能會(huì)導(dǎo)致更新無限循環(huán)鹅龄。該鉤子在服務(wù)器端渲染期間不被調(diào)用揩慕。
7、beforeDestroy(銷毀前) :實(shí)例銷毀之前調(diào)用扮休。這一步迎卤,實(shí)例仍然完全可用,`this` 仍能獲取到實(shí)例玷坠。
8蜗搔、destroyed(銷毀后) :實(shí)例銷毀后調(diào)用,調(diào)用后八堡,Vue 實(shí)例指示的所有東西都會(huì)解綁定樟凄,所有的事件監(jiān)聽器會(huì)被移除,所有的子實(shí)例也會(huì)被銷毀兄渺。該鉤子在服務(wù)端渲染期間不被調(diào)用缝龄。
另外還有 `keep-alive` 獨(dú)有的生命周期,分別為 `activated` 和 `deactivated` 挂谍。用 `keep-alive` 包裹的組件在切換時(shí)不會(huì)進(jìn)行銷毀叔壤,而是緩存到內(nèi)存中并執(zhí)行 `deactivated` 鉤子函數(shù),命中緩存渲染后會(huì)執(zhí)行 `activated` 鉤子函數(shù)口叙。
復(fù)制代碼
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末炼绘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子庐扫,更是在濱河造成了極大的恐慌饭望,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件形庭,死亡現(xiàn)場(chǎng)離奇詭異铅辞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)萨醒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門斟珊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人富纸,你說我怎么就攤上這事囤踩。” “怎么了晓褪?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵堵漱,是天一觀的道長。 經(jīng)常有香客問我涣仿,道長勤庐,這世上最難降的妖魔是什么示惊? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮愉镰,結(jié)果婚禮上米罚,老公的妹妹穿的比我還像新娘。我一直安慰自己丈探,他們只是感情好录择,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碗降,像睡著了一般隘竭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遗锣,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天货裹,我揣著相機(jī)與錄音,去河邊找鬼精偿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赋兵,可吹牛的內(nèi)容都是我干的笔咽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼霹期,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼叶组!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起历造,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤甩十,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后吭产,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侣监,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年臣淤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了橄霉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邑蒋,死狀恐怖姓蜂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情医吊,我是刑警寧澤钱慢,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站卿堂,受9級(jí)特大地震影響束莫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一麦箍、第九天 我趴在偏房一處隱蔽的房頂上張望漓藕。 院中可真熱鬧,春花似錦挟裂、人聲如沸享钞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽栗竖。三九已至,卻和暖如春渠啤,著一層夾襖步出監(jiān)牢的瞬間狐肢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國打工沥曹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留份名,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓妓美,卻偏偏與公主長得像僵腺,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子壶栋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容