1.sass/scss和less區(qū)別?
sass是一種動(dòng)態(tài)樣式語(yǔ)言,又稱為縮排語(yǔ)法,比css多出好些功能(比如變量、嵌套、運(yùn)算、混入Mixin、繼承、函數(shù)、顏色處理等)。但由于sass的縮排語(yǔ)法對(duì)于開發(fā)者來(lái)說(shuō)并不直觀,就對(duì)sass進(jìn)行了改進(jìn)變?yōu)閟css,用{}取代原來(lái)的縮進(jìn)。
less也是一種動(dòng)態(tài)樣式語(yǔ)言,對(duì)css賦予了動(dòng)態(tài)樣式特性,比如變量、繼承、函數(shù)、運(yùn)算等,less既可以在客戶端上運(yùn)行(支持IE 6+, Webkit, Firefox)也可以在服務(wù)端上運(yùn)行(借助 Node.js)。
區(qū)別:
1.編譯環(huán)境不一樣:Less在JS上運(yùn)行,Sass在Ruby上使用
2.變量符不一樣,Less是@,而Scss是$。
3.輸出設(shè)置,Less沒有輸出設(shè)置,Sass提供4中輸出選項(xiàng):nested, compact, compressed 和 expanded。
4.Sass支持條件語(yǔ)句,可以使用if{}else{},for{}循環(huán)等等。而Less不支持。5. 引用外部CSS文件
6.Sass和Less的工具庫(kù)不同
2.響應(yīng)式布局的實(shí)現(xiàn)方式有哪些?
媒體查詢
百分比
自適應(yīng)場(chǎng)景下的rem解決方案(設(shè)置viewport、rem2px和px2rem、postcss-loader)
參考:前端響應(yīng)式布局原理與方案(詳細(xì)版)
響應(yīng)式布局的常用解決方案對(duì)比(媒體查詢、百分比、rem和vw/vh)
3.ES6、ES7、ES8分別增加了哪些新特性?
es6:模塊化(export/import)、let和const、解構(gòu)賦值、擴(kuò)展運(yùn)算符、箭頭函數(shù)、Array和Object的新增方法、promise、Set和Map、symbol
es7:Array.include() (類型與)、**(指數(shù)運(yùn)算符,類似于Math.pow(2,10))
es8:async/awite、String pading(padStart(目標(biāo)長(zhǎng)度,占位內(nèi)容),padEnd)
ES6-10
4.vue彈窗后如何禁止?jié)L動(dòng)條滾動(dòng)?
vue自帶修飾符解決:@touchmove.prevent綁定到彈窗模塊
.stop:阻止事件冒泡
.prevent:阻止默認(rèn)事件的發(fā)生
.capture:事件捕獲
.self:只有事件自身可以觸發(fā)
.once:事件只能觸發(fā)一次
.navtive:某個(gè)組件的根元素上監(jiān)聽一個(gè)原生事件
5.函數(shù)的繼承有哪些?
a.原型鏈繼承:會(huì)導(dǎo)致引用值共享的問題
b.構(gòu)造函數(shù)繼承:解決引用值共享問題,但無(wú)法獲取原型上的方法
c.組合式繼承(偽金典繼承):解決引用值共享問題和無(wú)法獲取原型上方法的問題,但是又出現(xiàn)構(gòu)造函數(shù)復(fù)用的問題
d.寄生組合式繼承(金典繼承):通過Object.create()創(chuàng)建父類原型副本,與父類原型完全隔離,解決了構(gòu)造函數(shù)復(fù)用的問題
f:class(類)的extend關(guān)鍵字繼承:
6.未登錄前如何阻止手動(dòng)修改url里的路由信息進(jìn)行路由跳轉(zhuǎn)?
利用全局前置守衛(wèi)beforeEach做攔截判斷,首先判斷本地緩存中是否有token,如果沒有就重定向到"/login",如果有token還需要排除用戶輸入的是"/login"(防止嵌套卡死),如果用戶輸入的不是"/login",就需要處理用戶的所處角色的權(quán)限問題,判斷vuex中保存的角色路由變量roles是否為[],如果是[]就需要通過接口調(diào)用用戶信息,如果不為[]就直接進(jìn)入"/home"
7.vue中發(fā)生數(shù)據(jù)更新頁(yè)面沒更新的情況要怎么處理?
a.Vue.set( target, propertyName/index, value )
b.Object.assign()
直接使用Object.assign()添加到對(duì)象的新屬性不會(huì)觸發(fā)更新
應(yīng)創(chuàng)建一個(gè)新的對(duì)象,合并原對(duì)象和混入對(duì)象的屬性
c.this.$forceUpdate迫使Vue 實(shí)例重新渲染
8.encodeURIComponent()和decodeURIComponent()
如果你使用的get方法提交肯定要考慮到輸入項(xiàng)目的編碼解碼問題。
解決這個(gè)問題大家一般都使用encodeURI或者encodeURIComponent方法
encodeURIComponent:對(duì)字符進(jìn)行編碼
decodeURIComponent:對(duì)相應(yīng)編碼過的字符進(jìn)行解碼//傳遞 uni.navigateTo({ url: `/pagesJZ/receipt/applyReceipt?dataJson=` + >encodeURIComponent(JSON.stringify(item)) }); //接收 onLoad(option) { // #ifdef MP-WEIXIN || MP-TOUTIAO 只在微信和抖音編譯器顯示 let invoiceBasics = JSON.parse(decodeURIComponent(option.dataJson)); // #endif // #ifndef MP-WEIXIN || MP-TOUTIAO 除去微信和抖音編譯器顯示 let invoiceBasics = JSON.parse(option.dataJson); // #endif }
9.application/x-www-form-urlencoded與application/json的區(qū)別?
說(shuō)明:這兩個(gè)都是發(fā)送請(qǐng)求的格式說(shuō)明
content-type:application/x-www-form-urlencoded。提交的數(shù)據(jù)是鍵值對(duì):key-value格式
content-type:application/json。提交的數(shù)據(jù)是json格式
10.對(duì)uni.request()進(jìn)行二次封裝
/** * 封裝請(qǐng)求(async await 封裝uni.request) 對(duì)應(yīng)portal 項(xiàng)目 * method post/get * endpoint 接口方法名 * data 所需傳遞參數(shù) * load 是否需要loading */ async apiCall(method, endpoint, data, load) { if (load) { uni.showLoading({ title: '請(qǐng)稍候', mask: true }); } let token = uni.getStorageSync('token') || ''; let fullurl = this.BASEURI + endpoint; var contentType = 'application/x-www-form-urlencoded'; //var contentType = 'application/json;charset=UTF-8'; // data.authorization = token; let [error, res] = await uni.request({ url: fullurl, data: data, method: method, header: { 'content-type': contentType, 'authorization': token }, }); uni.hideLoading(); ...分情況判斷接口返回的狀態(tài) }
11.ajax axios fetch的區(qū)別?
ajax
實(shí)現(xiàn)了 局部數(shù)據(jù)刷新
本身是針對(duì)MVC的編程,多用于jquery項(xiàng)目,不符合現(xiàn)在前端MVVM的浪潮axios
通過promise實(shí)現(xiàn)對(duì)ajax技術(shù)的一種封裝
為MVVM框架而生 (vue react)
支持 Promise API
支持并發(fā)請(qǐng)求fetch
AJAX在ES6的替代品
fetch不是ajax的進(jìn)一步封裝,而是原生js,沒有使用XMLHttpRequest對(duì)象。
兼容性差axios本身具有以下特征:
1.從瀏覽器中創(chuàng)建 XMLHttpRequest
2.支持 Promise API
3.客戶端支持防止CSRF
4.提供了一些并發(fā)請(qǐng)求的接口(重要,方便了很多的操作)
5.從 node.js 創(chuàng)建 http 請(qǐng)求
6.攔截請(qǐng)求和響應(yīng)
7.轉(zhuǎn)換請(qǐng)求和響應(yīng)數(shù)據(jù)
8.取消請(qǐng)求
9.自動(dòng)轉(zhuǎn)換JSON數(shù)據(jù)
PS:防止CSRF:就是讓你的每個(gè)請(qǐng)求都帶一個(gè)從cookie中拿到的key, 根據(jù)瀏覽器同源策略(協(xié)議、域名、端口號(hào)三者都相同),假冒的網(wǎng)站是拿不到你cookie中得key的,這樣,后臺(tái)就可以輕松辨別出這個(gè)請(qǐng)求是否是用戶在假冒網(wǎng)站上的誤導(dǎo)輸入,從而采取正確的策略。
來(lái)源:ajax和axios、fetch的區(qū)別
淺談CSRF攻擊方式
Vue axios接口封裝和api管理
12.sessionStorage、localStorage和cookie的區(qū)別?
相同點(diǎn):都保存在瀏覽器上,且是同源的
區(qū)別:
13.css選擇器優(yōu)先級(jí)和權(quán)重
總結(jié)排序:!important > 行內(nèi)樣式>ID選擇器 > 類選擇器 > 標(biāo)簽 > 通配符 > 繼承 > 瀏覽器默認(rèn)屬性
內(nèi)聯(lián)樣式表的權(quán)值為 1000
ID 選擇器的權(quán)值為 100
Class 類選擇器的權(quán)值為 10
HTML 標(biāo)簽選擇器的權(quán)值為 1
我們可以把選擇器中規(guī)則對(duì)應(yīng)做加法,比較權(quán)值,如果權(quán)值相同那就后面的覆蓋前面的了,div.class的權(quán)值是1+10=11,而.test1 .test2的權(quán)值是10+10=20
14.css水平垂直居中有幾種實(shí)現(xiàn)方式?
1.單行文本水平垂直居中:text-align:center;+line-height
2.絕對(duì)定位:子絕父相,子元素設(shè)置寬高并且top/left/right/bottom都為0 + margin:auto;
3.絕對(duì)定位:子絕父相,子元素top:50%+left:50%+translate(-50%,-50%)
4.flex:伸縮容器上設(shè)置dispaly:flex,伸縮項(xiàng)上設(shè)置margin:auto;
5.flex:伸縮容器上設(shè)置diaplay:flex;justify-content(主軸對(duì)齊方式):center;align-items(側(cè)軸對(duì)齊方式):center;
css實(shí)現(xiàn)水平垂直居中的幾種方式
15.冒泡排序
let arr = [5,4,3,2,1]; 輪數(shù) 5 4 3 2 1 比較的次數(shù) 每一輪比較的次數(shù) 第一輪 4 3 2 1 5 4次 arr.length-1-0 第二輪 3 2 1 4 5 3次 arr.length-1-1 第三輪 2 1 3 4 5 2次 arr.length-1-2 第四輪 1 2 3 4 5 1次 arr.length-1-3 數(shù)組一共5個(gè)數(shù)(arr.length) 一共經(jīng)歷輪數(shù):arr.length-1 //先循環(huán)輪數(shù),在每輪循環(huán)中對(duì)元素進(jìn)行多次比較 for(let i = 0;i < arr.length-1;i++){ for(let j = 0; j < arr.length-1-i; j++){ if(arr[j] > arr[j+1]){ let temp = arr[j] arr[j] = arr[j+1] arr[j+1] = temp } } } console.log(arr); //[1,2,3,4,5]
16.翻轉(zhuǎn)數(shù)組
let arr = [1,2,3,4,5,6,7,8] 交換次數(shù) 1 2 3 4 5 6 7 8 交換的兩個(gè)數(shù)分別索引 交換1次 8 2 3 4 5 6 7 1 arr[0] arr[arr.length-1-0] 交換2次 8 7 3 4 5 6 2 1 arr[1] arr[arr.length-1-1] 交換3次 8 7 6 4 5 3 2 1 arr[2] arr[arr.length-1-2] 交換4次 8 7 6 5 4 3 2 1 arr[3] arr[arr.length-1-3] 數(shù)組總數(shù):arr.length 對(duì)折交換次數(shù):arr.length/2 //先循環(huán)交換的次數(shù),返回借助第三方變量交換兩個(gè)變量的值 for(let i = 0; i < arr.length/2;i++){ let temp = arr[i] arr[i] = arr[arr.length-1-i] arr[arr.length-1-i] = temp } console.log(arr); //[8,7,6,5,4,3,2,1]
17.數(shù)組的去重
let arr = [8,11,5,20,0,20,5,1,5,9,4,5] //1.創(chuàng)建一個(gè)新數(shù)組,將原數(shù)組的第一個(gè)元素添加到新數(shù)組 //2.循環(huán)遍歷原數(shù)組,將數(shù)組中的元素和新數(shù)組中的元素進(jìn)行比較,不相同時(shí)加入新數(shù)組 let temp = []; temp[0] = arr[0]; //循環(huán)原數(shù)組 for(let i = 0; i < arr.length;i++){ //遍歷新數(shù)組 for(let j = 0; j < temp.length;j++){ if(temp[j] == arr[i]){ break; } //一直循環(huán)對(duì)比到新數(shù)組的最后一個(gè)元素還不相同時(shí),將原數(shù)組中元素添加到新數(shù)組 if(j == temp.length-1){ temp.push(arr[i]) } } } console.log(temp) //[8, 11, 5, 20, 0, 1, 9, 4]
18.route和router的區(qū)別
$router :代表的是路由實(shí)例對(duì)象, 是路由操作對(duì)象(包含了路由的跳轉(zhuǎn)方法),只寫對(duì)象 $route :代表當(dāng)前路由信息對(duì)象,只讀對(duì)象(獲取當(dāng)前路由的參數(shù)) 傳參可以使用params和query兩種方式: 1.使用query傳參使用path來(lái)引入路由 this.$router.push(path:'XXX',query:{key:vlaue}) 2.使用params傳參只能用name來(lái)引入路由,即push里面只能是name:’xxxx’,不能是path:’/xxx’,因?yàn)閜arams只能用name來(lái)引入路由,如果這里寫成了path,接收參數(shù)頁(yè)面會(huì)是undefined!?。his.$router.push(name:'XXX',params:{key:value}) 3.二者還有點(diǎn)區(qū)別,直白的來(lái)說(shuō)query相當(dāng)于get請(qǐng)求,頁(yè)面跳轉(zhuǎn)的時(shí)候,可以在地址欄看到請(qǐng)求參數(shù),而params相當(dāng)于post請(qǐng)求,參數(shù)不會(huì)再地址欄中顯示
19.請(qǐng)給出輸出結(jié)果
async function async1(){ await async2(); console.log(2); } async function async2(){ console.log(3) } console.log(1) async1() setTimeout(()=>{ console.log(4) },0); new Promise((resolve)=>{ console.log(5); resolve(); }).then(function(){ console.log(6) }).then(function(){ console.log(7) }); console.log(8); 輸出結(jié)果:1 3 2 5 8 6 7 4
20.JavaScript判斷對(duì)象是否為空對(duì)象或空數(shù)組
1.判斷是對(duì)象還是數(shù)組?
Object.prototype.toString.call(obj) === '[object Array]'
Object.prototype.toString.call(obj) === '[object Object]'
2.判斷一個(gè)對(duì)象是否是空對(duì)象
JSON.stringify(obj) === '{}'
Object.keys(obj).length === 0
3.判斷一個(gè)數(shù)組是否是空數(shù)組
length屬性
21.vue3.0的6大亮點(diǎn)
1.性能比vue2.x快
2.按需編譯,體積比2.x更小
3.新增組合API(類似于React Hooks)
4.更好的TS支持
5.暴露了自定義渲染API
6.具有更先進(jìn)的組件vue3.0是如何變快的?
1.優(yōu)化了diff算法,vur2.x是全量比較,3.0新增了靜態(tài)標(biāo)記,與上次虛擬節(jié)點(diǎn)進(jìn)行對(duì)比的時(shí)候只比較帶有靜態(tài)標(biāo)記的
2.靜態(tài)提升:vue2.x中無(wú)論元素是否參與更新,都需要重新創(chuàng)建然后在渲染,但vue3.0中對(duì)不參與更新的元素做靜態(tài)提升,元素只會(huì)創(chuàng)建一次,渲染的時(shí)候直接復(fù)用
3.事件監(jiān)聽緩存:vue2.x在默認(rèn)情況下將onclick視為動(dòng)態(tài)綁定(綁定靜態(tài)標(biāo)記),所以每次都會(huì)追蹤它的變化去比較,但3.0中沒有追蹤它的變化,而是直接緩存起來(lái)復(fù)用
22.flex
6個(gè)設(shè)置在容器上的屬性:
flex-direction:決定主軸的方向
flex-wrap:一條軸線排不下是否換行
flex-flow:是flex-direction和flex-wrap的簡(jiǎn)寫,默認(rèn)值:row nowrap
justify-content:定義項(xiàng)目在主軸上的對(duì)齊方式
align-items:定義項(xiàng)目在側(cè)軸上的對(duì)齊方式
align-content:定義了多根軸線的對(duì)齊方式,如果項(xiàng)目還有一根軸線就不起作用6個(gè)設(shè)置在項(xiàng)目上的屬性:
order:定義項(xiàng)目的排列順序,越小的越靠前,默認(rèn)值0
flex-grow:定義項(xiàng)目的放大比例,默認(rèn)值0,即為存在剩余空間也不放大
flex-shrink:定義了項(xiàng)目的縮小比例,默認(rèn)值1,即為空間不足該項(xiàng)目將縮小
flex-bases:定義了在分配多余空間之前,項(xiàng)目占據(jù)主軸的空間,默認(rèn)值auto,即項(xiàng)目本來(lái)的大小
flex:是flex-grow,flex-shrink,flex-basis的簡(jiǎn)寫,默認(rèn)值0 1 auto
align-self:允許單個(gè)項(xiàng)目和其他項(xiàng)目不同的排雷方式
23.云打印業(yè)務(wù)流程
WebSocket1.創(chuàng)建websocket對(duì)象 //url為指定連接的URL, [protocol]為可選的子協(xié)議 var websocket = new Websocket(url, [protocol]); 3)常用事件 websocket.open:連接建立時(shí)候觸發(fā) websocket.message:客戶端接收服務(wù)端數(shù)據(jù)時(shí)觸發(fā) websocket.error:通信發(fā)生錯(cuò)誤時(shí)觸發(fā) websocket.close:連接關(guān)閉時(shí)觸發(fā) websocket.send():使用連接發(fā)送數(shù)據(jù)
24.vue中hash和history區(qū)別?
- hash模式url帶#號(hào),history模式不帶#號(hào)
- hash:#之前的內(nèi)容會(huì)被包含在請(qǐng)求中,所以對(duì)于后端來(lái)說(shuō)既是沒有做到路由的全面覆蓋也不會(huì)返回404
- history:前端的url必須和后端請(qǐng)求一致,否則就會(huì)報(bào)404
25.uniapp用過的api
應(yīng)用生命周期:只能寫在App.vue里監(jiān)聽頁(yè)面生命周期
- onLaunch 當(dāng)uni-app 初始化完成時(shí)觸發(fā)(全局只觸發(fā)一次)
- onShow 當(dāng) uni-app 啟動(dòng),或從后臺(tái)進(jìn)入前臺(tái)顯示
- onHide 當(dāng) uni-app 從前臺(tái)進(jìn)入后臺(tái)
- onError 當(dāng) uni-app 報(bào)錯(cuò)時(shí)觸發(fā)
頁(yè)面生命周期:
- onLoad:只加載一次,監(jiān)聽頁(yè)面加載,其參數(shù)為上個(gè)頁(yè)面?zhèn)鬟f的數(shù)據(jù),參數(shù)類型為Object.
- onShow:監(jiān)聽頁(yè)面顯示。頁(yè)面每次出現(xiàn)在屏幕上都觸發(fā),包括從下級(jí)頁(yè)面點(diǎn)返回露出當(dāng)前頁(yè)面。
注意點(diǎn):
從二級(jí)頁(yè)面返回該頁(yè)面時(shí),onLoad不會(huì)再次加載,而onshow會(huì)重新加載。
onLoad先于onShow執(zhí)行
onLoad頁(yè)面的整個(gè)生命周期里,只執(zhí)行一次
onShow頁(yè)面的整個(gè)生命周期里,可執(zhí)行多次,即每次顯示都會(huì)執(zhí)行
獲取參數(shù)并且只請(qǐng)求一次的事件放在 onLoad 里。
當(dāng)前頁(yè)面需要時(shí)時(shí)刷數(shù)據(jù)的請(qǐng)求多次的事件放在 onShow 里。- onPullDownRefresh:下拉刷新
注意點(diǎn):
需要在 pages.json 里,找到的當(dāng)前頁(yè)面的pages節(jié)點(diǎn),并在 style 選項(xiàng)中開啟enablePullDownRefresh。
當(dāng)處理完數(shù)據(jù)刷新后,uni.stopPullDownRefresh 可以停止當(dāng)前頁(yè)面的下拉刷新。- stopPullDownRefresh:停止當(dāng)前頁(yè)面的下拉刷新
- onReachBottom:加載更多(上拉加載),頁(yè)面滾動(dòng)到底部拉去下一頁(yè)數(shù)據(jù)
注意點(diǎn):
需要在pages.json里定義某個(gè)頁(yè)面底部的觸發(fā)距離onReachBottomDistance。
如果用 scroll-view 組件時(shí),這個(gè)方法不起作用,請(qǐng)按照 scroll-view 組件的頁(yè)面觸底加載更多的方法處理。- onShareAppMessage:用戶點(diǎn)擊右上角分享
- onShareTimeline:監(jiān)聽用戶點(diǎn)擊右上角轉(zhuǎn)發(fā)到朋友圈
- onReady:監(jiān)聽頁(yè)面初次渲染完成。注意如果渲染速度快,會(huì)在頁(yè)面進(jìn)入動(dòng)畫完成前觸發(fā)
26.js中的截取字符串的是哪個(gè)方法substring()、substr()、slice()
相同點(diǎn):三個(gè)方法都是對(duì)字符串的截取,返回一個(gè)新的字符串,也不會(huì)對(duì)原字符串進(jìn)行修改
不同點(diǎn):
- substring(start,end):通過下標(biāo)的方式截取,包頭不包尾,start比end大會(huì)交換位置,參數(shù)存在負(fù)數(shù)會(huì)自動(dòng)轉(zhuǎn)為0(不支持負(fù)數(shù))
- substr(start,length):通過下標(biāo)和指定長(zhǎng)度截取,start為負(fù)數(shù)就從右→左執(zhí)行(-1是字符串的最后一個(gè)元素),length是負(fù)數(shù),直接當(dāng)0處理返回“”
- slice(start,end):通過下標(biāo)截取,包頭不包尾,支持負(fù)數(shù)
//當(dāng)start或者end為負(fù)值時(shí),定位方式和substr一直,從右往左數(shù),從1開始 var a = '0123456789' a.slice(1,-1)//起始點(diǎn)從第1(包括)開始,結(jié)束點(diǎn)為從右往左數(shù)第1個(gè)(不包括) "12345678" //start到end的順序始終是從左到右,如果最終start的位置在end的右邊,那么返回''" a.slice(-2,1)//-2所在的位置是'8',1所在的位置是'1',從8=>1,方向相反,返回為空 "" a.slice(-2,-1)//-2所在的位置是'8',-1所在的位置是'9',從8=>9,方向正常,返回為'8' "8"
27.vue雙向綁定的原理(Vue 響應(yīng)式原理)
vue.js 采用數(shù)據(jù)劫持結(jié)合發(fā)布-訂閱模式,通過 Object.defineproperty 來(lái)劫持各個(gè)屬性的 setter,getter,在數(shù)據(jù)變動(dòng)時(shí)發(fā)布消息給訂閱者,觸發(fā)響應(yīng)的監(jiān)聽回調(diào)
28.理解MVVM
MVVM是View-Model-ViewModel的縮寫,View代表用戶視圖層,Model代表數(shù)據(jù)模型,ViewModel:相當(dāng)于業(yè)務(wù)邏輯層,作為連接View和Model的橋梁。
當(dāng)數(shù)據(jù)變化的時(shí),ViewModel監(jiān)聽到數(shù)據(jù)的變化,自動(dòng)更新視圖,當(dāng)用戶操作視圖,ViewModel也能監(jiān)聽到視圖的變化,通知數(shù)據(jù)改動(dòng),實(shí)現(xiàn)雙向綁定。
29.Vue 組件 data 為什么必須是函數(shù)?
因?yàn)榻M件是復(fù)用,js的對(duì)象的引用類型,如果組件的data是一個(gè)對(duì)象,那么子組件中data就會(huì)相互污染
30.js的執(zhí)行機(jī)制,宏任務(wù)與微任務(wù)
JS的執(zhí)行是單線程的,它基于事件循環(huán)。事件循環(huán)分為以下幾個(gè)步驟:
1.所有同步事件都在主線程上執(zhí)行,形成一個(gè)“執(zhí)行?!?br> 2.主線程之外還存在一個(gè)“任務(wù)隊(duì)列”,只要異步任務(wù)有了執(zhí)行結(jié)果就會(huì)加入到“任務(wù)隊(duì)列”中
3.一旦“執(zhí)行?!敝械乃型饺蝿?wù)執(zhí)行完成后,系統(tǒng)就會(huì)讀取“任務(wù)隊(duì)列”,將“任務(wù)隊(duì)列”中的事件加入“執(zhí)行棧”開始執(zhí)行
4.主線程不斷重復(fù)以上三個(gè)過程
宏任務(wù):主代碼塊,setTimeout,setInterval等
微任務(wù):Promise,process.nextTick等


