別人的面經 一

阿里字節前端面試 https://www.nowcoder.com/discuss/412947?type=post&order=time&pos=&page=0&channel=

JavaScript 數據類型以及 typeof 返回值

typeof x   undefined
typeof undefined  undefined
typeof true   boolean
function A() {}
typeof A function
 
const arr = [] 
const obj = {}
typeof arr object
typeof obj object

如何區分 arr 和 obj

Array.isArray() || instanceof || constructor

Object.prototype.toString.call(obj) ===Object.prototype.toString.call([])

注意:instanceof在判斷數組是,即會把數組當做Array類型,又會把數組當做Object類型,都會返回true

前端性能優化

減少請求數:合併資源(精靈圖),減少http請求數。

加快請求速度:預解析DNS,減少域名數,CDN分支。

緩存:http請求協議緩存,離線緩存,離線數據緩存(localStorage)。

渲染:js/css優化,服務器渲染,加快順序。

JPG和PNG的區別

1.JPG是有損壓縮格式,PNG是無損壓縮格式

2.JPG圖片沒有透明背景,PNG有透明背景

樹和圖的遍歷方式

數的遍歷方式

前中後序遍歷 遞歸||非遞歸 非遞歸用棧

層次遍歷(層次遍歷可以設一個隊列,把元素放在隊列裏,每次輸出隊頭元素。)

圖的遍歷方式

DFS BFS

數組和鏈表的區別

數組是將元素在內存中連續存放,由於每個元素佔用內存相同,可以通過下標迅速訪問任何元素

鏈表恰好相反,鏈表中的元素在內存中不是順序存儲的,而是通過元素中的指針聯繫到一起。

數組 遍歷方便 插入刪除麻煩 鏈表恰好相反

ios七層模型

物理層 數據鏈路層 網絡層 傳輸層 會話層 表示層 應用層
比特 IP TCP/UDP http/web Socket

TCP 和 UDP 的區別。

TCP UDP
面向連接 面向無連接
提供可靠的服務 提供不可靠的服務
面向字節流 面向報文(沒有阻塞控制 應用場景:IP電話 實時視頻會議)
首部開銷20字節 首部開銷8字節
點對點 一對多 多對多
TCP的邏輯信道信號是全雙工的可靠通信 UDP則是不可靠的信道

HTTP 2.0 新增

二進制協議,多路複用(共享連接),數據流,信息頭壓縮,客戶端推送。

HTTP狀態碼

200 請求成功

301 永久重定向

302 臨時重定向

304 not Modified 未修改

400 客戶端錯誤

401 當前身份驗證

403 服務器已經得到請求,但是拒絕執行

500 客戶端在執行時發生錯誤,無法完成請求。

localStorage和Cookie

localStorage和Cookie都可以在同源窗口中訪問

localStorage存儲大小爲5M,Cookie的存儲大小爲4k

localStorage只要存放到本地只要不刪除就一直存在,Cookie有過期時間expries

Cookie 可能存在的問題,簡單介紹 XSS 和 CSRF。

XSS:指的是跨站腳本攻擊,是一種代碼注入攻擊。攻擊者通過網站中注入惡意腳本,使之在瀏覽器上運行,從而盜取用戶的信息入Cookie等。

xss的本質是因爲惡意網站沒有進行過濾,與正常的代碼混合在一起了,瀏覽器沒辦法辨別哪些腳本是可信的,從而導致惡意代碼的執行。

XSS一般分爲存儲型,反射型和DOM型。

存儲型:指的是惡意代碼提交到數據庫中,當用戶請求數據的時,服務器就將其拼接爲HTML後返回給用戶,從而導致代碼的執行。

反射型:指的是攻擊者先將含有攻擊的代碼發送給目標用戶,用戶打開後,會訪問鏈接對應的服務器,服務器收到鏈接請求時,會將帶有的XSS代碼的數據再次發送給用戶,此時用戶瀏覽器就會默認執行帶有XSS代碼的腳本,此時會觸發XSS漏洞。

DOM型:指的是xss代碼並不需要服務器的參與,觸發xss靠的是瀏覽器的DOM解析,完全是客戶端的事情

防範XSS:輸入過濾,輸出編碼,通過設置set-cookie httponly禁止腳本執行cookie。也可以設置只有在https協議下可以發送cookie。

CSRF:指的是跨站請求僞造攻擊,攻擊者誘惑用戶進入一個第三方網站,然後該網站向攻擊網站發送跨站請求。如果用戶在被攻擊網站保留了登錄狀態,那麼攻擊者就可以利用這個登錄狀態,繞過後臺的用戶驗證,冒充用戶向服務器執行一些操作。

