其它面試總結(jié)

總結(jié),又雜又多

crypto

1、事件循環(huán)

g(x) f(x) g(21)
start promise setTimeOut

2、選擇排序 歸并排序 快速排序
3、hooks
4、graphQL resful
5、深克隆,map,promise 手動(dòng)實(shí)現(xiàn)
6、看過(guò)什么書(shū)
7、0 100 300 200 200 async/await實(shí)現(xiàn)

騰訊

頭條

筆試

四個(gè)題型
單選:比較簡(jiǎn)單,有問(wèn)etag不太了解
填空:一個(gè)事件循環(huán),一個(gè)this指針
編程:數(shù)組深度,大數(shù)相加
問(wèn)答:性能優(yōu)化

一面

react diff算法

  • tree diff :DOM節(jié)點(diǎn)跨層級(jí)移動(dòng)較少,忽略


    image.png

    (1)React通過(guò)updateDepth對(duì)Virtual DOM樹(shù)進(jìn)行層級(jí)控制。
    (2)對(duì)樹(shù)分層比較,兩棵樹(shù) 只對(duì)同一層次節(jié)點(diǎn) 進(jìn)行比較。如果該節(jié)點(diǎn)不存在時(shí),則該節(jié)點(diǎn)及其子節(jié)點(diǎn)會(huì)被完全刪除,不會(huì)再進(jìn)一步比較。
    (3)只需遍歷一次,就能完成整棵DOM樹(shù)的比較。
    添加刪除會(huì)導(dǎo)致跨層級(jí),所以官方建議少刪除添加,而用隱藏顯示

  • component diff:擁有相同類的兩個(gè)組件,生成相似樹(shù)形結(jié)構(gòu)
    component diff
    React對(duì)不同的組件間的比較,有三種策略
    (1)同一類型的兩個(gè)組件,按原策略(層級(jí)比較)繼續(xù)比較Virtual DOM樹(shù)即可。
    (2)同一類型的兩個(gè)組件,組件A變化為組件B時(shí),可能Virtual DOM沒(méi)有任何變化,如果知道這點(diǎn)(變換的過(guò)程中,Virtual DOM沒(méi)有改變),可節(jié)省大量計(jì)算時(shí)間,所以 用戶 可以通過(guò) shouldComponentUpdate() 來(lái)判斷是否需要 判斷計(jì)算。
    (3)不同類型的組件,將一個(gè)(將被改變的)組件判斷為dirty component(臟組件),從而替換 整個(gè)組件的所有節(jié)點(diǎn)。

  • element diff :同一層級(jí)的一組子節(jié)點(diǎn),通過(guò)唯一id區(qū)分
    當(dāng)節(jié)點(diǎn)處于同一層級(jí)時(shí),diff提供三種節(jié)點(diǎn)操作:刪除、插入、移動(dòng)。
    插入:組件 C 不在集合(A,B)中,需要插入
    刪除:(1)組件 D 在集合(A,B,D)中,但 D的節(jié)點(diǎn)已經(jīng)更改,不能復(fù)用和更新,所以需要?jiǎng)h除 舊的 D ,再創(chuàng)建新的。
    (2)組件 D 之前在 集合(A,B,D)中,但集合變成新的集合(A,B)了,D 就需要被刪除。
    移動(dòng):組件D已經(jīng)在集合(A,B,C,D)里了,且集合更新時(shí),D沒(méi)有發(fā)生更新,只是位置改變,如新集合(A,D,B,C),D在第二個(gè),無(wú)須像傳統(tǒng)diff,讓舊集合的第二個(gè)B和新集合的第二個(gè)D 比較,并且刪除第二個(gè)位置的B,再在第二個(gè)位置插入D,而是 (對(duì)同一層級(jí)的同組子節(jié)點(diǎn)) 添加唯一key進(jìn)行區(qū)分,移動(dòng)即可。

