1痰洒、js里的事件循環(huán)機制(event loop)
答:js事件循環(huán)中有異步隊列有兩種:宏任務(wù)隊列(macro)和微任務(wù)隊列(micro)
常見的宏任務(wù)比如:setTimeout科雳、setInterval、 setImmediate东且、script(整體代碼)、 I/O 操作、UI 渲染等昧绣。
常見的微任務(wù)比如:process。nextTick捶闸、Pormise夜畴、MutationObserver 等。
eventLoop循環(huán)過程:
1删壮、初始狀態(tài):微任務(wù)隊列只有一個script腳本贪绘;(整體代碼為宏任務(wù))
2、【宏任務(wù)階段】執(zhí)行script代碼央碟,創(chuàng)建宏任務(wù)到宏任務(wù)調(diào)用棧中税灌,創(chuàng)建的微任務(wù)到微任務(wù)調(diào)用棧中。
3、【微任務(wù)階段】執(zhí)行微任務(wù)菱涤,調(diào)出當(dāng)前微任務(wù)中的所有微任務(wù)苞也,一次性執(zhí)行,其中如果有宏任務(wù)推到宏任務(wù)棧中粘秆。
4如迟、【宏任務(wù)階段】執(zhí)行宏任務(wù),調(diào)用當(dāng)前宏任務(wù)棧中的第一個宏任務(wù)攻走,其中有創(chuàng)見的微任務(wù)推到微任務(wù)棧中殷勘。
5、如果代碼沒結(jié)束陋气,循環(huán)執(zhí)行3劳吠、4步驟。
總結(jié):1巩趁、宏任務(wù)和微任務(wù)是交替進(jìn)行的
2痒玩、每個宏任務(wù)只執(zhí)行棧中的第一個任務(wù),執(zhí)行完就執(zhí)行微任務(wù)议慰。微任務(wù)執(zhí)行棧中所有的微任務(wù)蠢古。
console.log('sync');
setTimeout(function () {
console.log('setTimeout')
}, 0);
var promise = new Promise(function (resolve, reject) {
console.log('promise');
setTimeout(function() {
promise.then(function(){
console.log('promise-setTimeout-then')
})
console.log('promise-setTimeout')
}, 0);
resolve();
});
promise.then(function() {
setTimeout(function() {
promise.then(function(){
console.log('then-setTimeout-then')
})
console.log('then-setTimeout')
}, 0);
console.log('then');
promise.then(function(){
console.log('then-than')
})
})
////宏任務(wù)階段
sync
promise
//微任務(wù)階段
then
then - than
//宏任務(wù)階段
setTimeout
//微任務(wù)階段(沒有任務(wù),沒有輸出)
//宏任務(wù)階段
promise - setTimeout
//微任務(wù)階段
promise - setTimeout - then
//宏任務(wù)階段
then - setTimeout
//微任務(wù)階段
then-setTimeout-then
如果不清楚請?zhí)D(zhuǎn)鏈接:https://blog.csdn.net/webjhh/article/details/116759051
2别凹、This指向怎么去改變
答:call草讶、apply、bind三個為改變this指向的方法炉菲。
共同點:第一個參數(shù)都為改變this的指針堕战。若第一參數(shù)為null/undefined,this默認(rèn)指向window
區(qū)別:call(無數(shù)個參數(shù))參數(shù)是一個一個傳遞拍霜。第一個參數(shù):改變this指向嘱丢;第二個參數(shù):實參;使用之后會自動執(zhí)行該函數(shù)
function fn(a,b,c){
console.log(this,a+b+c); // this指向window
}
fn();
fn.call(document,1,2,3);//call改變之后this指向document
//輸出 #document 6 1,2,3是實參 結(jié)果相加為6
apply(兩個參數(shù))是把所有參數(shù)組成一個數(shù)組傳遞祠饺。第一個參數(shù):改變this指向越驻;第二個參數(shù):數(shù)組(里面為實參);使用時候會自動執(zhí)行函數(shù)
function fn(a,b,c){
console.log(this,a+b+c);
}
fn();
fn.apply(document,[1,2,3]);
bind(無數(shù)個參數(shù))道偷,第一個參數(shù):改變this指向缀旁;第二個參數(shù)之后:實參;返回值為一個新的函數(shù)
function fn(a,b,c){
console.log(this,a+b+c); //window
}
let ff = fn.bind('小明',1,2,3); //手動調(diào)用一下
使用的時候需要手動調(diào)用下返回 的新函數(shù)(不會自動執(zhí)行)
3勺鸦、箭頭函數(shù)和function的區(qū)別
答:1并巍、箭頭函數(shù)語法比普通函數(shù)簡潔
2、箭頭函數(shù)沒有自己的this换途,它里面的this屬于函數(shù)的上下文中的this
對箭頭函數(shù)的了解:
語法比較簡單
沒有this指向arguments/window 如果有就是來自父級作用域懊渡。
4嘶窄、一個array去改變數(shù)組里的某一項,視圖里會發(fā)生變化嗎距贷?
答:直接改變數(shù)組是不能改變視圖的,修改array的length也無法觸發(fā)視圖更新吻谋。
觸發(fā)視圖更新的方法有如下幾種:
1忠蝗、Vue.set,可以設(shè)置對象或數(shù)組的值漓拾,通過key或數(shù)組索引阁最,可以觸發(fā)視圖更新
// 數(shù)組修改
Vue.set(array, indexOfItem, newValue)
this.array.$set(indexOfItem, newValue)
// 對象修改
Vue.set(obj, keyOfItem, newValue)
this.obj.$set(keyOfItem, newValue)
2、Vue.delete骇两,刪除對象或數(shù)組中元素速种,通過key或數(shù)組索引,可以觸發(fā)視圖更新
// 數(shù)組修改
Vue.delete(array, indexOfItem)
this.array.$delete(indexOfItem)
// 對象修改
Vue.delete(obj, keyOfItem)
this.obj.$delete(keyOfItem)
3低千、數(shù)組對象直接修改屬性配阵,可以觸發(fā)視圖更新
this.array[0].show = true;
this.array.forEach(function(item){
item.show = true;
});
4、splice方法修改數(shù)組示血,可以觸發(fā)視圖更新
this.array.splice(indexOfItem, 1, newElement)
5棋傍、數(shù)組賦值為新數(shù)組,可以觸發(fā)視圖更新
this.array = this.array.filter(...)
this.array = this.array.concat(...)
6难审、用Object.assign或lodash.assign可以為對象添加響應(yīng)式屬性瘫拣,可以觸發(fā)視圖更新
//Object.assign的單層的覆蓋前面的屬性,不會遞歸的合并屬性
this.obj = Object.assign({},this.obj,{a:1, b:2})
//assign與Object.assign一樣
this.obj = _.assign({},this.obj,{a:1, b:2})
//merge會遞歸的合并屬性
this.obj = _.merge({},this.obj,{a:1, b:2})
7告喊、Vue提供了如下的數(shù)組的變異方法麸拄,可以觸發(fā)視圖更新
push()
pop()
shift()
unshift()
splice()
sort()
reverse()