因?yàn)榻梃b的文章比較多加上個(gè)人理解整理交煞,沒(méi)有備注來(lái)源。如侵權(quán)比刪斟或!
一素征、js的數(shù)據(jù)類型
ES5的5種:
基本數(shù)據(jù)類型: Number、 String萝挤、 Boolean御毅、 undefined、 null
復(fù)雜數(shù)據(jù)類型:Object怜珍、function端蛆、Array
ES6新增
Symbol 表示獨(dú)一無(wú)二
ES10新增:
BigLnt 表示任意大的數(shù)
ps:存儲(chǔ)區(qū)別
基本數(shù)據(jù)類型和引用數(shù)據(jù)類型存儲(chǔ)在內(nèi)存中的位置不同:
- 基本數(shù)據(jù)類型存儲(chǔ)在棧中
- 引用類型的對(duì)象存儲(chǔ)于堆中
二、undefined和null的區(qū)別
相同點(diǎn):
1酥泛、在if語(yǔ)句中null和undefined都會(huì)轉(zhuǎn)換為false
2今豆、用 == 比較 返回true
null ==undefined // true
不同點(diǎn):
undefined:代表的含義未定義
null: 表示一個(gè)空對(duì)象指針
typeof undefined //'undefined'
typeof null // "object"
三、判斷 JavaScript 的數(shù)據(jù)類型typeof
typeof:type的返回值是字符串(String)
typeof undefined // "undefined"
typeof null // "object"
typeof 1 // "number"
typeof "1" // "string"
typeof Symbol() // "symbol"
typeof function() {} // "function"
typeof {} // "object"
typeof 不能識(shí)別 null柔袁,如何識(shí)別 null呆躲?[使用全等即可]
let a = null
a === null
instanceof: 可以用來(lái)判斷對(duì)象的類型:
instanceof
只能正確判斷引用數(shù)據(jù)類型 而不能判斷基本數(shù)據(jù)類型,
原因:其內(nèi)部運(yùn)行機(jī)制是判斷在其原型鏈中能否找到該類型的原型
或者可以理解為:一個(gè)對(duì)象是否在一個(gè)類的示例上
var date = new Date()
date instanceof Date // true
var number = new Number()
number instanceof Number // true
var string = new String()
string instanceof String // true
四捶索、js數(shù)據(jù)類型轉(zhuǎn)換
強(qiáng)制類型轉(zhuǎn)換
轉(zhuǎn)化成字符串 toString() String()
轉(zhuǎn)換成數(shù)字 Number()插掂、 parseInt()、 parseFloat()
轉(zhuǎn)換成布爾類型 Boolean()
隱式類型轉(zhuǎn)換
"" + - / % === =
例子:
轉(zhuǎn)換為數(shù)字
Number():可以把任意值轉(zhuǎn)換成數(shù)字情组,如果有不是數(shù)字的值燥筷,則會(huì)返回NaN
------------------
Number('1') // 1
Number(true) // 1
Number('123a') // NaN
// 空字符串轉(zhuǎn)為0
Number('') // 0
// 布爾值:true 轉(zhuǎn)成 1箩祥,
//false 轉(zhuǎn)成 0
Number(true) // 1
Number(false) // 0
// undefined:轉(zhuǎn)成 NaN
Number(undefined) // NaN
// null:轉(zhuǎn)成0
Number(null) // 0
parseInt(string):解析一個(gè)字符串并返回指定基數(shù)的十進(jìn)制整數(shù)院崇,
------------------
parseInt('a123') // NaN 如果第一個(gè)字符不是數(shù)字或者符號(hào)就返回NaN
parseInt('123a') // 123
parseInt('32a3') //32
String()//轉(zhuǎn)換字符串
-------------------
String(1) // "1"
String("a") // "a" 字符串轉(zhuǎn)換后還是原來(lái)的值
String(true) // "true"
String(false) // "false"
String(undefined) // "undefined"
String(null) // "null"
Boolean()可以將任意類型的值轉(zhuǎn)為布爾值
-------------------
Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false
Boolean(1)// true
Boolean(NaN) // false
Boolean('') // false
Boolean({}) // true
Boolean([]) // true
隱式類型轉(zhuǎn)換
-------------------
- * 不進(jìn)行演示
一旦存在字符串,進(jìn)行字符串拼接操作
'1' + 1 // '11'
'1' + true // "1true"
'1' + false // "1false"
'1' + {} // "1[object Object]"
'1' + [] // "1"
'1' + undefined // "1undefined"
'1' + null // "1null"
5袍祖、==和===的區(qū)別
(==)相等操作符會(huì)做類型轉(zhuǎn)換底瓣,再進(jìn)行值的比較,
(===)全等運(yùn)算符不會(huì)做類型轉(zhuǎn)換
'' == '0' // false
1 == '1' // true
1 === '1' // false
6蕉陋、作用域
簡(jiǎn)單的理解就是變量的有效范圍捐凭。
可分為:全局作用域、函數(shù)作用域凳鬓、塊級(jí)作用域
全局作用域
函數(shù)最外層定義的變量擁有全局作用域茁肠,函數(shù)內(nèi)部是可以訪問(wèn)的
let inVariable = "全局作用域";
function fn() {
console.log(inVariable); // 全局作用域
}
fn();
函數(shù)作用域
函數(shù)作用域也叫局部作用域:如果一個(gè)變量是在函數(shù)內(nèi)部聲明的,那這些變量只能在函數(shù)下訪問(wèn)缩举,不能再函數(shù)以外去訪問(wèn)
function fn() {
let inVariable = "函數(shù)內(nèi)部變量";
console.log(inVariable)// "函數(shù)內(nèi)部變量";
}
fn();
//報(bào)錯(cuò)
console.log(inVariable); // Uncaught ReferenceError: inVariable is not defined
塊級(jí)作用域
ES6引入了塊級(jí)作用域 垦梆,【由大括號(hào)包裹匹颤,比如:if(){},for(){}等】
let
和const
關(guān)鍵字,和var
關(guān)鍵字不同【后續(xù)講解let、const托猩、var區(qū)別】
在大括號(hào)中使用let
和const
聲明的變量存在于塊級(jí)作用域中印蓖。在大括號(hào)之外不能訪問(wèn)這些變量
{
// 塊級(jí)作用域中的變量
let a = 'Hello';
var b = 'World';
console.log(a); // Hello
}
console.log(b); // 'World'
console.log(a); // 報(bào)錯(cuò):Uncaught ReferenceError: a is not defined
如何訪問(wèn)函數(shù)內(nèi)部的變量(本人面試時(shí)候有問(wèn)到)
1、通過(guò)return訪問(wèn):
function bar(value) {
var testValue = "hello word";
return testValue;
}
console.log(bar());//hello word
2京腥、通過(guò) 閉包 訪問(wèn)函數(shù)內(nèi)部變量
閉包的定義:閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)
可以理解成“定義在一個(gè)函數(shù)內(nèi)部的函數(shù)“
閉包是將函 數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的橋梁赦肃。”
function bar() {
var testValue = "hello";
var rusult = testValue + "Word";
function innser() {
console.log(rusult);//helloWord
return rusult;
}
return innser();
}
console.log(bar()); // "helloWord"
7公浪、var他宛、let、const之間的區(qū)別
var 聲明變量可以重復(fù)聲明欠气,而 let 不可以重復(fù)聲
var 是不受限于塊級(jí)作用域的堕汞,而 let 是受限于塊級(jí)作用域
var 可以在聲明的上面訪問(wèn)變量,而 let 有暫存死區(qū)晃琳,在聲明的上面訪問(wèn)變量會(huì)報(bào)錯(cuò)
var在全局作用域下聲明變量會(huì)導(dǎo)致變量掛載在 window
上let讯检、const 不會(huì)
const 聲明之后必須賦值,否則會(huì)報(bào)錯(cuò) const 定義不可變的量卫旱,改變了就會(huì)報(bào)錯(cuò)
const 和 let 一樣支持塊級(jí)作用域人灼、在聲明的上面訪問(wèn)變量會(huì)報(bào)錯(cuò)
上代碼var篇
//用var聲明的變量既是全局變量也是頂層變量,所謂頂層就是window
var a = 10;
console.log(window.a) // 10
//使用var聲明的變量存在變量提升的情況
console.log(a) // undefined
var a = 20
//在編譯階段顾翼,編譯器會(huì)將其變成以下執(zhí)行
var a;
console.log(a); //undefined
a = 20;
console.log(a); //20
//var 多次聲明
var a = 20
var a = 30
console.log(a) // 30
//在函數(shù)中使用使用var聲明變量時(shí)候投放,該變量是局部的
var a = 20
function change(){
var a = 30
}
change()
console.log(a) // 20
let篇
//let 具有塊級(jí)作用域
{
let a = 20
}
console.log(a) // 報(bào)錯(cuò)Uncaught ReferenceError: a is not defined
//不存在變量提升
console.log(a) // 報(bào)錯(cuò)Uncaught ReferenceError: Cannot access 'a' before initialization
let a = 2
// let 不允許相同作用域下聲明
let a = 20
let a = 30 //報(bào)錯(cuò)【累了具體報(bào)錯(cuò)不打印了】
const篇
//const聲明一個(gè)只讀的常量,一旦聲明适贸,常量的值就不能改變
const a = 1
a = 3 // 報(bào)錯(cuò)
//const一旦聲明變量灸芳,就必須立即初始化,不能留到以后賦值
const a;
// SyntaxError: Missing initializer in const declaration
const實(shí)際上保證的并不是變量的值不能改動(dòng)拜姿,而是變量指向的那個(gè)內(nèi)存地址的數(shù)據(jù)不能改動(dòng)烙样。
復(fù)雜數(shù)據(jù)類型變量指向的是內(nèi)存地址,保存的只是一個(gè)指向?qū)嶋H數(shù)據(jù)的指針蕊肥,const只能保證這個(gè)指針是固定的谒获,并不能確保改變量的結(jié)構(gòu)不變
const foo = {};
// 為 foo 添加一個(gè)屬性,可以成功
foo.a = 123;
foo.a // 123
// 將 foo 指向另一個(gè)對(duì)象壁却,就會(huì)報(bào)錯(cuò)
foo = {}; //報(bào)錯(cuò)
8批狱、閉包
閉包的概念就是:有權(quán)利訪問(wèn)另一個(gè)函數(shù)作用域中的變量,一般就是函數(shù)包裹著函數(shù)[之前有提到過(guò)閉包的定義]
閉包可以重用一個(gè)變量展东,且保證這個(gè)變量不會(huì)被污染的一種機(jī)制赔硫。這些變量的值始終保持在內(nèi)存中,不會(huì)被垃圾回收機(jī)制處理
閉包的缺點(diǎn):由于閉包會(huì)使得函數(shù)中的變量都被保存在內(nèi)存中盐肃,內(nèi)存消耗很大爪膊,所以不能濫用閉包向胡,否則會(huì)造成網(wǎng)頁(yè)的性能問(wèn)題
使用場(chǎng)景 :
防抖、節(jié)流惊完、函數(shù)套函數(shù)避免全局污染
創(chuàng)建私有變量
延長(zhǎng)變量的生命周期
//簡(jiǎn)單的閉包
function bar() {
var testValue = "hello";
var rusult = testValue + "Word";
function innser() {
console.log(rusult);//helloWord
return rusult;
}
return innser();
}
console.log(bar()); // "helloWord"
9僵芹、什么是內(nèi)存泄漏
內(nèi)存泄漏指任何對(duì)象在您不再擁有或需要它之后仍然存在
10、原型小槐、原型鏈
原型
- 每個(gè)函數(shù)都有一個(gè)
prototype
屬性拇派,被稱為顯示原型 - 每個(gè)引用數(shù)據(jù)類型都會(huì)有
_ _proto_ _
屬性,其被稱為隱式原型 - 每個(gè)引用數(shù)據(jù)類型,它的
_ _ proto_ _
屬性指向它的構(gòu)造函數(shù)的’prototype’屬性凿跳。 - 每個(gè)prototype原型都有一個(gè)
constructor
屬性件豌,指向它關(guān)聯(lián)的構(gòu)造函數(shù)。 - 當(dāng)試圖得到一個(gè)對(duì)象的屬性時(shí)控嗜,如果這個(gè)對(duì)象本身不存在這個(gè)屬性茧彤,那么就會(huì)去它的
_ _ proto_ _
屬性(也就是它的構(gòu)造函數(shù)的’prototype’屬性)中去尋找。
原型鏈
當(dāng)訪問(wèn)一個(gè)對(duì)象的某個(gè)屬性時(shí)疆栏,會(huì)先在這個(gè)對(duì)象本身屬性上查找曾掂,如果沒(méi)有找到,則會(huì)去它的proto隱式原型上查找壁顶,即它的構(gòu)造函數(shù)的prototype珠洗,如果還沒(méi)有找到就會(huì)再在構(gòu)造函數(shù)的prototype的proto中查找,這樣一層一層向上查找就會(huì)形成一個(gè)鏈?zhǔn)浇Y(jié)構(gòu)若专,我們稱為原型鏈许蓖。直到頂層返回null
11、什么是遞歸
遞歸:如果一個(gè)函數(shù)在內(nèi)部可以調(diào)用其本身调衰,那么這個(gè)函數(shù)就是遞歸函數(shù)膊爪。簡(jiǎn)單理解:函數(shù)內(nèi)部自己調(diào)用自己, 這個(gè)函數(shù)就是遞歸函數(shù)
注意:遞歸函數(shù)的作用和循環(huán)效果一樣,由于遞歸很容易發(fā)生“棧溢出”錯(cuò)誤(stack overflow)嚎莉,所以必須要加退出條件return米酬。
12、什么是防抖什么是節(jié)流
防抖:觸發(fā)高頻事件后 n 秒內(nèi)函數(shù)只會(huì)執(zhí)行一次萝喘,如果 n 秒內(nèi)高頻事件再次被觸發(fā)淮逻,則重新計(jì)算時(shí)間
應(yīng)用場(chǎng)景:用戶在輸入框中連續(xù)輸入一串字符時(shí)琼懊,可以通過(guò)防抖策略阁簸,只在輸入完后,才執(zhí)行查詢的請(qǐng)求哼丈,這樣可以有效減
少請(qǐng)求次數(shù)启妹,節(jié)約請(qǐng)求資源;
節(jié)流:高頻事件觸發(fā)醉旦,但在 n 秒內(nèi)只會(huì)執(zhí)行一次饶米,所以節(jié)流會(huì)稀釋函數(shù)的執(zhí)行頻率(也可以理解:可以減少一段時(shí)間內(nèi)事件的觸發(fā)頻率)
應(yīng)用場(chǎng)景: 鼠標(biāo)連續(xù)不斷地觸發(fā)某事件(如點(diǎn)擊)桨啃,只在單位時(shí)間內(nèi)只觸發(fā)一次;
區(qū)別:防抖動(dòng)是將多次執(zhí)行變?yōu)樽詈笠淮螆?zhí)行檬输,節(jié)流是將多次執(zhí)行變成每隔一段時(shí)間執(zhí)行照瘾。
13、call,apply和bind的區(qū)別
相同點(diǎn): 三個(gè)函數(shù)都會(huì)改變this的指向(調(diào)用這三個(gè)函數(shù)的函數(shù)內(nèi)部的this)
不同點(diǎn):
- call丧慈、apply與bind的差別
call和apply改變了函數(shù)的this上下文后便執(zhí)行該函數(shù),而bind則是返回改變了上下文后的一個(gè)函數(shù)析命。(bind不會(huì)立即執(zhí)行)
- call、apply的區(qū)別
他們倆之間的差別在于參數(shù)的區(qū)別逃默,call和apply的第一個(gè)參數(shù)都是要改變上下文的對(duì)象鹃愤,而call從第二個(gè)參數(shù)開(kāi)始以參數(shù)列表的形式展現(xiàn),apply則是把除了改變上下文對(duì)象的參數(shù)放在一個(gè)數(shù)組里面作為它的第二個(gè)參數(shù)
14完域、Localstorage软吐、sessionStorage、cookie 的區(qū)別
共同點(diǎn):都是保存在瀏覽器端的吟税,且同源
localStorage:聲生命周期永久生效凹耙,除非手動(dòng)刪除 否則關(guān)閉頁(yè)面也會(huì)存在
sessionStorage:生命周期為關(guān)閉瀏覽器窗口。
存儲(chǔ)大小:sessionStorage約5M肠仪、localStorage約20M
Cookie是服務(wù)器發(fā)給客戶端的特殊信息使兔,cookie是以文本的方式保存在客戶端(儲(chǔ)存量4k左右)。cookie可以設(shè)置過(guò)期時(shí)間藤韵,到達(dá)時(shí)間后自動(dòng)銷毀虐沥,如果沒(méi)有設(shè)置會(huì)隨瀏覽器的關(guān)閉而銷毀。cookei中儲(chǔ)存的數(shù)據(jù)會(huì)伴隨著每一次http請(qǐng)求發(fā)送到服務(wù)端泽艘。
15欲险、同源策略
MDN官方給定的概念:同源策略限制了從同一個(gè)源加載的文檔或腳本如何與來(lái)自另一個(gè)源的資源進(jìn)行交互。這是一個(gè)用于隔離潛在惡意文件的重要安全機(jī)制
通俗的理解:瀏覽器規(guī)定匹涮,A 網(wǎng)站的 JavaScript天试,不允許和非同源的網(wǎng)站 C 之間,進(jìn)行資源的交互
同源:協(xié)議然低,域名喜每,端口,三者必須一致
跨域
同源指的是兩個(gè) URL 的協(xié)議雳攘、域名带兜、端口一致,反之吨灭,則是跨域
跨域刚照,指的是從一個(gè)域名去請(qǐng)求另外一個(gè)域名的資源。即跨域名請(qǐng)求
跨域時(shí)喧兄,瀏覽器不能執(zhí)行其他域名網(wǎng)站的腳本无畔,是由瀏覽器的同源策略造成的啊楚,也是瀏覽器施加的安全限制。
怎么解決跨域
1浑彰、需要后臺(tái)配置cors進(jìn)行跨域恭理,原理是給服務(wù)器設(shè)置一個(gè)響應(yīng)頭,然后瀏覽器將會(huì)允許跨域請(qǐng)求
2郭变、jsonp:原理動(dòng)態(tài)創(chuàng)建一個(gè)script標(biāo)簽蚯斯,利用script標(biāo)簽的src屬性不受同源策略的限制。所有的src屬性和href都不會(huì)受同源策略的限制饵较∨那叮可以請(qǐng)求第三方服務(wù)器的數(shù)據(jù)內(nèi)容
3、反向代理
4循诉、ngex
16横辆、常見(jiàn)的http狀態(tài)碼
200:這個(gè)是最常見(jiàn)的http狀態(tài)碼,表示服務(wù)器已經(jīng)成功接受請(qǐng)求茄猫,并將返回客戶端所請(qǐng)求的最終結(jié)果
202:表示服務(wù)器已經(jīng)接受了請(qǐng)求狈蚤,但是還沒(méi)有處理,而且這個(gè)請(qǐng)求最終會(huì)不會(huì)處理還不確定
204:服務(wù)器成功處理了請(qǐng)求划纽,但沒(méi)有返回任何實(shí)體內(nèi)容 脆侮,可能會(huì)返回新的頭部元信息
301:客戶端請(qǐng)求的網(wǎng)頁(yè)已經(jīng)永久移動(dòng)到新的位置,當(dāng)鏈接發(fā)生變化時(shí)勇劣,返回301代碼告訴客戶端鏈接的變化靖避,客戶端保存新的鏈接,并向新的鏈接發(fā)出請(qǐng)求比默,已返回請(qǐng)求結(jié)果
404:請(qǐng)求失敗幻捏,客戶端請(qǐng)求的資源沒(méi)有找到或者是不存在
500:服務(wù)器遇到未知的錯(cuò)誤,導(dǎo)致無(wú)法完成客戶端當(dāng)前的請(qǐng)求命咐。
503:服務(wù)器由于臨時(shí)的服務(wù)器過(guò)載或者是維護(hù)篡九,無(wú)法解決當(dāng)前的請(qǐng)求,
17醋奠、事件循環(huán)機(jī)制EventLoop
Event Loop即事件循環(huán)榛臼,是解決javaScript單線程運(yùn)行阻塞的一種機(jī)制。
首先我們需要知道JS 是??阻塞單線程語(yǔ)?窜司,就是同一時(shí)間只能做一件事情
同步任務(wù)和異步任務(wù)
javascript是單線程沛善。單線程就意味著,所有任務(wù)需要排隊(duì)例证,前一個(gè)任務(wù)結(jié)束路呜,才會(huì)執(zhí)行后一個(gè)任務(wù)。如果前一個(gè)任務(wù)耗時(shí)很長(zhǎng)织咧,后一個(gè)任務(wù)就意味著等待胀葱。于是javascript所有任務(wù)分為兩種:同步任務(wù),異步任務(wù)
同步任務(wù):不需要等待可立即看到執(zhí)行結(jié)果笙蒙,比如console抵屿、promise 的回調(diào)
異步任務(wù):異步任務(wù)需要等待一定的時(shí)候才能看到結(jié)果,比如setTimeout捅位、setInterval轧葛、網(wǎng)絡(luò)請(qǐng)求(ajax)、script 腳本的執(zhí)行
異步任務(wù)分為:宏任務(wù)與微任務(wù)
宏任務(wù):script(整體代碼)艇搀、setTimeout尿扯、setInterval、UI 渲染焰雕、 I/O衷笋、postMessage、 MessageChannel矩屁、setImmediate(Node.js 環(huán)境)
微任務(wù):Promise辟宗、 MutaionObserver、process.nextTick(Node.js環(huán)境)
- 在執(zhí)行同步代碼的時(shí)候吝秕,如果遇到了異步事件泊脐,js 引擎并不會(huì)一直等待其返回結(jié)果,而是會(huì)將這個(gè)事件掛起烁峭,繼續(xù)執(zhí)行執(zhí)行棧中的其他任務(wù)
- 當(dāng)同步事件執(zhí)行完畢后容客,再將異步事件對(duì)應(yīng)的回調(diào)加入到與當(dāng)前執(zhí)行棧中,不同的另一個(gè)任務(wù)隊(duì)列中等待執(zhí)行约郁。
- 任務(wù)隊(duì)列可以分為宏任務(wù)對(duì)列和微任務(wù)對(duì)列耘柱,當(dāng)當(dāng)前執(zhí)行棧中的事件執(zhí)行完畢后,js 引擎首先會(huì)判斷微任務(wù)對(duì)列中是否有任務(wù)可以執(zhí)行棍现,如果有就將微任務(wù)隊(duì)列的事件壓入棧中執(zhí)行调煎。
- 當(dāng)微任務(wù)對(duì)列中的任務(wù)都執(zhí)行完成后再去判斷宏任務(wù)對(duì)列中的任務(wù)。
執(zhí)行順序
1己肮、先執(zhí)行主線程
2士袄、遇到宏隊(duì)列,放到宏隊(duì)列
3谎僻、遇到微隊(duì)列娄柳,放到微隊(duì)列,
4艘绍、主線程執(zhí)行完畢
5赤拒、執(zhí)行微隊(duì)列,微隊(duì)列執(zhí)行完畢
6、執(zhí)行一次宏隊(duì)列挎挖,中的一個(gè)任務(wù)这敬,執(zhí)行完畢
7、執(zhí)行微隊(duì)列蕉朵,執(zhí)行完畢
8崔涂、依次循環(huán)
上代碼:
setTimeout(function () {
console.log(1);
});
new Promise(function (resolve, reject) {
console.log(2);
resolve(3);
}).then(function (val) {
console.log(val);
});
console.log(4);
// 2431
setTimeout(function() {
console.log(1)
}, 0);
new Promise(function(resolve, reject) {
console.log(2);
resolve()
}).then(function() {
console.log(3)
});
process.nextTick(function () {
console.log(4)
})
console.log(5)
//25431
1、主線程開(kāi)始執(zhí)行始衅,遇到setTimeout冷蚂,將setTimeout的回調(diào)函數(shù)丟到宏任務(wù)隊(duì)列中
2、在往下執(zhí)行new Promise立即執(zhí)行汛闸,輸出2
3蝙茶、.then的回調(diào)函數(shù)丟到微任務(wù)隊(duì)列中,再繼續(xù)執(zhí)行
4、遇到process.nextTick诸老,同樣將回調(diào)函數(shù)扔到為任務(wù)隊(duì)列隆夯,再繼續(xù)執(zhí)行,輸出5
5孕锄、當(dāng)所有同步任務(wù)執(zhí)行完成后看有沒(méi)有可以執(zhí)行的微任務(wù)
6吮廉、因?yàn)閜rocess.nextTick指定的異步任務(wù)總是發(fā)生在所有異步任務(wù)之前,因此先執(zhí)行process.nextTick輸出4畸肆,然后執(zhí)行.then函數(shù)輸出3宦芦,第一輪執(zhí)行結(jié)束。
7轴脐、第二輪:從宏任務(wù)隊(duì)列開(kāi)始调卑,發(fā)現(xiàn)setTimeout回調(diào),輸出1執(zhí)行完畢大咱,因此結(jié)果是25431