說(shuō)一下HTTP 3.0
HTTP/3基于UDP協(xié)議實(shí)現(xiàn)了類似于TCP的多路復(fù)用數(shù)據(jù)流疾宏、傳輸可靠性等功能,這套功能被稱為QUIC協(xié)議。
流量控制、傳輸可靠性功能:QUIC在UDP的基礎(chǔ)上增加了一層來(lái)保證數(shù)據(jù)傳輸可靠性疲恢,它提供了數(shù)據(jù)包重傳、擁塞控制瓷胧、以及其他一些TCP中的特性显拳。
集成TLS加密功能:目前QUIC使用TLS1.3,減少了握手所花費(fèi)的RTT數(shù)搓萧。
多路復(fù)用:同一物理連接上可以有多個(gè)獨(dú)立的邏輯數(shù)據(jù)流萎攒,實(shí)現(xiàn)了數(shù)據(jù)流的單獨(dú)傳輸遇八,解決了TCP的隊(duì)頭阻塞問(wèn)題。
快速握手:由于基于UDP耍休,可以實(shí)現(xiàn)使用0 ~ 1個(gè)RTT來(lái)建立連接。
箭頭函數(shù)與普通函數(shù)的區(qū)別
(1)箭頭函數(shù)比普通函數(shù)更加簡(jiǎn)潔
- 如果沒(méi)有參數(shù)货矮,就直接寫一個(gè)空括號(hào)即可
- 如果只有一個(gè)參數(shù)羊精,可以省去參數(shù)的括號(hào)
- 如果有多個(gè)參數(shù),用逗號(hào)分割
- 如果函數(shù)體的返回值只有一句囚玫,可以省略大括號(hào)
- 如果函數(shù)體不需要返回值喧锦,且只有一句話,可以給這個(gè)語(yǔ)句前面加一個(gè)void關(guān)鍵字抓督。最常見(jiàn)的就是調(diào)用一個(gè)函數(shù):
let fn = () => void doesNotReturn();
復(fù)制代碼
(2)箭頭函數(shù)沒(méi)有自己的this
箭頭函數(shù)不會(huì)創(chuàng)建自己的this燃少, 所以它沒(méi)有自己的this,它只會(huì)在自己作用域的上一層繼承this铃在。所以箭頭函數(shù)中this的指向在它在定義時(shí)已經(jīng)確定了阵具,之后不會(huì)改變。
(3)箭頭函數(shù)繼承來(lái)的this指向永遠(yuǎn)不會(huì)改變
var id = 'GLOBAL';
var obj = {
id: 'OBJ',
a: function(){
console.log(this.id);
},
b: () => {
console.log(this.id);
}
};
obj.a(); // 'OBJ'
obj.b(); // 'GLOBAL'
new obj.a() // undefined
new obj.b() // Uncaught TypeError: obj.b is not a constructor
復(fù)制代碼
對(duì)象obj的方法b是使用箭頭函數(shù)定義的定铜,這個(gè)函數(shù)中的this就永遠(yuǎn)指向它定義時(shí)所處的全局執(zhí)行環(huán)境中的this阳液,即便這個(gè)函數(shù)是作為對(duì)象obj的方法調(diào)用,this依舊指向Window對(duì)象揣炕。需要注意帘皿,定義對(duì)象的大括號(hào){}
是無(wú)法形成一個(gè)單獨(dú)的執(zhí)行環(huán)境的,它依舊是處于全局執(zhí)行環(huán)境中畸陡。
(4)call()鹰溜、apply()、bind()等方法不能改變箭頭函數(shù)中this的指向
var id = 'Global';
let fun1 = () => {
console.log(this.id)
};
fun1(); // 'Global'
fun1.call({id: 'Obj'}); // 'Global'
fun1.apply({id: 'Obj'}); // 'Global'
fun1.bind({id: 'Obj'})(); // 'Global'
復(fù)制代碼
(5)箭頭函數(shù)不能作為構(gòu)造函數(shù)使用
構(gòu)造函數(shù)在new的步驟在上面已經(jīng)說(shuō)過(guò)了丁恭,實(shí)際上第二步就是將函數(shù)中的this指向該對(duì)象曹动。 但是由于箭頭函數(shù)時(shí)沒(méi)有自己的this的,且this指向外層的執(zhí)行環(huán)境涩惑,且不能改變指向仁期,所以不能當(dāng)做構(gòu)造函數(shù)使用。
(6)箭頭函數(shù)沒(méi)有自己的arguments
箭頭函數(shù)沒(méi)有自己的arguments對(duì)象竭恬。在箭頭函數(shù)中訪問(wèn)arguments實(shí)際上獲得的是它外層函數(shù)的arguments值跛蛋。
(7)箭頭函數(shù)沒(méi)有prototype
(8)箭頭函數(shù)不能用作Generator函數(shù),不能使用yeild關(guān)鍵字
Loader和Plugin 有什么區(qū)別
Loader:直譯為"加載器"痊硕。Webpack將一切文件視為模塊赊级,但是webpack原生是只能解析js文件,如果想將其他文件也打包的話岔绸,就會(huì)用到loader
理逊。 所以Loader的作用是讓webpack擁有了加載和解析非JavaScript文件的能力橡伞。 Plugin:直譯為"插件"。Plugin可以擴(kuò)展webpack的功能晋被,讓webpack具有更多的靈活性兑徘。 在 Webpack 運(yùn)行的生命周期中會(huì)廣播出許多事件,Plugin 可以監(jiān)聽(tīng)這些事件羡洛,在合適的時(shí)機(jī)通過(guò) Webpack 提供的 API 改變輸出結(jié)果挂脑。
setTimeout、Promise欲侮、Async/Await 的區(qū)別
(1)setTimeout
console.log('script start') //1. 打印 script start
setTimeout(function(){
console.log('settimeout') // 4. 打印 settimeout
}) // 2. 調(diào)用 setTimeout 函數(shù)崭闲,并定義其完成后執(zhí)行的回調(diào)函數(shù)
console.log('script end') //3. 打印 script start
// 輸出順序:script start->script end->settimeout
復(fù)制代碼
(2)Promise
Promise本身是同步的立即執(zhí)行函數(shù), 當(dāng)在executor中執(zhí)行resolve或者reject的時(shí)候, 此時(shí)是異步操作威蕉, 會(huì)先執(zhí)行then/catch等刁俭,當(dāng)主棧完成后,才會(huì)去調(diào)用resolve/reject中存放的方法執(zhí)行韧涨,打印p的時(shí)候牍戚,是打印的返回結(jié)果,一個(gè)Promise實(shí)例氓奈。
console.log('script start')
let promise1 = new Promise(function (resolve) {
console.log('promise1')
resolve()
console.log('promise1 end')
}).then(function () {
console.log('promise2')
})
setTimeout(function(){
console.log('settimeout')
})
console.log('script end')
// 輸出順序: script start->promise1->promise1 end->script end->promise2->settimeout
復(fù)制代碼
當(dāng)JS主線程執(zhí)行到Promise對(duì)象時(shí):
- promise1.then() 的回調(diào)就是一個(gè) task
- promise1 是 resolved或rejected: 那這個(gè) task 就會(huì)放入當(dāng)前事件循環(huán)回合的 microtask queue
- promise1 是 pending: 這個(gè) task 就會(huì)放入 事件循環(huán)的未來(lái)的某個(gè)(可能下一個(gè))回合的 microtask queue 中
- setTimeout 的回調(diào)也是個(gè) task 翘魄,它會(huì)被放入 macrotask queue 即使是 0ms 的情況
(3)async/await
async function async1(){
console.log('async1 start');
await async2();
console.log('async1 end')
}
async function async2(){
console.log('async2')
}
console.log('script start');
async1();
console.log('script end')
// 輸出順序:script start->async1 start->async2->script end->async1 end
復(fù)制代碼
async 函數(shù)返回一個(gè) Promise 對(duì)象,當(dāng)函數(shù)執(zhí)行的時(shí)候舀奶,一旦遇到 await 就會(huì)先返回暑竟,等到觸發(fā)的異步操作完成,再執(zhí)行函數(shù)體內(nèi)后面的語(yǔ)句育勺〉纾可以理解為,是讓出了線程涧至,跳出了 async 函數(shù)體腹躁。
例如:
async function func1() {
return 1
}
console.log(func1())
復(fù)制代碼
[圖片上傳失敗...(image-a8a221-1661775315811)] func1的運(yùn)行結(jié)果其實(shí)就是一個(gè)Promise對(duì)象。因此也可以使用then來(lái)處理后續(xù)邏輯南蓬。
func1().then(res => {
console.log(res); // 30
})
復(fù)制代碼
await的含義為等待纺非,也就是 async 函數(shù)需要等待await后的函數(shù)執(zhí)行完成并且有了返回結(jié)果(Promise對(duì)象)之后,才能繼續(xù)執(zhí)行下面的代碼赘方。await通過(guò)返回一個(gè)Promise對(duì)象來(lái)實(shí)現(xiàn)同步的效果烧颖。
瀏覽器是如何對(duì) HTML5 的離線儲(chǔ)存資源進(jìn)行管理和加載?
- 在線的情況下窄陡,瀏覽器發(fā)現(xiàn) html 頭部有 manifest 屬性炕淮,它會(huì)請(qǐng)求 manifest 文件,如果是第一次訪問(wèn)頁(yè)面 跳夭,那么瀏覽器就會(huì)根據(jù) manifest 文件的內(nèi)容下載相應(yīng)的資源并且進(jìn)行離線存儲(chǔ)涂圆。如果已經(jīng)訪問(wèn)過(guò)頁(yè)面并且資源已經(jīng)進(jìn)行離線存儲(chǔ)了们镜,那么瀏覽器就會(huì)使用離線的資源加載頁(yè)面,然后瀏覽器會(huì)對(duì)比新的 manifest 文件與舊的 manifest 文件润歉,如果文件沒(méi)有發(fā)生改變模狭,就不做任何操作,如果文件改變了踩衩,就會(huì)重新下載文件中的資源并進(jìn)行離線存儲(chǔ)胞皱。
- 離線的情況下,瀏覽器會(huì)直接使用離線存儲(chǔ)的資源九妈。
vuex
vuex是一個(gè)專為vue.js應(yīng)用程序開(kāi)發(fā)的狀態(tài)管理器,它采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài)雾鬼,并且以相
應(yīng)的規(guī)則保證狀態(tài)以一種可以預(yù)測(cè)的方式發(fā)生變化萌朱。
state: vuex使用單一狀態(tài)樹(shù),用一個(gè)對(duì)象就包含來(lái)全部的應(yīng)用層級(jí)狀態(tài)
mutation: 更改vuex中state的狀態(tài)的唯一方法就是提交mutation
action: action提交的是mutation策菜,而不是直接變更狀態(tài)晶疼,action可以包含任意異步操作
getter: 相當(dāng)于vue中的computed計(jì)算屬性
復(fù)制代碼
代碼輸出結(jié)果
const first = () => (new Promise((resolve, reject) => {
console.log(3);
let p = new Promise((resolve, reject) => {
console.log(7);
setTimeout(() => {
console.log(5);
resolve(6);
console.log(p)
}, 0)
resolve(1);
});
resolve(2);
p.then((arg) => {
console.log(arg);
});
}));
first().then((arg) => {
console.log(arg);
});
console.log(4);
復(fù)制代碼
輸出結(jié)果如下:
3
7
4
1
2
5
Promise{<resolved>: 1}
復(fù)制代碼
代碼的執(zhí)行過(guò)程如下:
- 首先會(huì)進(jìn)入Promise,打印出3又憨,之后進(jìn)入下面的Promise翠霍,打印出7;
- 遇到了定時(shí)器蠢莺,將其加入宏任務(wù)隊(duì)列寒匙;
- 執(zhí)行Promise p中的resolve,狀態(tài)變?yōu)閞esolved躏将,返回值為1锄弱;
- 執(zhí)行Promise first中的resolve,狀態(tài)變?yōu)閞esolved祸憋,返回值為2会宪;
- 遇到p.then,將其加入微任務(wù)隊(duì)列蚯窥,遇到first().then掸鹅,將其加入任務(wù)隊(duì)列;
- 執(zhí)行外面的代碼拦赠,打印出4巍沙;
- 這樣第一輪宏任務(wù)就執(zhí)行完了,開(kāi)始執(zhí)行微任務(wù)隊(duì)列中的任務(wù)矛紫,先后打印出1和2赎瞎;
- 這樣微任務(wù)就執(zhí)行完了,開(kāi)始執(zhí)行下一輪宏任務(wù)颊咬,宏任務(wù)隊(duì)列中有一個(gè)定時(shí)器务甥,執(zhí)行它牡辽,打印出5,由于執(zhí)行已經(jīng)變?yōu)閞esolved狀態(tài)敞临,所以
resolve(6)
不會(huì)再執(zhí)行态辛; - 最后
console.log(p)
打印出Promise{<resolved>: 1}
;
setTimeout 模擬 setInterval
描述:使用setTimeout
模擬實(shí)現(xiàn)setInterval
的功能挺尿。
實(shí)現(xiàn):
const mySetInterval(fn, time) {
let timer = null;
const interval = () => {
timer = setTimeout(() => {
fn(); // time 時(shí)間之后會(huì)執(zhí)行真正的函數(shù)fn
interval(); // 同時(shí)再次調(diào)用interval本身
}, time)
}
interval(); // 開(kāi)始執(zhí)行
// 返回用于關(guān)閉定時(shí)器的函數(shù)
return () => clearTimeout(timer);
}
// 測(cè)試
const cancel = mySetInterval(() => console.log(1), 400);
setTimeout(() => {
cancel();
}, 1000);
// 打印兩次1
復(fù)制代碼
函數(shù)中的arguments是數(shù)組嗎奏黑?類數(shù)組轉(zhuǎn)數(shù)組的方法了解一下?
是類數(shù)組编矾,是屬于鴨子類型的范疇熟史,長(zhǎng)得像數(shù)組,
- ... 運(yùn)算符
- Array.from
- Array.prototype.slice.apply(arguments)
實(shí)現(xiàn)一個(gè)扇形
用CSS實(shí)現(xiàn)扇形的思路和三角形基本一致窄俏,就是多了一個(gè)圓角的樣式蹂匹,實(shí)現(xiàn)一個(gè)90°的扇形:
div{
border: 100px solid transparent;
width: 0;
heigt: 0;
border-radius: 100px;
border-top-color: red;
}
復(fù)制代碼
如果一個(gè)構(gòu)造函數(shù),bind了一個(gè)對(duì)象凹蜈,用這個(gè)構(gòu)造函數(shù)創(chuàng)建出的實(shí)例會(huì)繼承這個(gè)對(duì)象的屬性嗎限寞?為什么?
不會(huì)繼承仰坦,因?yàn)楦鶕?jù) this 綁定四大規(guī)則履植,new 綁定的優(yōu)先級(jí)高于 bind 顯示綁定,通過(guò) new 進(jìn)行構(gòu)造函數(shù)調(diào)用時(shí)悄晃,會(huì)創(chuàng)建一個(gè)新對(duì)象玫霎,這個(gè)新對(duì)象會(huì)代替 bind 的對(duì)象綁定,作為此函數(shù)的 this传泊,并且在此函數(shù)沒(méi)有返回對(duì)象的情況下鼠渺,返回這個(gè)新建的對(duì)象
什么是尾調(diào)用,使用尾調(diào)用有什么好處眷细?
尾調(diào)用指的是函數(shù)的最后一步調(diào)用另一個(gè)函數(shù)拦盹。代碼執(zhí)行是基于執(zhí)行棧的,所以當(dāng)在一個(gè)函數(shù)里調(diào)用另一個(gè)函數(shù)時(shí)溪椎,會(huì)保留當(dāng)前的執(zhí)行上下文普舆,然后再新建另外一個(gè)執(zhí)行上下文加入棧中。使用尾調(diào)用的話校读,因?yàn)橐呀?jīng)是函數(shù)的最后一步沼侣,所以這時(shí)可以不必再保留當(dāng)前的執(zhí)行上下文,從而節(jié)省了內(nèi)存歉秫,這就是尾調(diào)用優(yōu)化蛾洛。但是 ES6 的尾調(diào)用優(yōu)化只在嚴(yán)格模式下開(kāi)啟,正常模式是無(wú)效的。
CSS預(yù)處理器/后處理器是什么轧膘?為什么要使用它們钞螟?
預(yù)處理器, 如:less
谎碍,sass
鳞滨,stylus
,用來(lái)預(yù)編譯sass
或者less
蟆淀,增加了css
代碼的復(fù)用性拯啦。層級(jí),mixin
熔任, 變量褒链,循環(huán), 函數(shù)等對(duì)編寫以及開(kāi)發(fā)UI組件都極為方便疑苔。
后處理器碱蒙, 如: postCss
,通常是在完成的樣式表中根據(jù)css
規(guī)范處理css
夯巷,讓其更加有效。目前最常做的是給css
屬性添加瀏覽器私有前綴哀墓,實(shí)現(xiàn)跨瀏覽器兼容性的問(wèn)題趁餐。
css
預(yù)處理器為css
增加一些編程特性,無(wú)需考慮瀏覽器的兼容問(wèn)題篮绰,可以在CSS
中使用變量后雷,簡(jiǎn)單的邏輯程序,函數(shù)等在編程語(yǔ)言中的一些基本的性能吠各,可以讓css
更加的簡(jiǎn)潔臀突,增加適應(yīng)性以及可讀性,可維護(hù)性等贾漏。
其它css
預(yù)處理器語(yǔ)言:Sass(Scss)
, Less
, Stylus
, Turbine
, Swithch css
, CSS Cacheer
, DT Css
候学。
使用原因:
- 結(jié)構(gòu)清晰, 便于擴(kuò)展
- 可以很方便的屏蔽瀏覽器私有語(yǔ)法的差異
- 可以輕松實(shí)現(xiàn)多重繼承
- 完美的兼容了
CSS
代碼纵散,可以應(yīng)用到老項(xiàng)目中
new 一個(gè)構(gòu)造函數(shù)梳码,如果函數(shù)返回 return {}
、 return null
伍掀, return 1
掰茶, return true
會(huì)發(fā)生什么情況?
如果函數(shù)返回一個(gè)對(duì)象蜜笤,那么new 這個(gè)函數(shù)調(diào)用返回這個(gè)函數(shù)的返回對(duì)象濒蒋,否則返回 new 創(chuàng)建的新對(duì)象
什么是margin重疊問(wèn)題?如何解決把兔?
問(wèn)題描述: 兩個(gè)塊級(jí)元素的上外邊距和下外邊距可能會(huì)合并(折疊)為一個(gè)外邊距沪伙,其大小會(huì)取其中外邊距值大的那個(gè)瓮顽,這種行為就是外邊距折疊。需要注意的是焰坪,浮動(dòng)的元素和絕對(duì)定位這種脫離文檔流的元素的外邊距不會(huì)折疊趣倾。重疊只會(huì)出現(xiàn)在垂直方向。
計(jì)算原則: 折疊合并后外邊距的計(jì)算原則如下:
- 如果兩者都是正數(shù)某饰,那么就去最大者
- 如果是一正一負(fù)儒恋,就會(huì)正值減去負(fù)值的絕對(duì)值
- 兩個(gè)都是負(fù)值時(shí),用0減去兩個(gè)中絕對(duì)值大的那個(gè)
解決辦法: 對(duì)于折疊的情況黔漂,主要有兩種:兄弟之間重疊和父子之間重疊 (1)兄弟之間重疊
- 底部元素變?yōu)樾袃?nèi)盒子:
display: inline-block
- 底部元素設(shè)置浮動(dòng):
float
- 底部元素的position的值為
absolute/fixed
(2)父子之間重疊
- 父元素加入:
overflow: hidden
- 父元素添加透明邊框:
border:1px solid transparent
- 子元素變?yōu)樾袃?nèi)盒子:
display: inline-block
- 子元素加入浮動(dòng)屬性或定位
CSS選擇器及其優(yōu)先級(jí)
選擇器 | 格式 | 優(yōu)先級(jí)權(quán)重 |
---|---|---|
id選擇器 | #id | 100 |
類選擇器 | #classname | 10 |
屬性選擇器 | a[ref=“eee”] | 10 |
偽類選擇器 | li:last-child | 10 |
標(biāo)簽選擇器 | div | 1 |
偽元素選擇器 | li:after | 1 |
相鄰兄弟選擇器 | h1+p | 0 |
子選擇器 | ul>li | 0 |
后代選擇器 | li a | 0 |
通配符選擇器 | * | 0 |
對(duì)于選擇器的優(yōu)先級(jí):
- 標(biāo)簽選擇器诫尽、偽元素選擇器:1
- 類選擇器、偽類選擇器炬守、屬性選擇器:10
- id 選擇器:100
- 內(nèi)聯(lián)樣式:1000
注意事項(xiàng):
- !important聲明的樣式的優(yōu)先級(jí)最高牧嫉;
- 如果優(yōu)先級(jí)相同,則最后出現(xiàn)的樣式生效减途;
- 繼承得到的樣式的優(yōu)先級(jí)最低酣藻;
- 通用選擇器(*)、子選擇器(>)和相鄰?fù)x擇器(+)并不在這四個(gè)等級(jí)中鳍置,所以它們的權(quán)值都為 0 辽剧;
- 樣式表的來(lái)源不同時(shí),優(yōu)先級(jí)順序?yàn)椋簝?nèi)聯(lián)樣式 > 內(nèi)部樣式 > 外部樣式 > 瀏覽器用戶自定義樣式 > 瀏覽器默認(rèn)樣式税产。
Proxy 可以實(shí)現(xiàn)什么功能怕轿?
在 Vue3.0 中通過(guò) Proxy
來(lái)替換原本的 Object.defineProperty
來(lái)實(shí)現(xiàn)數(shù)據(jù)響應(yīng)式。
Proxy 是 ES6 中新增的功能辟拷,它可以用來(lái)自定義對(duì)象中的操作撞羽。
let p = new Proxy(target, handler)
復(fù)制代碼
target
代表需要添加代理的對(duì)象,handler
用來(lái)自定義對(duì)象中的操作衫冻,比如可以用來(lái)自定義 set
或者 get
函數(shù)诀紊。
下面來(lái)通過(guò) Proxy
來(lái)實(shí)現(xiàn)一個(gè)數(shù)據(jù)響應(yīng)式:
let onWatch = (obj, setBind, getLogger) => {
let handler = {
get(target, property, receiver) {
getLogger(target, property)
return Reflect.get(target, property, receiver)
},
set(target, property, value, receiver) {
setBind(value, property)
return Reflect.set(target, property, value)
}
}
return new Proxy(obj, handler)
}
let obj = { a: 1 }
let p = onWatch(
obj,
(v, property) => {
console.log(`監(jiān)聽(tīng)到屬性${property}改變?yōu)?{v}`)
},
(target, property) => {
console.log(`'${property}' = ${target[property]}`)
}
)
p.a = 2 // 監(jiān)聽(tīng)到屬性a改變
p.a // 'a' = 2
復(fù)制代碼
在上述代碼中,通過(guò)自定義 set
和 get
函數(shù)的方式隅俘,在原本的邏輯中插入了我們的函數(shù)邏輯渡紫,實(shí)現(xiàn)了在對(duì)對(duì)象任何屬性進(jìn)行讀寫時(shí)發(fā)出通知。
當(dāng)然這是簡(jiǎn)單版的響應(yīng)式實(shí)現(xiàn)考赛,如果需要實(shí)現(xiàn)一個(gè) Vue 中的響應(yīng)式惕澎,需要在 get
中收集依賴,在 set
派發(fā)更新颜骤,之所以 Vue3.0 要使用 Proxy
替換原本的 API 原因在于 Proxy
無(wú)需一層層遞歸為每個(gè)屬性添加代理唧喉,一次即可完成以上操作,性能上更好,并且原本的實(shí)現(xiàn)有一些數(shù)據(jù)更新不能監(jiān)聽(tīng)到八孝,但是 Proxy
可以完美監(jiān)聽(tīng)到任何方式的數(shù)據(jù)改變董朝,唯一缺陷就是瀏覽器的兼容性不好。
說(shuō)下對(duì) JS 的了解吧
是基于原型的動(dòng)態(tài)語(yǔ)言干跛,主要獨(dú)特特性有 this子姜、原型和原型鏈。
JS 嚴(yán)格意義上來(lái)說(shuō)分為:語(yǔ)言標(biāo)準(zhǔn)部分(ECMAScript)+ 宿主環(huán)境部分
語(yǔ)言標(biāo)準(zhǔn)部分
2015 年發(fā)布 ES6楼入,引入諸多新特性使得能夠編寫大型項(xiàng)目變成可能哥捕,標(biāo)準(zhǔn)自 2015 之后以年號(hào)代號(hào),每年一更
宿主環(huán)境部分
- 在瀏覽器宿主環(huán)境包括 DOM + BOM 等
- 在 Node嘉熊,宿主環(huán)境包括一些文件遥赚、數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)阐肤、與操作系統(tǒng)的交互等