JS 八股文面試題(附答案)

解釋一下原型和原型鏈

原型:函數(shù)都有prototype屬性,稱為原型,也是稱為原型對(duì)象

原型可以放一些屬性和方法,共享給實(shí)例對(duì)象使用

原型可以做繼承

原型鏈:對(duì)象都有_proto_屬性,這個(gè)屬性指向它的原型對(duì)象,原型對(duì)象也是個(gè)對(duì)象,也有 _proto_這個(gè)屬性,指向原型對(duì)象的原型對(duì)象,這樣一層一層形成的鏈?zhǔn)浇Y(jié)構(gòu)成為原型鏈,最頂層找不到就返回 null?

JS的基本數(shù)據(jù)類型

引用數(shù)據(jù)類型:Object

基本數(shù)據(jù)類型:Number、String、Boolean、Null、?Undefined、Symbol(ES6),這些類型可以直接操作保存在變量中的實(shí)際值。

面向?qū)ο蟮娜兀?

封裝 繼承 多態(tài)

封裝:把一些重復(fù)性高的;用得多的屬性和方法 放到對(duì)象中包裹起來;

繼承:原型鏈繼承、構(gòu)造繼承、組合繼承

多態(tài):多種狀態(tài) 傳入不同參數(shù) 執(zhí)行不同方法

js如何實(shí)現(xiàn)繼承?

一.什么是變量提升?

定義:變量提升是當(dāng)棧內(nèi)存作用域形成時(shí),JS代碼執(zhí)行前,瀏覽器會(huì)將帶有var, function關(guān)鍵字的變量提前進(jìn)行聲明declare(值默認(rèn)就是 undefined),定義 defined(就是賦值操作),這種預(yù)先處理的機(jī)制就叫做變量提升機(jī)制也叫預(yù)定義。

二. 帶 var 和不帶 var 的區(qū)別

全局作用域中不帶var聲明變量雖然也可以但是建議帶上 var聲明變量,不帶 var 的相當(dāng)于給window對(duì)象設(shè)置一個(gè)屬性罷了。

私有作用域(函數(shù)作用域),帶 var 的是私有變量。不帶 var 的是會(huì)向上級(jí)作用域查找,如果上級(jí)作用域也沒有那么就一直找到 window 為止,這個(gè)查找過程叫作用域鏈。

全局作用域中使用 var 申明的變量會(huì)映射到 window 下成為屬性。

三. 閉包是什么

閉包:就是能夠讀取外層函數(shù)內(nèi)部變量的函數(shù)。

閉包需要滿足三個(gè)條件:

訪問所在作用域;

函數(shù)嵌套;

在所在作用域外被調(diào)用 。

優(yōu)點(diǎn): 可以重復(fù)使用變量,并且不會(huì)造成變量污染 。

缺點(diǎn): 會(huì)引起內(nèi)存泄漏

四. 什么是事件冒泡和事件捕獲

事件冒泡是指當(dāng)一個(gè)元素觸發(fā)某個(gè)事件時(shí),該事件會(huì)從該元素開始向父級(jí)元素一直傳遞,直到傳遞到 document 對(duì)象。而事件捕獲則是相反的過程,即從 document 對(duì)象開始向下傳遞,直到傳遞到觸發(fā)該事件的元素。DOM 標(biāo)準(zhǔn)規(guī)定,首先按照捕獲的方式處理事件,然后再按照冒泡的方式處理事件。不過,可以通過 stopPropagation 和 preventDefault 方法來停止事件的傳遞和默認(rèn)行為。

五. 什么是異步編程,如何實(shí)現(xiàn)異步編程

異步編程是指在程序執(zhí)行過程中不會(huì)阻塞其他代碼的執(zhí)行,而是在后臺(tái)執(zhí)行。在 JavaScript 中,異步編程主要通過回調(diào)、Promise、async/await 等機(jī)制來實(shí)現(xiàn)。其中,回調(diào)是最早也是最簡(jiǎn)單的實(shí)現(xiàn)方式,但由于回調(diào)函數(shù)嵌套層級(jí)深、錯(cuò)誤處理難以維護(hù)等問題,推出了 Promise 和 async/await 兩種更為高級(jí)的異步編程方案。