在開(kāi)發(fā)過(guò)程中,盡量減少類似將最后一個(gè)節(jié)點(diǎn)移動(dòng)到列表首部的操作,當(dāng)節(jié)點(diǎn)數(shù)量過(guò)大或更新操作過(guò)于頻繁時(shí),會(huì)影響React的渲染性能。

在原型上手寫map,reduce

前端緩存

service worker>memory cache>disk cache>請(qǐng)求
1.根據(jù) Service Worker 中的 handler 決定是否存入 Cache Storage (額外的緩存位置)。
2.根據(jù) HTTP 頭部的相關(guān)字段(Cache-control, Pragma 等)決定是否存入 disk cache
3.memory cache 保存一份資源 的引用,以備下次使用。

cookies: HTML5之前本地儲(chǔ)存的主要方式,大小只有4k,HTTP請(qǐng)求頭會(huì)自動(dòng)帶上cookie,兼容性好
localStorage:HTML5新特性,持久性存儲(chǔ),即使頁(yè)面關(guān)閉也不會(huì)被清除,以鍵值對(duì)的方式存儲(chǔ),大小為5M
sessionStorage:HTML5新特性,操作及大小同localStorage,和localStorage的區(qū)別在于sessionStorage在選項(xiàng)卡(頁(yè)面)被關(guān)閉時(shí)即清除,且不同選項(xiàng)卡之間的sessionStorage不互通
IndexedDB: NoSQL型數(shù)據(jù)庫(kù),類比MongoDB,使用鍵值對(duì)進(jìn)行儲(chǔ)存,異步操作數(shù)據(jù)庫(kù),支持事務(wù),儲(chǔ)存空間可以在250MB以上,但是IndexedDB受同源策略限制
Web SQL:是在瀏覽器上模擬的關(guān)系型數(shù)據(jù)庫(kù),開(kāi)發(fā)者可以通過(guò)SQL語(yǔ)句來(lái)操作Web SQL,是HTML5以外一套獨(dú)立的規(guī)范,兼容性差

數(shù)組數(shù)學(xué)方法

map,reduce,filter,foreach,sort,reverse,slice,splice

網(wǎng)絡(luò)安全,哪幾種攻擊方式

1、 XXS: 腳本注入攻擊,用戶輸入可執(zhí)行JS代碼
輸入框,URL,img,$.append嵌入<script>腳本,導(dǎo)致cookie信息泄露
防范方式:

  • 輸入內(nèi)容轉(zhuǎn)移
  • httpOnly,核心的用戶身份標(biāo)示或token保存在Cookie中,Cookie中一定要加“HTTPOnly”在結(jié)尾,保證只有在html操作時(shí)才能將cookie中的內(nèi)容發(fā)送出去,在JS中無(wú)法獲得用戶的Cookie信息
  • 禁止用戶在輸入的過(guò)程中輸入"<",">","引號(hào)","$","_",

2、 XSRF/CSRF:跨站腳本攻擊,網(wǎng)站提交表單被利用,操作到其他網(wǎng)站
來(lái)源

  • 攜帶業(yè)務(wù)特性參數(shù)的GET 請(qǐng)求
  • 被隱藏和偽造的POST 請(qǐng)求
    導(dǎo)致用戶不知情的情況下對(duì)其他網(wǎng)站接口進(jìn)行了提交。
    主要防范方式為
  • 使用驗(yàn)證碼
  • get請(qǐng)求不對(duì)數(shù)據(jù)進(jìn)行修改,請(qǐng)求附帶token
  • 使用唯一的session作為接口校驗(yàn)規(guī)則
  • 減少在cookie,不讓第三方網(wǎng)站訪問(wèn)cookie
  • 中存儲(chǔ)客戶核心內(nèi)容比如用戶的token、ID、access_token等,將和信息存在前端的storage中

