1,什么是原型對象?
每一個(gè)構(gòu)造函數(shù)都有一個(gè)prototype的屬性,這個(gè)屬性的值是一個(gè)對象,這個(gè)對象就叫構(gòu)造函數(shù)的原型對象。一般建議將構(gòu)造函數(shù)的成員屬性綁定在原型對象prototype上,因?yàn)樵蛯ο髉rototype身上的屬性默認(rèn)可以通過實(shí)例對象訪問到。
2,什么是原型鏈?
每個(gè)構(gòu)造函數(shù)都有一個(gè)prototype屬性,即原型對象,通過實(shí)例對象的proto屬性也可訪問原型對象;而原型對象本質(zhì)也是一個(gè)對象,是對象就有自己的原型對象,最終形成的鏈狀結(jié)構(gòu)成為原型鏈。
3,什么是構(gòu)造函數(shù)?
構(gòu)造函數(shù)本質(zhì)也是一個(gè)函數(shù),只不過這個(gè)函數(shù)定義的時(shí)候首字母需要大寫,構(gòu)造函數(shù)調(diào)用時(shí),必須通過一個(gè)new關(guān)鍵詞調(diào)用。
4,js中實(shí)現(xiàn)繼承的方式?
ES6之前常見的繼承方式是原型繼承,借用構(gòu)造函數(shù)繼承,組合繼承。
ES6之后使用extends關(guān)鍵詞實(shí)現(xiàn)繼承( class Student extends Person{} )
5,什么是閉包,有什么作用,使用時(shí)需要注意什么?
閉包是一個(gè)函數(shù)相關(guān)的概念,表現(xiàn)形式是一個(gè)父函數(shù)內(nèi)部嵌套了一個(gè)子函數(shù),子函數(shù)直接或者間接的被返回給外部作用域,并且子函數(shù)中會(huì)使用到父函數(shù)局部作用域中的變量,當(dāng)我們在外部調(diào)用這個(gè)子函數(shù)的時(shí)候,就會(huì)發(fā)生閉包現(xiàn)象。
閉包的作用:閉包可以延展一個(gè)函數(shù)的作用域
注意事項(xiàng):不能濫用閉包,會(huì)導(dǎo)致內(nèi)存泄漏
6,什么是內(nèi)存泄漏,哪些操作會(huì)導(dǎo)致內(nèi)存泄漏?
內(nèi)存泄漏是指本應(yīng)該被垃圾回收機(jī)制回收的內(nèi)存空間由于某種特殊原因沒有及時(shí)被回收,稱之為內(nèi)存泄漏。濫用全局變量和濫用閉包都會(huì)導(dǎo)致內(nèi)存泄漏。
7,什么是預(yù)解析?
JS代碼在執(zhí)行之前,解析引擎會(huì)對代碼進(jìn)行一個(gè)預(yù)先的檢查,主要會(huì)對變量和函數(shù)的聲明進(jìn)行提升,將變量和函數(shù)的聲明提到代碼的最前面。變量只提升聲明,不提升賦值。
8,說說你對this關(guān)鍵詞的理解?
this在不同的場景下指向不同,主要分為以下幾種情況:
普通函數(shù)中指向全局window;
對象的成員方法中指向該方法的宿主對象;
構(gòu)造函數(shù)中指向new出來的實(shí)例對象;
事件處理函數(shù)中指向事件源;
回調(diào)函數(shù)中指向全局window;
9,call,apply,bind的區(qū)別?
這三個(gè)方法都是函數(shù)這個(gè)特殊對象的方法,通過這三個(gè)方法都可以改變函數(shù)內(nèi)部this的指向。
不同點(diǎn):call和apply會(huì)調(diào)用一次函數(shù),而bind不會(huì)調(diào)用函數(shù),只會(huì)在內(nèi)存中創(chuàng)建一個(gè)函數(shù)的副本(修改過this指向的函數(shù))
call從第二個(gè)參數(shù)開始需要一個(gè)參數(shù)列表,
apply第二個(gè)參數(shù)需要是一個(gè)數(shù)組
10,new操作符具體干了什么?
第一步創(chuàng)建一個(gè)空對象;
第二步將this指向空對象;
第三步動(dòng)態(tài)給剛創(chuàng)建的對象添加成員屬性;
第四步隱式返回this。