復(fù)習(xí)

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ù)流程

WebSocket

1.創(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"

參考:js中的截取字符串的是哪個(gè)方法substring()、substr()、slice()

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等

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容