CSRF攻擊的本質是利用了cookie會在同源請求中攜帶發送給服務器的特點,以此來實現用戶的冒充。

一般的CSRF攻擊類型由三種:

1.GET類型的CRSF攻擊,比如一個網站中的一個img標籤裏面構建一個請求,當用戶打開這個頁面時就會自動發送提交。

2.POST類型的CRSF攻擊,比如說創建一個表單,然後隱藏它,自動提交這個表單。

3.鏈接類型的CSRF攻擊,比如說創建一個表單,然後隱藏它,自動提交這個表單。

CSRF可以用以下幾種方法來防護:

1.同源檢測的方法,服務器根據http請求頭中的origin或者referer信息來判斷請求是否爲允許訪問的站點。

2.使用CSRF Token來進行驗證,服務器向用戶返回一個隨機數Token,當網站再次發送請求的時候,在請求參數中加入服務器端返回的token,然後服務器對這個token進行驗證。這種方法解決了使用cookie單一驗證的方法,可能會被冒用的問題,但是這種方法存在一個缺點就是,我們需要給網站中所有的請求都添加上這個token,操作比較繁瑣。還有一個問題是一般不會只有一臺網站服務器,如果我們的請求經過平衡負載轉移到其他的服務器,但是這個服務器的session中沒有保存這個token的話,就沒有辦法驗證了。這種情況我們可以通過token構建的方式來解決。

3.使用雙重Cookie驗證的方式,服務器在用戶訪問頁面時,向請求域名注入一個Cookie,內容爲隨機字符串,然後當用戶向服務器發送請求的時候,cookie取出這個字符串,添加到URL參數中,然後服務器通過對cookie中的數據進行比較,來進行驗證。

4.在設置cookie的時候設置Samesite,限制cookie不能作爲第三方使用,從而避免被攻擊者利用。Samesite一共有兩種模式,一種是嚴格模式,在嚴格模式下cookie在任何情況下ia都不能作爲第三方Cookie使用,在寬鬆模式下,cookie可以被請求時GET請求,且會發送頁面跳轉的請求所使用。

跨域解決方案

1. jsonp

1) JSONP原理

利用 標籤沒有跨域限制的漏洞,網頁可以得到從其他來源動態產生的 JSON 數據。JSONP請求一定需要對方的服務器做支持纔可以。

2) JSONP和AJAX對比

JSONP和AJAX相同,都是客戶端向服務器端發送請求,從服務器端獲取數據的方式。但AJAX屬於同源策略,JSONP屬於非同源策略(跨域請求)

3) JSONP優缺點

JSONP優點是簡單兼容性好,可用於解決主流瀏覽器的跨域數據訪問的問題。缺點是僅支持get方法具有侷限性,不安全可能會遭受XSS攻擊。

4) JSONP的實現流程

  • 聲明一個回調函數,其函數名(如show)當做參數值,要傳遞給跨域請求數據的服務器,函數形參爲要獲取目標數據(服務器返回的data)。

  • 創建一個

    <script>
    

    標籤,把那個跨域的API數據接口地址,賦值給script的src,還要在這個地址中向服務器傳遞該函數名(可以通過問號傳參:?callback=show)。

    • 服務器接收到請求後,需要進行特殊的處理:把傳遞進來的函數名和它需要給你的數據拼接成一個字符串,例如:傳遞進去的函數名是show,它準備好的數據是show('我不愛你')
  • 最後服務器把準備的數據通過HTTP協議返回給客戶端,客戶端再調用執行之前聲明的回調函數(show),對返回的數據進行操作。

2.cors

在服務端設置

Access-control-allow-Origin 允許哪些域名可以訪問

Access-control-allow-methods 允許哪些請求方式

3.第三方服務器代理

實現原理:同源策略是瀏覽器需要遵循的標準,而如果是服務器向服務器請求就無需遵循同源策略。
代理服務器,需要做以下幾個步驟:

  • 接受客戶端請求 。
  • 將請求 轉發給服務器。
  • 拿到服務器 響應 數據。
  • 將 響應 轉發給客戶端。

CSS 選擇器,優先級

https://blog.csdn.net/henucm/article/details/105680155

CSS 動畫

transition和animation的區別

大部分都是相同,都是隨着時間改變元素的屬性值,他們的主要區別是transition需要觸發一個事件才能改變屬性,而animation不需要觸發任何事件就可以實行。transition爲兩幀,從from…to… 而animation可以一幀一幀的通過keyframes。

