前言
寫部落格主要是用來總結、鞏固知識點,加深自己對這個知識點的理解。同時希望能幫助到有需要的人。如有不正確的地方。可以在評論區指出。你們的支援。是我不斷進步的源泉。
金三銀四跳槽季,我相信很多人應該都在看新的機會吧(其實就只有我了)。把一些常見的自認為比較經典的面試題在這裡做個梳理。同時也給再給找工作的小夥伴們一個參考。
1.vue的生命週期
我們先看張圖
這是vue官方文件裡的生命週期圖,我結合這張圖來說下我的理解 vue的生命週期一共分為8個階段。
1.beforeCreated階段此時是獲取不到props,data裡的任何資料,因為此時資料還未初始化 created階段可以訪問之前訪問不到的資料,但此時元件還沒有掛載,所以el是訪問不到的。
2.beforeMounted階段開始執行render函式,el和data資料開始執行。但此時還是掛載在虛擬dom上 到了mounted階段才開始掛載到實際的dom上。此時我們可以進行ajax請求了。
3.beforeUpdated和updated分別是在資料更新的時候呼叫
4.最後就是銷燬元件的鉤子函式 beforeDestroy 和 destroyed。前者適合移除事件、定時器等等,否則可能會引起記憶體洩露的問題。然後進行一系列的銷燬操作,如果有子元件的話,也會遞迴銷燬子元件,所有子元件都銷燬完畢後才會執行根元件的 destroyed 鉤子函式。
2.什麼是巨集任務、微任務以及它們之間的區別
由於技術深入程度有限,我只能簡單的說下我對巨集任務微任務的理解:
js是單執行緒執行的,所以在佇列中會優先執行巨集任務,但是如果巨集任務裡面還有微任務的話,會優先把微任務執行完再去執行下一個巨集任務。具體看這裡
3.webpack和gulp的區別
Gulp 的定位是 Task Runner, 就是用來跑一個一個任務的
我們可以通過gulp配置task來編譯sass,less。進行圖片壓縮,程式碼壓縮等。但是gulp不能解決js模組的問題。這時候webpack就出現了。webpack可以把css,js。圖片等都打包成一個bundle。所以webpack也叫file bundler
同時webpack為了解決require不同的檔案。引入了核心之一的loader 我們可以通過sass-loader把sass編譯成css。 通過babel-loader可以把es6等轉換成瀏覽器識別的es5等。
webpack的核心就是entry,output,loader,puglin。
4.前端路由有那幾種方式
有hash,history兩種。 hash模式主要是通過hashchange來實現 history模式主要是通過pushstate和popstate方法。
5.瀏覽器的渲染過程
1.使用者輸入url
2.瀏覽器對輸入的url進行DNS解析
3.建立TCP連線(三次握手)
4.瀏覽器發起http請求
5.伺服器響應http請求
6.銷燬TCP連線(四次揮手)
7.瀏覽器通過渲染引擎進行頁面渲染。
6.for in 和 for of 的區別
for in 在陣列和物件中的使用
//遍歷陣列
var array=[1,2,3,4,5];
for(let item in array ){
console.log(item) // 0 1 2 3 4
}
//遍歷物件
var obj={
name:'leo',
age:26,
job:'FED'
}
for(let item in obj){
console.log(item) // name age job
}
複製程式碼
for of 在陣列和物件中的使用
//遍歷陣列
var array=[1,2,3,4,5];
for(let item of array ){
console.log(item) // 1 2 3 4 5
}
//遍歷物件
var obj={
name:'leo',
age:26,
job:'FED'
}
for(let item of obj){
console.log(item) // Error obj is not iterable
}
複製程式碼
從上面可以看出:for in 用來遍歷陣列和物件的key或索引。for of用來遍歷value。同時for of不能用來遍歷普通物件需要搭配Object.keys()來使用。如下
var obj = {
name: 'leo',
age: 26,
job: 'FED'
}
let objValue = Object.keys(obj);
for (let item of objValue) {
console.log(obj[item]) // leo 26 FED
}
複製程式碼
7.小程式中元件如何進行通訊
小程式中的元件如何建立,這裡就不詳細說明了。請移步官方文件檢視詳細教程
我們主要來討論下小程式中的元件如何進行通訊
1.頁面如何向自定義元件傳遞資料
//頁面使用自定義元件
<online userList="{{list}}"></online>
//元件online.js
Component({
properties:{
userList:{
type:Array,
value:[],
}
}
})
複製程式碼
這樣自定義元件就能拿到頁面的list資料了,怎麼樣是不是很簡單。
2.自定義元件如何傳遞資料給頁面
跟vue類似,元件間的資料互動主要是通過自定義事件。
自定義元件觸發事件時,需要使用 triggerEvent 方法,指定事件名、detail物件和事件選項: 來直觀的看程式碼:
<!-- 在自定義元件online中 -->
<button bindtap="onTap">點選這個按鈕將觸發myEvent事件</button>
Component({
properties:{},
methods:{
onTap() {
// detail物件,提供給事件監聽函式 (需要帶到主頁面的資料放這裡)
const myEventDetail = {
name:'leo',
age:26
}
//觸發事件的選項
//bubbles為事件是否冒泡
//composed 事件是否可以穿越元件邊界,為false時,事件將只能在引用元件的節點樹上觸發,不進入其他任何元件內部
//capturePhase 事件是否擁有捕獲階段
const myEventOption = {
"composed": true
}
this.triggerEvent('myEvent', myEventDetail, myEventOption)
}
}
})
<!--在頁面中監聽自定義事件-->
<online bind:myEvent="getData"></online>
getData (eventDetail) {
console.log(eventDetail)
// detail 所有的子元件的資料,都通過該引數的detail屬性暴露出來
}
複製程式碼
3.兄弟元件之間如何進行資料通訊
同樣的兄弟元件之間的通訊業可以通過自定義事件來解決。但是小程式中還為我們提供了另一種更輕巧的方法。可以通過relations屬性來解決。 有如下元件
<online>
<chat></chat>
</online>
複製程式碼
兩個元件捕獲到對方元件的例項,是通過 this.getRelationNodes()方法。既然獲取到了對方元件的例項,那麼就可以訪問到對方元件上的data, 也可以設定對方元件上的data, 但是不能呼叫對方元件上的方法。
<!--在online元件中-->
Component({
relations:{
'./chat': {
type: 'child',
linked:function(target){ } // target是元件online的例項,
linkChanged: function(target){}
unlinked: function(target){}
}
},
methods:{
test () {
var nodes = this.getRelationNodes('./chat')
var component_b = nodes[0];
// 獲取到b元件的資料
console.log(component_b.data.name)
// 需要呼叫對方元件的setData()方法來設定
component_b.setData({
name:'leo93'
})
}
}
})
<!--在chat元件中-->
Component({
relations:{
'./online':{
type:'parent'
}
},
data:{
name:'leo'
}
})
複製程式碼
注意:必須在兩個元件定義中都加入relations定義,否則不會生效。
本元件無法獲取本元件的例項,使用this.getRelatonsNodes('./ path_to_self ') 會返回一個null
type 可以選擇的 parent 、 child 、 ancestor 、 descendant
8.exports和module.exports,export和export default他們之間的區別
首先exports和module.exports 都是屬於node模組裡的
export和export default屬於ES6模組裡
exports 是屬於module.exports的一個引用
export與export default均可用於匯出常量、函式、檔案、模組等
在一個檔案或模組中,export、import可以有多個,export default僅有一個
通過export方式匯出,在匯入時要加{ },export default則不需要
export能直接匯出變數表示式,export default不行。
9.微信中openId和unionId的區別
兩者長度不一樣
openId=28;
unionId=29;
複製程式碼
openId同一使用者同一應用中是唯一的
unionId同一使用者在同一個微信公眾平臺的多個應用中是唯一的。
10.寫出你所知道的所有讓一個div元素垂直水平居中的方法
關於這個問題,可以看我的這篇文章
11.什麼是原型,原型鏈
js中每當定義一個物件的時候,物件中都會包含一些預定義的屬性,其中就包括prototype。prototype執行物件的原型。使用原型物件的好處是,所有物件的實列都包含他的屬性和方法 原型鏈主要用來解決繼承的問題。 每個物件都有一個原型物件,通過proto指標指向其原型物件,並從中繼承方法和屬性,同事原型物件也可能擁有原型,這樣一層一層,最終指向null,這種關係被稱為原型鏈。
持續更新中。。。
如有描述不當的地方,懇請指正。謝謝!