解釋一下原型和原型鏈
原型:函數(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)是什么?