撩課-Web大前端每天5道面試題-Day21

1.下面的代碼將輸出什么?


for (var i = 0; i < 5; i++) {
  setTimeout(function() { console.log(i); }, i * 1000 );
}

閉包在這里能起什么作用畅哑?
上面的代碼不會按預(yù)期顯示值0肴楷,1,2荠呐,3阶祭,和4绷杜,
而是會顯示5,5濒募,5,5圾结,和5瑰剃。

原因是,在循環(huán)中執(zhí)行的每個函數(shù)將整個循環(huán)完成之后被執(zhí)行筝野,
因此晌姚,將會引用存儲在 i中的最后一個值,那就是5歇竟。

閉包可以通過為每次迭代創(chuàng)建一個唯一的范圍挥唠,
存儲范圍內(nèi)變量的每個唯一的值,
來防止這個問題焕议,
如下:

for (var i = 0; i < 5; i++) {
    (function(x) {
        setTimeout(function() { console.log(x); }, x * 1000 );
    })(i);
}

這就會按預(yù)期輸出0宝磨,1,2盅安,3唤锉,和4到控制臺。

2.ES5别瞭、ES6和ES2015有什么區(qū)別?


ES2015特指在2015年發(fā)布的新一代JS語言標(biāo)準(zhǔn)窿祥,
ES6泛指下一代JS語言標(biāo)準(zhǔn),
包含ES2015蝙寨、ES2016晒衩、ES2017、ES2018等墙歪。

現(xiàn)階段在絕大部分場景下听系,
ES2015默認等同ES6。

ES5泛指上一代語言標(biāo)準(zhǔn)箱亿。

ES2015可以理解為ES5和ES6的時間分界線跛锌。

3.Iterator是什么,有什么作用届惋?


Iterator是ES6中一個很重要概念髓帽,

它并不是對象,
也不是任何一種數(shù)據(jù)類型脑豹。
因為ES6新增了Set郑藏、Map類型,
他們和Array瘩欺、Object類型很像必盖,Array拌牲、Object都是可以遍歷的,
但是Set歌粥、Map都不能用for循環(huán)遍歷塌忽,
解決這個問題有兩種方案,
一種是為Set失驶、Map單獨新增一個用來遍歷的API土居,
另一種是為Set、Map嬉探、Array擦耀、Object新增一個統(tǒng)一的遍歷API,
顯然涩堤,

第二種更好眷蜓,
ES6也就順其自然的需要一種設(shè)計標(biāo)準(zhǔn),
來統(tǒng)一所有可遍歷類型的遍歷方式胎围。
Iterator正是這樣一種標(biāo)準(zhǔn)吁系。或者說是一種規(guī)范理念痊远。

就好像JavaScript是ECMAScript標(biāo)準(zhǔn)的一種具體實現(xiàn)一樣垮抗,
Iterator標(biāo)準(zhǔn)的具體實現(xiàn)是Iterator遍歷器。
Iterator標(biāo)準(zhǔn)規(guī)定碧聪,所有部署了key值為[Symbol.iterator]冒版,
且[Symbol.iterator]的value是標(biāo)準(zhǔn)的Iterator接口函數(shù)(標(biāo)準(zhǔn)的Iterator接口函數(shù): 
該函數(shù)必須返回一個對象,
且對象中包含next方法逞姿,
且執(zhí)行next()能返回包含value/done屬性的Iterator對象)的對象辞嗡,
都稱之為可遍歷對象,
next()后返回的Iterator對象也就是Iterator遍歷器滞造。

 
obj就是可遍歷的续室,
因為它遵循了Iterator標(biāo)準(zhǔn),
且包含[Symbol.iterator]方法谒养,
方法函數(shù)也符合標(biāo)準(zhǔn)的Iterator接口規(guī)范挺狰。 

//obj.[Symbol.iterator]() 
就是Iterator遍歷器 
let obj = 
{
 data: [ 'hello', 'world' ], [Symbol.iterator]() 
{ const self = this; let index = 0; 
 return { next() { 
if (index < self.data.length) {
 return { value: self.data[index++], done: false 
}; 
} else { 
return { value: undefined, done: true }; } } }; }
 }; 
