1.防抖和節(jié)流
防抖:在事件被觸發(fā)n秒后在執(zhí)行回調(diào)咕娄,如果在這n秒內(nèi)事件在此被調(diào)用則重新計(jì)時(shí)。(總的來說费变,適合多次事件一次響應(yīng)的情況)
實(shí)際舉例:在請(qǐng)求后臺(tái)數(shù)據(jù)時(shí)圣贸,由于網(wǎng)路慢的情況下吁峻,用戶多次點(diǎn)擊請(qǐng)求按鈕。
節(jié)流:規(guī)定一個(gè)時(shí)間用含,在這個(gè)時(shí)間內(nèi)啄骇,只能有一次觸發(fā)事件的回調(diào)函數(shù)執(zhí)行,如果在同一個(gè)時(shí)間內(nèi)某事件被多次觸發(fā)痪寻,只有一次能生效。(總的來說壹蔓,適合大量事件按時(shí)間做平均分配觸發(fā)猫态。)
實(shí)際舉例:當(dāng)實(shí)現(xiàn)dom拖拽功能時(shí)給拖拽元素綁定拖拽事件披摄,每當(dāng)元素稍微移動(dòng)一點(diǎn)就會(huì)觸發(fā)大量回調(diào)函數(shù),導(dǎo)致瀏覽器卡死义辕。
https://juejin.cn/post/6844903535125987335
2.js事件循環(huán)機(jī)制
- js是單線程執(zhí)行
- 宏任務(wù):script( 整體代碼)寓盗、setTimeout傀蚌、setInterval、I/O撩幽、UI 交互事件箩艺、setImmediate(Node.js 環(huán)境)
- 微任務(wù):Promise、MutaionObserver榨惰、process.nextTick(Node.js 環(huán)境)
js分為同步執(zhí)行和異步執(zhí)行兩個(gè)隊(duì)列静汤,當(dāng)同步執(zhí)行完畢,會(huì)執(zhí)行異步隊(duì)列恢暖。異步隊(duì)列中分為宏任務(wù)狰右、微任務(wù)棋蚌。優(yōu)先執(zhí)行微任務(wù)等微任務(wù)全部執(zhí)行完畢后再執(zhí)行宏任務(wù)挨队。
console.log('1');
setTimeout(function() {
console.log('2');
}, 0);
Promise.resolve().then(function() {
console.log('3');
}).then(function() {
console.log('4');
});
console.log('5');
執(zhí)行結(jié)果 1蒿往、5瓤漏、3、4蔬充、2
3.堆和棧
堆:隊(duì)列優(yōu)先饥漫,先出先進(jìn);動(dòng)態(tài)分配空間一般有程序員分配釋放积蜻,若程序員不釋放彻消,程序結(jié)束時(shí)又瀏覽器的垃圾回收機(jī)制進(jìn)行回收。(動(dòng)態(tài)分配的內(nèi)存如输,大小不定不會(huì)自動(dòng)釋放央勒;)
棧:先進(jìn)后出;由操作系統(tǒng)自動(dòng)分配釋放稳吮,存放函數(shù)的參數(shù)井濒,局部變量的值等瑞你。(自動(dòng)分配的內(nèi)存空間,它由系統(tǒng)自動(dòng)釋放者甲;)
- 與前端相關(guān)的內(nèi)容:
前端數(shù)據(jù)類型分為:
1.復(fù)雜類型:對(duì)象,數(shù)組鲫懒,函數(shù)等
2.簡單數(shù)據(jù)類型:undefined窥岩、null、 boolean晃洒、number朦乏、string - 簡單數(shù)據(jù)類型存放在棧中;復(fù)雜數(shù)據(jù)類型也存放在棧中,但是棧中存放的是指向堆中的地址值诲宇。因?yàn)閺?fù)雜類型數(shù)據(jù)大小不定不能存放在棧中惶翻,地址值的大小是確定的。
4.new操作符具體干了什么
1.創(chuàng)建空對(duì)象纺荧;
2.空對(duì)象的原型指針指向構(gòu)造函數(shù)的原型對(duì)象宙暇;
3.利用函數(shù)的call方法改變this指向议泵,在空對(duì)象上掛載屬性或方法;
4.返回對(duì)象型奥。
5.difft算法以及key
6.數(shù)組的方法
- 增:push()
- 刪:splice(); delete
- 改:splice()碉京; slice()
- 查:indexOf()谐宙、lastIndexOf()
- 循環(huán):map,filter厘灼,find,forEach
7.felx布局的缺點(diǎn)
- felx布局是css3中的新特性舰讹。兼容性差闪朱,IE9及以上瀏覽器不支持。
8.vue的優(yōu)化
- 路由懶加載
- keep-alive緩存頁面
- 使用v-show復(fù)用DOM
- v-for遍歷避免同事使用v-if
- 事件的銷毀
- 圖片懶加載
- 第三方插件按需引入(像element-ui這樣的第三方組件庫可以按需引入避免體積太大)
9.vue中data為什么是function不是object
- 對(duì)象是引用類型锄开,當(dāng)同一個(gè)組件被多次引用萍悴,它們的data都指向同一個(gè)內(nèi)存地址寓免,換句話說,所有的組件共享一組data數(shù)據(jù)撕予。
- 將data設(shè)置成一個(gè)函數(shù)蜈首,該函數(shù)會(huì)返回一個(gè)初始數(shù)據(jù)對(duì)象欢策,用function return其實(shí)就相當(dāng)于申明了薪的變量,相當(dāng)于獨(dú)立踩寇。
10.vue的響應(yīng)式原理
- 當(dāng)你把一個(gè)普通的對(duì)象傳入Vue實(shí)力作為data選項(xiàng)姑荷,Vue將遍歷此對(duì)象所有的property,并使用Object.defineProperty把這些propert全部轉(zhuǎn)為getter/setter這些getter/setter對(duì)于用戶來說是不可見的添寺,但是在內(nèi)部它們讓Vue能夠追蹤依賴懈费,在property被訪問和修改時(shí)通知變更,每個(gè)組件實(shí)例都對(duì)應(yīng)一個(gè)watcher吃力票罐,它會(huì)在組件渲染的過程中把“接觸”過的數(shù)據(jù)property記錄為依賴该押。之后當(dāng)依賴項(xiàng)的setter出發(fā)時(shí),會(huì)通知watcher烟具,從而使他關(guān)聯(lián)的組件重新渲染奠蹬。
11.為什么vue檢測不到對(duì)象和數(shù)組的變化
- 因?yàn)関ue無法檢測到propety增囤躁、刪,vue在初始化實(shí)例時(shí)會(huì)對(duì)propetty執(zhí)行g(shù)etter/setter言蛇,所以property必須在data對(duì)象上存在才能讓vue將它轉(zhuǎn)換為響應(yīng)式严沥。
- 解決方法:this.$set()
12.new Vue()實(shí)例中中姜,data可以直接是一個(gè)對(duì)象丢胚,為什么在vue組建中,data必須是一個(gè)函數(shù)呢兔跌?
- 因?yàn)榻M件是可以復(fù)用的,JS 里對(duì)象是引用關(guān)系,如果組件 data 是一個(gè)對(duì)象,那么子組件中的 data 屬性值會(huì)互相污染,產(chǎn)生副作用峡蟋。所以一個(gè)組件的 data 選項(xiàng)必須是一個(gè)函數(shù),因此每個(gè)實(shí)例可以維護(hù)一份被返回對(duì)象的獨(dú)立的拷貝蕊蝗。new Vue 的實(shí)例是不會(huì)被復(fù)用的,因此不存在以上問題。
13.computed 和 watch 有什么區(qū)別
- computed計(jì)算屬性:依賴其它屬性值夸楣,只有他依賴的屬性值發(fā)生改變,下一次獲取computed的值時(shí)才會(huì)重新計(jì)算computed的值石洗,如果和上次計(jì)算結(jié)果不一致紧显,重新渲染頁面。
- watch偵聽器:更多的是觀察的作用焦人,無緩存性花椭,類似于某些數(shù)據(jù)的監(jiān)聽回調(diào)房午,每當(dāng)監(jiān)聽的數(shù)據(jù)發(fā)生變化時(shí)都會(huì)執(zhí)行回調(diào)進(jìn)行后續(xù)操作郭厌。
computed和watch應(yīng)用場景
- computed:當(dāng)我們需要進(jìn)行數(shù)值計(jì)算,并且依賴于其它數(shù)據(jù)時(shí)宾娜,應(yīng)該使用computed扇售,因?yàn)榭梢岳胏omputed的緩存特性,避免每次獲取值時(shí)华弓, 都要重新計(jì)算困乒。
- watch:當(dāng)我們需要數(shù)據(jù)變化時(shí)執(zhí)行的操作時(shí)使用娜搂。
能使用箭頭函數(shù)定義computed和watch嗎?
- 不能使用箭頭函數(shù)來定義watcher函數(shù)欧引,理由是箭頭函數(shù)綁定了父級(jí)作用域的上下文芝此,所以this將不會(huì)按照期望指向Vue實(shí)例,為undefined岸更。
14.v-if和v-for在同一個(gè)標(biāo)簽中的執(zhí)行順序
- 當(dāng)它們處于同一節(jié)點(diǎn)膊升,v-for 的優(yōu)先級(jí)比 v-if 更高,這意味著 v-if 將分別重復(fù)運(yùn)行于每個(gè) v-for 循環(huán)中评肆。(官網(wǎng)文檔原話)