六. 如何實(shí)現(xiàn)數(shù)組去重

利用 Set 數(shù)據(jù)結(jié)構(gòu)去重; 利用對(duì)象屬性名不能重復(fù)的特性去重 ;利用 Array.filter() 方法去重;利用 Array.reduce() 方法去重

七. var、let、const區(qū)別

1var存在變量提升,而let、const沒有

2let、const有塊級(jí)作用域,而var沒有

3var 在同一塊作用域可以重復(fù)聲明多個(gè)相同的變量,后者覆蓋前者,let、const重復(fù)聲明會(huì)報(bào)錯(cuò)

4let、var聲明變量后可以進(jìn)行改變值,const聲明不能修改([對(duì)象、數(shù)組]的屬性和方法可以改變

八. null和undefined的區(qū)別

作者在設(shè)計(jì)js的都是先設(shè)計(jì)的null

null會(huì)被隱式轉(zhuǎn)換成0,很不容易發(fā)現(xiàn)錯(cuò)誤。

先有null后有undefined,出來undefined是為了填補(bǔ)之前的坑。

具體區(qū)別:JavaScript的最初版本是這樣區(qū)分的:null是一個(gè)表示"無"的對(duì)象(空對(duì)象指針),轉(zhuǎn)為數(shù)值時(shí)為0;undefined是一個(gè)表示"無"的原始值,轉(zhuǎn)為數(shù)值時(shí)為NaN。

十. Js的事件委托是什么,原理是什么

事件委托就是利用事件冒泡,只指定一個(gè)事件處理程序,就可以管理某一類型的所有事件。

原理:事件委托是利用事件的冒泡原理來實(shí)現(xiàn)的,何為事件冒泡呢?就是事件從最深的節(jié)點(diǎn)開始,然后逐步向上傳播事件。

十一.??介紹一下你了解的Promise?

Promise是ES6中的一個(gè)內(nèi)置對(duì)象,實(shí)際是一個(gè)構(gòu)造函數(shù);Promise 是異步編程的一種解決方案,Promise對(duì)象代表一個(gè)異步操作,

有三種狀態(tài):pending(進(jìn)行中)、resolved(已成功)和rejected(已失?。?。?

十一.?Promise構(gòu)造函數(shù)是同步執(zhí)行還是異步執(zhí)行,那么 then 方法呢?

promise構(gòu)造函數(shù)是同步執(zhí)行的,then方法是異步執(zhí)行的

1. 什么是作用域

作用域是在運(yùn)行代碼中某些特定部分中變量、函數(shù)和對(duì)象的可訪問性。也就是說,作用域決定了代碼區(qū)塊中變量和其他的可訪問性。

ES6之前JavaScript沒有塊級(jí)作用域,只有全局作用域和局部作用域。ES6的到來,為我們提供了塊級(jí)作用域,可通過命令let和const來體現(xiàn)。


1. 對(duì) SPA 單頁(yè)面應(yīng)用的理解,優(yōu)缺點(diǎn)是什么?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Q 1.一個(gè)200*200的div在不同分辨率屏幕上下左右居中,用css實(shí)現(xiàn) div { position:abs...
    阿彤呀呀閱讀 1,284評(píng)論 0 4
  • 1.undefined 和 null 有什么區(qū)別? 他們的相同之處: 他們都是javascript的7種基本類型,...
    小宇cool閱讀 402評(píng)論 0 10
  • ####DOM操作 - 1)創(chuàng)建新節(jié)點(diǎn) - createDocumentFragment() //創(chuàng)建do...
    風(fēng)雪之隅_b6f7閱讀 123評(píng)論 0 0
  • 1. 什么是對(duì)象? 面向?qū)ο蟮娜筇匦? 對(duì)象是屬性和方法的集合,面向?qū)ο蟮娜筇匦允欠庋b,繼承,多態(tài) 2. 對(duì)象...
    小灰灰1010閱讀 4,471評(píng)論 0 0
  • 1.基本數(shù)據(jù)類型有哪些? Undefined、Null、Boolean、Number、String 2.原型,原型...
    hahaland閱讀 779評(píng)論 1 7

友情鏈接更多精彩內(nèi)容