3、網(wǎng)絡(luò)劫持:網(wǎng)站的訪問(wèn)并非進(jìn)入目標(biāo)服務(wù)器,而是中間被轉(zhuǎn)移到其他網(wǎng)站了
解決方法

  • 使用https
  • 使用非對(duì)稱加密方式RSA進(jìn)行數(shù)據(jù)加密
    4、釣魚(yú)網(wǎng)站:高仿引誘提交表單

5、中間人攻擊:中間人攻擊是攻擊方同時(shí)與服務(wù)端和客戶端建立起了連接,并讓對(duì)方認(rèn)為連接是安全的

  • 用https
    總結(jié):
    提防用戶自己生產(chǎn)內(nèi)容,對(duì)表單進(jìn)行驗(yàn)證
    對(duì)服務(wù)器傳入的內(nèi)容進(jìn)行轉(zhuǎn)義輸出,大部分框架已經(jīng)集成了這個(gè)功能
    重要的用戶數(shù)據(jù)要進(jìn)行加密,使用HTTPS傳送或者使用RSA加密
    規(guī)范使用POST/GET請(qǐng)求,原則上,有用戶數(shù)據(jù)的部分統(tǒng)一使用POST

哪幾種設(shè)計(jì)模式

1、單例模式

var single = (function(){
    let instance;

    function getInstance(){
    // 如果該實(shí)例存在,則直接返回,否則就對(duì)其實(shí)例化
        if( instance=== undefined ){
            instance= new Construct();
        }
        return instance;
    }

    function Construct(){
        // ... 生成單例的構(gòu)造函數(shù)的代碼
    }

    return {
        getInstance : getInstance
    }
})();

2、工廠模式

//安全模式創(chuàng)建的工廠方法函數(shù)
let UserFactory = function(role) {
  if(this instanceof UserFactory) {
    var s = new this[role]();
    return s;
  } else {
    return new UserFactory(role);
  }
}

//工廠方法函數(shù)的原型中設(shè)置所有對(duì)象的構(gòu)造函數(shù)
UserFactory.prototype = {
  SuperAdmin: function() {
    this.name = "超級(jí)管理員",
    this.viewPage = ['首頁(yè)', '通訊錄', '發(fā)現(xiàn)頁(yè)', '應(yīng)用數(shù)據(jù)', '權(quán)限管理']
  },
  Admin: function() {
    this.name = "管理員",
    this.viewPage = ['首頁(yè)', '通訊錄', '發(fā)現(xiàn)頁(yè)', '應(yīng)用數(shù)據(jù)']
  },
  NormalUser: function() {
    this.name = '普通用戶',
    this.viewPage = ['首頁(yè)', '通訊錄', '發(fā)現(xiàn)頁(yè)']
  }
}

//調(diào)用
let superAdmin = UserFactory('SuperAdmin');
let admin = UserFactory('Admin') 
let normalUser = UserFactory('NormalUser')

3、觀察者模式
4、裝飾器模式
5、適配器模式
6、代理模式

回流重繪

回流:長(zhǎng)寬等發(fā)生變化,會(huì)引起布局變化
重繪:顏色,顯示變化
1、使用transform代替
2、visibility代替display:none
3、避免table布局
4、css層級(jí)減少
5、動(dòng)畫用在position為absolute或fixed,復(fù)雜元素絕對(duì)定位脫離文檔流
6、css3硬件加速,transform\opacity,filter不引起
7、js少操作dom,樣式

原型繼承

ip mac

虛擬(一個(gè)地址可以對(duì)應(yīng)多個(gè)IP),物理(網(wǎng)卡)

位運(yùn)算

加法,找出數(shù)組中唯一出現(xiàn)的數(shù)

二面

vue @click

jQuery 事件代理

rem如何實(shí)現(xiàn)

跨域

同源策略,協(xié)議域名端口都一致
1、后端加Access-Control-Allow等字段,不安全
2、腳手架webpack,node正向代理,proxy
3、nginx反向代理,proxy_pass
4、jsonp,script標(biāo)簽沒(méi)有同源限制

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容