傳說中的前端100問
一、第1-10題
- (滴滴)寫react、vue專案是為什麼要在列表元件中寫key,其作用是什麼?
key是給每一個vnode的唯一id,可以依靠key,更準確,更快的拿到oldVnode中對應的vnode節點
2.什麼是防抖、節流?有什麼區別?如何實現?
防抖:觸發高頻事件後n秒內只會執行一次,如果n秒內高頻事件再次被觸發,測重新計算事件
思路:每次觸發事件時都會取消之前的延時回撥方法.
節流:高頻事件觸發,但在n秒內只會執行一次,所以節流會稀釋函式的執行頻率
思路:每次觸發事件時都判斷當前是否有等待執行的延時函式
3.介紹一下set、map、weakSet和weakMap的區別?
set和map主要的應用場景在於資料重組和資料儲存
set是一個叫做集合的資料結構類似於陣列,但是成員時唯一且無序的,沒有重複的值
//陣列去重 let arr=[1,2,3,4,1] [...new Set(arr)]
向set中加入值時,不會發生型別轉換
weakSet物件允許你將弱引用物件儲存在一個集合中
weakset物件於set的區別:
weakset只能儲存物件引用,不能存放值,而set物件都可以
Map(字典)集合與字典的區別:
共同點:集合、字典可以儲存不重複的值
不同點:集合是以【vaue,value】的形式儲存,字典是以[key,value]的形式儲存
- 本質上時鍵值對的集合,類似集合
- 可以遍歷,方法很多可以跟各種資料格式轉化
weakMap
- 只接受物件作為鍵名,不接受其他型別的值作為鍵名
- 鍵名時弱引用,鍵值可以是任意的,鍵名所指向的物件可以被垃圾回收,此時鍵名是無效的
- 不能遍歷,方法有get、set、has、delete
4.已知如下陣列:
var arr=[ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];編寫一個程式將陣列扁平化並去除其中重複部分資料,最終得到一個升序且不重複的陣列
var arr=[ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]; let arr1=[]; arr1=[...new Set(arr.flat(Infinity))].sort((a,b)=>a-b) console.log(arr1)
5.有以下3個判斷陣列的方法,請分別介紹他們的區別和優劣
Object.prototype.toString.call()、instanceof以及Array.isArray()
1.Object.prototype.toString.call()這種方法對於所有基本的資料型別都能進行判斷,即使是null和undefined.
2.instanceof的內部機制是通過判斷物件向的原型鏈中是不是能找到型別的prototype。
[] instanceof Array;//true
3.Array.isArray()
6.請把兩個陣列 ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2'] 和 ['A', 'B', 'C', 'D'],合併為 ['A1', 'A2', 'A', 'B1', 'B2', 'B', 'C1', 'C2', 'C', 'D1', 'D2', 'D']。
let a1=['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2']; let a2=['A','B','C','D'].map((item)=>{ return item+3 }); let a3=[...a1,...a2].sort().map((item)=>{ if(item.includes('3')){ returen item.split('')[0] } return item })勤學似春起之苗,不見其增,日有所長; 輟學如磨刀之石,不見其損,日所有虧!