根據(jù)自己的面試經(jīng)驗整理出一些常見的問題, 答案是自己寫的, 有些不一定正確或存在疏漏, 僅供參考
1. promise相關(guān)
講一講你對promise的理解?
promise是ES6新增的語言標(biāo)準(zhǔn),主要是為了解決異步執(zhí)行的回調(diào)地獄('回調(diào)金字塔').
所謂回調(diào)地獄,就是:在原始的異步執(zhí)行中,異步操作需要放在回調(diào)函數(shù)中,才能確保順序執(zhí)行,但如果有多個回調(diào)函數(shù),會造成層層嵌套的情況,這就是回調(diào)地獄.
promise是一個對象,有三個狀態(tài):pending,fullfilled和rejected狀態(tài),提供了兩個回調(diào)函數(shù)reslove和reject.
promise在es7中的新語法?
async function a(){
await ......//一個promise對象
}
promise多個任務(wù)如何并發(fā)執(zhí)行?
promise.all([promise對象1,promise對象2,promise對象3...])
2. vue的生命周期相關(guān)
簡述一下vue的生命周期和鉤子函數(shù)?
創(chuàng)建 beforeCreate
created
掛載 beforeMount
mounted
更新 beforeUpdate
updated
刪除 beforeDestory
destoryed
你一般在哪個周期執(zhí)行代碼,為什么?
略
3. 深拷貝與淺拷貝
深拷貝與淺拷貝的區(qū)別?如何實現(xiàn)?
淺拷貝和直接賦值還是有區(qū)別的;
針對引用類型來說,直接賦值是直接將整個obj對象的地址賦值給新的obj,當(dāng)原obj中的屬性發(fā)生變化時,被復(fù)制的對象也會被修改;
淺拷貝是遍歷原obj中的每個值,并將其賦值給新obj,修改原obj中的基本類型屬性,新obj的屬性不會被改變.修改原obj中的引用類型屬性,新obj的屬性值會發(fā)生改變.淺拷貝有四種實現(xiàn)方法:
a.obj.assign()
b.遍歷
c.數(shù)組api concat和splice
d.剩余參數(shù) var arr2=[...arr1]
深拷貝
原obj發(fā)生改變時,復(fù)制的obj不會發(fā)生任何變化.深拷貝有以下實現(xiàn)方式:
a.json.stringify
b.遞歸遍歷
4. es6新特性相關(guān)
你知道哪些es6新特性?
- let,const和塊級作用域;
- 箭頭函數(shù)
- 模板字符串
- arguments
- promise
- 數(shù)組的新的api
- 數(shù)組解構(gòu)與參數(shù)解構(gòu)
你用過哪些es6新特性?
略
5. 組件傳參
組件傳參的方式有哪些?能介紹一下嗎?
- props
- 路由傳參
- commits
- bus
- vuex
- ref
6. 路由守衛(wèi)
路由守衛(wèi)有哪幾類?
三類:全局守衛(wèi)(beforeEach
,beforeReslove
,afterEach
),組件內(nèi)守衛(wèi)(beforeRouteEnter
,beforeRouteUpdate
,beforeRouteleave
)和路由獨享守衛(wèi)(beforeEnter
)
路由守衛(wèi)的觸發(fā)順序?
beforeEach
-> beforeRouteEnter
-> beforeReslove
-> afterEach
-> beforeRouteLeave
7. vue雙向綁定的原理
什么是mvvm模型?
mvvm模式是一種對前端代碼重新進(jìn)行劃分的模式,即
模型model:數(shù)據(jù)模型,包括了數(shù)據(jù)和方法
視圖view:即增強(qiáng)的html和css,可以實現(xiàn)分支和循環(huán)
視圖模型viewmodel:能自動將視圖中的對象與模型中的數(shù)據(jù)與方法進(jìn)行同步.
vue實現(xiàn)雙向綁定的原理是什么?
vue中,數(shù)據(jù)改變控制視圖改變主要通過數(shù)據(jù)劫持,即訪問者和觀察者模式,視圖改變控制視圖改變主要通過事件監(jiān)聽來實現(xiàn).
8. 閉包相關(guān)
談一談你對閉包的理解?
閉包是一種現(xiàn)象,具體寫法就是通過將內(nèi)層函數(shù)和內(nèi)層函數(shù)所需要全局變量包裹在一個外層函數(shù)中,通過調(diào)用外層函數(shù)返回出來,從而達(dá)到避免全局污染的效果.
閉包有哪些運用場景呢?
- 閉包可以用來防止全局污染;
- 閉包可以用來維持變量,比如函數(shù)軻里化
9. Vuex
談一談你對vuex的了解?
a.vuex是......
vuex有哪些屬性和方法?分別是做什么用的?
states
:vuex中存儲數(shù)據(jù)的地方,相當(dāng)于data
mutations
:對數(shù)據(jù)進(jìn)行操作的地方,相當(dāng)于methods
getters
:vuex中的計算屬性,相當(dāng)于computed
actions
:處理異步函數(shù)發(fā)送請求的地方
modules
:擴(kuò)展類的東西
10. Token
談一談你對token的理解?你在項目中使用過token嗎?
token可以理解為加密的cookies,主要用來驗證用戶登錄狀態(tài),在服務(wù)器中生成加密token,跟隨網(wǎng)絡(luò)請求在前后端傳遞,在客戶端存儲在webstroage中
11. 箭頭函數(shù)
箭頭函數(shù)和匿名函數(shù)有什么區(qū)別?
- 箭頭函數(shù)的this指向上下文,匿名函數(shù)的this指向上下文;
- 箭頭函數(shù)的參數(shù)使用...res,匿名函數(shù)的參數(shù)使用arguments;
- 箭頭函數(shù)的原型不是function.
12. 數(shù)組去重
說一說數(shù)組去重的方法
- 數(shù)組遍歷去重;
- Set()對象;
- 對象去重.
13. js判斷數(shù)據(jù)類型
談一談js中有哪些判斷數(shù)據(jù)類型的方法
- typeof
- instance of
- Object.prototype.toString().call(obj)
14. 原型鏈相關(guān)
談?wù)勀銓υ玩湹睦斫?/strong>
15. flex相關(guān)
flex的后面的參數(shù)是什么,分別有什么含義?
flex:flex-grow flex-shrink flex-basis;
/* 增長 減少 基寬 */
flex項目如何垂直居中?
align-items:center;
你在項目中是如何使用flex的?
做頁面適配時要用;
16. jsonp跨域
17. axios同步執(zhí)行
如何讓axios同步執(zhí)行?
async await
方法
18. dom優(yōu)化
你在平時是如何優(yōu)化DOM的?
- 查找元素優(yōu)化,優(yōu)先使用類選擇器和類選擇器
- 改變dom時,使用托盤
- 修改dom樣式時,使用domobj.style.cssText=" ...一些樣式 ";
- 批量修改DOM元素時,從文檔流中摘除該元素
- 減少iframs的使用,因為會消耗大量時間,并阻塞下載
- 把js文件寫在</body>中,<script>寫在header中
19. css居中
css中有哪些方式可以給元素居中?
20. http緩存的兩種方式
http緩存有哪些方式?分別是什么?
21. vue優(yōu)化
你是如何優(yōu)化你的vue項目的?
- v-once;
- 懶加載;
- 為v-for添加key;
22. 組件封裝
...
23. element-ui如何引入(全局引入和局部引入)
如何實現(xiàn)element的全局和局部引入?
24. 跨域
什么是跨域?
你在編程過程中有沒有遇到過跨域問題,你是怎么解決的?有哪些方法可以解決跨域問題?
25. 高度坍塌
什么是高度坍塌?
子元素浮動脫離文檔流,從而導(dǎo)致高度不能被撐開,稱為高度坍塌
高度坍塌的解決方案?
- 使用:after偽類,設(shè)置清除浮動;
- 父元素定高;
- 父元素設(shè)置overflow;
26. h5新特性
27. c3新特性
28. let和var的區(qū)別
- var 定義的變量會出現(xiàn)聲明提前(變量提升),let不會.
- var定義的變量沒有塊級作用域(大括號就是塊級作用域),let具有塊級作用域
- var可以重復(fù)聲明同一個變量,但let不可以
29. 數(shù)組遍歷的方式
for(var i=0;i<arr.lrngth;i++)
for(var key in arr)
for(var elem of arr)
arr.foreach()
arr.reduce/every/some/map...
30. watch和computed的區(qū)別
- 返回值不同,computed返回的是一個屬性,主要被當(dāng)作屬性來使用,watch保存的是操作,主要被當(dāng)做方法來使用
- 操作不同,computed是藉其他的依賴值來計算目標(biāo)值.而watch是監(jiān)聽目標(biāo)值的變化而進(jìn)行一系列操作
- 寫法不同,computed中的目標(biāo)值后面不需要加()來調(diào)用,而watch中的需要
31. v-if和v-show的區(qū)別
v-if控制的是元素是否存在,如果值為false,則該元素從DOM樹上移除了;
v-show控制的是元素的display,如果值為false,則該元素的display成為none.
31. nexttick的使用場景
nexttick是異步任務(wù)的一種,屬于異步任務(wù)的微任務(wù),且優(yōu)先級極高,所以如果你想在完成某些異步任務(wù)后立即執(zhí)行操作,應(yīng)該使用nexttick.
vue.nexttick有兩種主要使用場景:
- 在created鉤子函數(shù)中,DOM樹還未構(gòu)建完成,此時你若想對Dom樹進(jìn)行操作,應(yīng)該使用nexttick以在DOM樹加載完成之后立即執(zhí)行;
- 因為vue的數(shù)據(jù)更新與視圖更新是異步的,因此,若想對試圖修改后的DOM元素進(jìn)行立即操作,應(yīng)使用nexttick.
33. bootstrap是css/scss還是less
scss
34. get和post的區(qū)別
- get請求在URL中傳送的參數(shù)是有長度限制的,而post沒有;
- 對參數(shù)的數(shù)據(jù)類型,get只接受ASCII字符别厘,而post沒有限制;
- get比post更不安全(不是說post安全),因為參數(shù)直接暴露在URL上拥诡,所以不能用來傳遞敏感信息;
- get參數(shù)通過URL傳遞触趴,post放在request body中。
35. 數(shù)組解構(gòu)與對象解構(gòu)
36. 單頁面應(yīng)用的優(yōu)缺點
優(yōu)點:
- 用戶瀏覽體驗好;
- 前后端分離
- 減輕服務(wù)器壓力
- 多個終端共用一套后臺
缺點:
- 搜索引擎優(yōu)化比較難
- 首頁加載比較慢
- 前進(jìn)后退需要自己寫堆棧
37. vue自帶組件
- keep-alive 主要用于保留組件狀態(tài)或避免重新渲染,包裹動態(tài)組件時渴肉,會緩存不活動的組件實例冗懦,而不是銷毀它們。
- component 渲染一個“元組件”為動態(tài)組件仇祭。依 is 的值披蕉,來決定哪個組件被渲染。
- transition 作為單個元素/組件的過渡效果
- transition-group 作為多個元素/組件的過渡效果
- slot 插槽
38. 事件修飾符?
<button @click.stop="inner">點擊我(^_^)</button>
- .stop:等同于JavaScript中的event.stopPropagation()乌奇,防止事件冒泡
- .prevent:等同于JavaScript中的event.preventDefault()没讲,防止執(zhí)行預(yù)設(shè)的行為(如果事件可取消,則取消該事件礁苗,而不停止事件的進(jìn)一步傳播)
- .capture:與事件冒泡的方向相反爬凑,事件捕獲由外到內(nèi)
- .self:只會觸發(fā)自己范圍內(nèi)的事件,不包含子元素
- .once:只會觸發(fā)一次
39. v-for為什么不能和v-if同時使用?
v-for的優(yōu)先級高于v-if,如果v-if為false的話,v-for扔會執(zhí)行,這也就造成了不必要的內(nèi)存損耗
40. v-for你一般用什么方法設(shè)置key,這有什么劣勢?如何改進(jìn)?
一般用index,但index在刪除某個元素后,會自動變更,如原來有5個元素,刪除3號后,便變?yōu)榱?234,而我們的期望是1245,也就是說,index沒有實現(xiàn)為每個元素添加唯一索引的目的,因此,我們常用的方法是維數(shù)組中的每個對象添加其特有的id屬性,將其賦給key
41. 如果直接為data中的對象設(shè)置屬性會怎么樣?應(yīng)該如何解決?
會無法實現(xiàn)數(shù)據(jù)綁定,需要使用vue中的$set方法,寫法如下
this.$set(Object, key, value)
this.$set(Array, index, newValue)
42. 要求父元素div包裹兩個子元素div,第一個子元素固定為100px;第二個子元素自動填充剩余元素,你要怎么才能寫出一個兼容性佳的代碼?
.parent {
position: relative;
}
.left {
position: absolute;
top: 0;
left: 0;
width: 100px;
}
.right {
position: absolute;
top: 0;
right: 0;
left: 100px;
}