flex 佈局

flex是css3新增的一種佈局方式,我們可以同時設置一個元素的display屬性值設置爲flex屬性值設置爲flex從而使它成爲一個flex容器,它的所有子元素都成爲它的項目。

一個容器默認有兩條軸,一個水平軸,一條是與主軸垂直的交叉軸,我們可以使用flex-direction來指定主軸的方向。我們可以使用justify-content來指定標籤在主軸的排列方式,使用align-items來指定元素在交叉軸的排序方式。還可以使用flex-wrap來規定當一行排列不下時的換行方式。

對於一個容器的項目,我們使用order屬性來指定項目的排列順序,還可以使用flex-grow來指定當前排序空間有剩餘的時候,項目放大比例。還可以使用flex-shrink來指定當前排序空間不足時, 項目縮小比例。

position 有幾個值,absolute 是相對於誰的定位。

absolute :生成絕對定位的元素,相對於最近一級的定位不是 static 的父元素來進行定位。

fixed:(老IE不支持)生成絕對定位的元素,通常相對於瀏覽器窗口或 frame 進行定位。

relative:生成相對定位的元素,相對於其在普通流中的位置進行定位。

static:默認值。沒有定位,元素出現在正常的流中

ES6 瞭解什麼?

export和import

模塊化開發

Promise

異步編程的一種解決辦法

它有三種狀態,分別是pending-進行中、resolved-已完成、rejected-已失敗。改變狀態的方式只有一種即異步的結果:如果成功狀態由padding——>fulfilled;否則狀態由padding——>rejected。無法提供其他方式改變狀態。

新增聲明命令let和const

有塊級作用域 不存在變量提升 不存在重複定義 不可能提前使用。

模板字符串

用一對反引號(`)標識,它可以當作普通字符串使用,也可以用來定義多行字符串,也可以在字符串中嵌入變量,js表達式或函數,變量、js表達式或函數需要寫在${ }中。即完成拼接。

箭頭函數

特點:箭頭函數的this是繼承函數所處上下文的this

Object.keys()方法

獲取對象的所有屬性名或方法名(不包括原形的內容),返回一個數組。

Object.assign()

assign方法將多個原對象的屬性和方法都合併到了目標對象上面。可以接收多個參數,第一個參數是目標對象,後面的都是源對象。

for…of 循環

用於對象遍歷

解構賦值

var [name, pwd, sex]=["小周", "123456", "男"];
console.log(name) //小周
console.log(pwd)//123456
console.log(sex)//男

set數據結構

Set數據結構,類似數組。所有的數據都是唯一的,沒有重複的值。它本身是一個構造函數。

1)屬性和方法:

size 數據的長度
add() 添加某個值,返回 Set 結構本身。
delete() 刪除某個值,返回一個布爾值,表示刪除是否成功。
has() 查找某條數據,返回一個布爾值。
clear() 清除所有成員,沒有返回值。

var arr = [1,1,2,2,3];
var s = new Set(arr);
console.log(s);	//{1, 2, 3}
 
console.log(s.size);	//3
console.log(s.add(4));	//{1, 2, 3, 4}
console.log(s.delete(4));	//true
console.log(s.has(4));	//false
s.clear();

擴展運算符(…)

用 promise 完成同時發送兩個請求,並在都返回結果後進行處理。

待學習…

宏任務和微任務

微任務包括了promise的回調,node中的process.netxTick,對DOM的變量監聽。
宏任務包括script腳本的執行,setTimeout,setInterval,setImmediate一類的定時函數,還有如I/O操作,UI渲染等。

js是單線程運行的,在代碼執行前,我們將不同函數的執行上下文引入主線程棧中,當遇到一個異步函數我們不是等待其執行完成而是將其掛起,等到異步函數執行完之後放入任務隊列中,當主線程執行棧中任務執行完成之後,在去處理任務隊列裏面的異步函數,任務隊列分爲宏任務和微任務,先執行微任務(promise DOM的監聽),將微任務取出壓到主線程棧中進行執行,當微任務都執行完之後再執行宏任務(定時器函數)

CommonJS

CommonJS方案,它通過require來引入模塊,通過module.exports定義模塊的輸出接口。這種模式加載方案是服務器端的解決方法,它是以同步的方式引入模塊的,因爲在服務器文件都是存儲在本地磁盤,所以讀取非常塊,所以以同步的加載。但是如果是在瀏覽器端,由於模塊的加載是使用網絡請求,因此使用異步加載的方式更合適。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章