實(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ì)稱加密:
- 私鑰 + 公鑰= 密鑰對(duì)
- 即?私鑰加密的數(shù)據(jù),只有對(duì)應(yīng)的公鑰才能解密,?公鑰加密的數(shù)據(jù),只有對(duì)應(yīng)的私鑰才能解密
- 因?yàn)橥ㄐ烹p?的??都有?套??的密鑰對(duì),通信之前雙?會(huì)先把??的公鑰都先發(fā)給對(duì)?
- 然后對(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-match
、if-none-match
鞋既、if-modified-since
力九、if-unmodified-since
、if-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ù)制代碼