|
一、請說出下列最終得執(zhí)行結(jié)果,并解釋為什么。
解答:執(zhí)行結(jié)果為:10
首先該段代碼在全局作用域中聲明了個空數(shù)組a,然后for 循環(huán)時是使用 var 定義循環(huán)變量 i (存在變量提升),且i++并不是重新定義了一個變量,只是對i變量重新賦值了,最終循環(huán)結(jié)束時i等于10,由于function(){console.log(i)}并沒有立即執(zhí)行,所以等for循環(huán)執(zhí)行結(jié)束后,所有的a[i]輸出的都是10。
二、請說出下列最終得執(zhí)行結(jié)果,并解釋為什么。
解答:執(zhí)行結(jié)果為:報錯(Uncaught ReferenceError: Cannot access 'tmp' before initialization)
該代碼片段中,首先在全局作用域中聲明了個全局變量tmp并賦值為123,但是塊級作用域內(nèi)let又聲明了一個局部變量tmp,導(dǎo)致tmp綁定在這個塊 級作用域,并且let沒有變量提升,所以在let聲明變量前,對tmp使用會報錯。
三、結(jié)合ES6新語法,用最簡單的方式找出數(shù)組中的最小值。
var arr=[12,22,4,44,18]
解答:Math.min(...arr)
四、請詳細(xì)說明var、let、const三種聲明變量方式之間的具體差別。
解答:
使用var聲明變量
1.存在變量提升
2.訪問在后續(xù)定義的變量,會返回undefined
3.var沒有塊級作用域,其聲明的變量在其他作用域中可以訪問到
使用let聲明變量
1.使用let聲明的變量,會創(chuàng)建一個塊級作用域
2.let聲明的變量只在塊級作用域內(nèi)有效,在外部訪問不到
3.同個作用域內(nèi),使用let不能重復(fù)聲明變量
使用const聲明常量
1.使用const聲明的常量不能被修改
2.使用const聲明常量時必須馬上賦值
3.使用const聲明引用類型數(shù)據(jù)的常量時,其指向的是該對象的指針,所以可以在這個常量上增加、刪除、修改對象的屬性,但是不能直接修改這個常量的值(內(nèi)存地址不能修改)
五、請說出下列代碼最終得執(zhí)行結(jié)果,并解釋為什么。
解答:執(zhí)行結(jié)果為:20
首先全局變量a的值是10,obj對象里面由兩個key分別時a和fn,a的值時100,fn則是一個函數(shù),函數(shù)體里面時一個setTimeout,setTimeout第一個參數(shù)是箭頭函數(shù),箭頭函數(shù)里面執(zhí)行打印this.a。因為箭頭函數(shù)不會創(chuàng)建自己的this,它只會從自己作用域鏈的上一層繼承this,所以這里的this指向的是obj對象,打印出來的結(jié)果是20
六、簡述Symbo類型的用途。
解答:
Symbo是2015提出的一種新的原始數(shù)據(jù)類型,其主要用途有:
1.為對象創(chuàng)建獨一無二的key值
2.可以模擬對象的私有屬性
3.可以用作常量
七、說說什么是淺拷貝,什么是深拷貝。
解答:
淺拷貝:是拷貝一個對象里面的數(shù)據(jù),但是不拷貝這個對象里面的子對象。
深拷貝:會克隆出一個對象,數(shù)據(jù)相同,但是引用地址不同(就是拷貝這個對象里面的數(shù)據(jù),而且拷貝它里面的子對象)。
八、請簡述TypeScript與JavaScript之間的關(guān)系。
解答:
TypeScript是 JavaScript 的超集/擴(kuò)展集,包含了 JavaScript 的所有元素,可以載入 JavaScript 代碼運行,并擴(kuò)展了 JavaScript 的語法。
TypeScript 可以使用 JavaScript 中的所有代碼和編碼概念,TypeScript 是為了使 JavaScript 的開發(fā)變得更加容易而創(chuàng)建的。
TypeScript 從核心語言方面和類概念方面對 JavaScript 對象模型進(jìn)行擴(kuò)展。
JavaScript 代碼可以在無需任何修改的情況下與 TypeScript 一同工作,同時可以使用編譯器將 TypeScript 代碼轉(zhuǎn)換為 JavaScript。
TypeScript 通過類型注解提供編譯時的靜態(tài)類型檢查。
TypeScript 中的數(shù)據(jù)要求帶有明確的類型,JavaScript不要求。
TypeScript 為函數(shù)提供了缺省參數(shù)值。
TypeScript 引入了 JavaScript 中沒有的“類”概念。
TypeScript 中引入了模塊的概念,可以把聲明、數(shù)據(jù)、函數(shù)和類封裝在模塊中。
九、請談?wù)勀闼J(rèn)為的TypeScript優(yōu)缺點。
解答:
優(yōu)點:
1.TypeScript 增加了代碼的可讀性和可維護(hù)性
2.TypeScript 非常包容
3.TypeScript 擁有活躍的社區(qū)
缺點:
1.有一定的學(xué)習(xí)成本,需要理解接口(Interfaces)、泛型(Generics)、類(Classes)、枚舉類型(Enums)等前端工程師可能不是很熟悉的概念,如果接觸過后端Java語言可能會更加容易上手
2.短期可能會增加一些開發(fā)成本,畢竟要多寫一些類型的定義,不過對于一個需要長期維護(hù)的項目,TypeScript 能夠減少其維護(hù)成本
3.集成到構(gòu)建流程需要一些工作量
4.可能和一些庫結(jié)合的不是很完美
十、描述引用計數(shù)的工作原理和優(yōu)缺點。
解答:
工作原理:其核心思想是設(shè)置引用數(shù),判斷當(dāng)前引用數(shù)是否為0;其實現(xiàn)方式是通過設(shè)置引用計數(shù)器,并根據(jù)引用關(guān)系變化時修改引用數(shù)字,當(dāng)引用數(shù)字為0時,GC就會立即工作,將當(dāng)前對象的空間進(jìn)行回收。
優(yōu)點:發(fā)現(xiàn)垃圾時能立即回收;最大限度減少了程序暫停
缺點:無法回收循環(huán)引用的對象;時間開銷較大
十一、描述標(biāo)記整理算法的工作流程。
解答:
標(biāo)記整理算法的工作流程原理:
標(biāo)記整理可以看作是標(biāo)記清除的增強,它也是分為標(biāo)記和清除兩個階段
標(biāo)記階段:該階段將作用域中所有可達(dá)對象進(jìn)行標(biāo)記,標(biāo)記階段的操作和標(biāo)記清除一致
清除階段:該階段會先進(jìn)行整理,移動對象位置,讓它們在地址上產(chǎn)生連續(xù),然后進(jìn)行清除操作,回收相應(yīng)的空間
優(yōu)點:減少碎片化空間
缺點:不會立即回收垃圾對象;移動對象位置,回收效率慢
十二、描述V8中新生代存儲區(qū)垃圾回收的流程。
解答:
新生代對象回收實現(xiàn):
1.回收過程采用復(fù)制算法 + 標(biāo)記整理
2.新生代內(nèi)存區(qū)分為兩個等大小空間
3.使用空間為From,空間空間為To
4.活動對象存儲于From空間,當(dāng)From空間使用到一定程度后便會觸發(fā)GC操作
5.對From空間進(jìn)行活動對象的標(biāo)記,并進(jìn)行整理
6.將整理后的活動對象拷貝至To
7.對From空間進(jìn)行回收操作
8.From與To交換空間完成釋放
回收細(xì)節(jié)說明:
1.拷貝過程中可能出現(xiàn)晉升
2.晉升就是將新生代對象移動至老生代對象中
3.一輪GC過后還存活的新生代對象需要晉升
4.To空間的使用率超過25%
十二、描述增量標(biāo)記算法在何時使用及工作原理。
解答:
增量標(biāo)記算法:它是在V8清除老生代對象時為提高清除效率優(yōu)化時使用的,因為在進(jìn)行垃圾回收的操作時會阻塞程序的執(zhí)行,所以在老生代中會在程序執(zhí)行的空檔期去執(zhí)行回收操作,此時就可以使用增量標(biāo)記算法。它是將當(dāng)前一整段的垃圾回收操作,分成多個小步組合去完成,實現(xiàn)垃圾回收和程序執(zhí)行交替完成,可以讓時間消耗更合理,達(dá)到效率優(yōu)化的好處
工作原理:
1.JS程序執(zhí)行過程中,會伴隨著垃圾回收的工作
2.當(dāng)垃圾回收工作時,需要遍歷對象進(jìn)行標(biāo)記,此時不需要將所有對象進(jìn)行標(biāo)記,可以先將直接可達(dá)的對象進(jìn)行標(biāo)記,標(biāo)記完成后暫停標(biāo)記
3.然后讓JS程序執(zhí)行一會,再讓GC機制去做二步標(biāo)記,將間接可達(dá)的對象進(jìn)行標(biāo)記,標(biāo)記完成后暫停標(biāo)記
4.重復(fù)以上兩不操作,讓程序執(zhí)行和垃圾回收的標(biāo)記操作交替執(zhí)行,來達(dá)到優(yōu)化效率和提升用戶體驗的目的
5.直到標(biāo)記全部完成后,執(zhí)行垃圾回收
|
|
|