ES6給Set、Map买窟、Array丰泊、String都加上了[Symbol.iterator]方法,
且[Symbol.iterator]方法函數(shù)也符合標(biāo)準(zhǔn)的Iterator接口規(guī)范始绍,
所以Set瞳购、Map、Array亏推、String默認都是可以遍歷的学赛。

 
//Array let array = ['red', 'green', 'blue']; array[Symbol.iterator]()
//Iterator遍歷器 array[Symbol.iterator]().next() 
//{value: "red", done: false} //String let string = '1122334455'; string[Symbol.iterator]()
//Iterator遍歷器 string[Symbol.iterator]().next() 
//{value: "1", done: false} 
//set let set = new Set(['red', 'green', 'blue']); set[Symbol.iterator]() 
//Iterator遍歷器 

set[Symbol.iterator]().next() 
{value: "red", done: false}
Map let map = new Map(); 
let obj= {map: 'map'}; 
map.set(obj, 'mapValue'); 
map[Symbol.iterator]().next()
{value: Array(2), done: false} 

4.module年堆、export、import是什么盏浇,有什么作用变丧?


module、export绢掰、import
是ES6用來統(tǒng)一前端模塊化方案的設(shè)計思路和實現(xiàn)方案锄贷。

export、import的出現(xiàn)統(tǒng)一了前端模塊化的實現(xiàn)方案曼月,
整合規(guī)范了瀏覽器/服務(wù)端的模塊化方法,
用來取代傳統(tǒng)的AMD/CMD柔昼、requireJS哑芹、seaJS、commondJS等等一系列前端模塊不同的實現(xiàn)方案捕透,
使前端模塊化更加統(tǒng)一規(guī)范聪姿,
JS也能更加能實現(xiàn)大型的應(yīng)用程序開發(fā)。

import引入的模塊是靜態(tài)加載(編譯階段加載)
而不是動態(tài)加載(運行時加載)乙嘀。

import引入export導(dǎo)出的接口值是動態(tài)綁定關(guān)系末购,
即通過該接口,可以取到模塊內(nèi)部實時的值虎谢。

5.日常前端代碼開發(fā)中盟榴,有哪些值得用ES6去改進的編程優(yōu)化或者規(guī)范?


1婴噩、常用箭頭函數(shù)來取代var self = this;的做法擎场。

2、常用let取代var命令几莽。

3迅办、常用數(shù)組/對象的結(jié)構(gòu)賦值來命名變量,結(jié)構(gòu)更清晰章蚣,語義更明確站欺,可讀性更好。

4纤垂、在長字符串多變量組合場合矾策,用模板字符串來取代字符串累加,能取得更好地效果和閱讀體驗洒忧。

5蝴韭、用Class類取代傳統(tǒng)的構(gòu)造函數(shù),來生成實例化對象熙侍。

6榄鉴、在大型應(yīng)用開發(fā)中履磨,要保持module模塊化開發(fā)思維,分清模塊之間的關(guān)系庆尘,常用import剃诅、export方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驶忌,一起剝皮案震驚了整個濱河市矛辕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌付魔,老刑警劉巖聊品,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異几苍,居然都是意外死亡翻屈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門妻坝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伸眶,“玉大人,你說我怎么就攤上這事刽宪±逶簦” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵圣拄,是天一觀的道長嘴秸。 經(jīng)常有香客問我,道長售担,這世上最難降的妖魔是什么赁遗? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮族铆,結(jié)果婚禮上岩四,老公的妹妹穿的比我還像新娘。我一直安慰自己哥攘,他們只是感情好剖煌,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逝淹,像睡著了一般耕姊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上栅葡,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天茉兰,我揣著相機與錄音,去河邊找鬼欣簇。 笑死规脸,一個胖子當(dāng)著我的面吹牛坯约,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莫鸭,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼闹丐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了被因?” 一聲冷哼從身側(cè)響起卿拴,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梨与,沒想到半個月后堕花,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡粥鞋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年航徙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陷虎。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖杠袱,靈堂內(nèi)的尸體忽然破棺而出尚猿,到底是詐尸還是另有隱情,我是刑警寧澤楣富,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布凿掂,位于F島的核電站,受9級特大地震影響纹蝴,放射性物質(zhì)發(fā)生泄漏庄萎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一塘安、第九天 我趴在偏房一處隱蔽的房頂上張望糠涛。 院中可真熱鬧,春花似錦兼犯、人聲如沸忍捡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砸脊。三九已至,卻和暖如春纬霞,著一層夾襖步出監(jiān)牢的瞬間凌埂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工诗芜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瞳抓,地道東北人埃疫。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像挨下,于是被迫代替她去往敵國和親熔恢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容