国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript-面試

fantix / 1220人閱讀

摘要:表示沒有對(duì)象,即該處不應(yīng)該有值。閉包的形成允許使用內(nèi)部函數(shù),可以將函數(shù)定義和函數(shù)表達(dá)式放在另一個(gè)函數(shù)的函數(shù)體內(nèi)。使用閉包可以減少全局環(huán)境的污染,也可用延續(xù)變量的生命。所以在閉包不用之后,將不使用的局部變量刪除,使其被回收。

1.javaScript的數(shù)據(jù)類型有什么

Undefined、Null、Boolean、Number、String

2.檢測(cè)數(shù)據(jù)類型有什么方法 typeof

typeof xxx得到的值有以下幾種類型:undefined boolean number string object function、symbol ,比較簡(jiǎn)單,不再一一演示了。
這里需要注意的有三點(diǎn):

typeof null結(jié)果是object ,實(shí)際這是typeof的一個(gè)bug,null是原始值,非引用類型

typeof [1, 2]結(jié)果是object,結(jié)果中沒有array這一項(xiàng),引用類型除了function其他的全部都是object

typeof Symbol() 用typeof獲取symbol類型的值得到的是symbol,這是 ES6 新增的知識(shí)點(diǎn)

instanceof

用于實(shí)例和構(gòu)造函數(shù)的對(duì)應(yīng)。例如判斷一個(gè)變量是否是數(shù)組,使用typeof無法判斷,但可以使用[1, 2] instanceof Array來判斷。因?yàn)椋琜1, 2]是數(shù)組,它的構(gòu)造函數(shù)就是Array。同理:

function Foo(name) { 
? ?this.name = name 
} 
var foo = new Foo("bar’) 
console.log(foo instanceof Foo) // true
3.介紹js有哪些內(nèi)置對(duì)象?

Object 是 JavaScript 中所有對(duì)象的父對(duì)象 ?
數(shù)據(jù)封裝類對(duì)象:Object、Array、Boolean、Number 和 String ? ?
其他對(duì)象:Function、Arguments、Math、Date、RegEx、Error

4.如何區(qū)分?jǐn)?shù)組和對(duì)象? ? ?

(1)從原型入手,Array.prototype.isPrototypeOf(obj); ?利用isPrototypeOf()方法,判定Array是不是在obj的原型鏈中,如果是,則返回true,否則false。Array.prototype.isPrototype([]) //true
(2)也可以從構(gòu)造函數(shù)入手,利用對(duì)向的constructor屬性
(3)根據(jù)對(duì)象的class屬性(類屬性),跨原型鏈調(diào)用toString()方法。Object.prototype.toString.call(Window);
(4)Array.isArray()方法。

5.null,undefined 的區(qū)別?

null ? ? ? ?表示一個(gè)對(duì)象被定義了,值為“空值”;
undefined ? 表示不存在這個(gè)值。
? ? ? ? ? ?
typeof undefined ? ? ? ? ? ? ? ? ? ? ?//"undefined"
undefined :是一個(gè)表示"無"的原始值或者說表示"缺少值",就是此處應(yīng)該有一個(gè)值,但是還沒有定義。當(dāng)嘗試讀取時(shí)會(huì)返回 undefined;
例如變量被聲明了,但沒有賦值時(shí),就等于undefined

typeof null ? ? ? ?//"object"
null : 是一個(gè)對(duì)象(空對(duì)象, 沒有任何屬性和方法);
例如作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對(duì)象;

注意:

在驗(yàn)證null時(shí),一定要使用 === ,因?yàn)?== 無法分別 null 和 undefined
undefined表示"缺少值",就是此處應(yīng)該有一個(gè)值,但是還沒有定義。典型用法是:
1)變量被聲明了,但沒有賦值時(shí),就等于undefined。
2) 調(diào)用函數(shù)時(shí),應(yīng)該提供的參數(shù)沒有提供,該參數(shù)等于undefined。
3)對(duì)象沒有賦值的屬性,該屬性的值為undefined。
4)函數(shù)沒有返回值時(shí),默認(rèn)返回undefined。

null表示"沒有對(duì)象",即該處不應(yīng)該有值。

典型用法是:
1) 作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對(duì)象。
2) 作為對(duì)象原型鏈的終點(diǎn)。

6.聲明變量和聲明函數(shù)的提升有什么區(qū)別?

(1) 變量聲明提升:變量申明在進(jìn)入執(zhí)行上下文就完成了。
只要變量在代碼中進(jìn)行了聲明,無論它在哪個(gè)位置上進(jìn)行聲明, js引擎都會(huì)將它的聲明放在范圍作用域的頂部;
(2) 函數(shù)聲明提升:執(zhí)行代碼之前會(huì)先讀取函數(shù)聲明,意味著可以把函數(shù)申明放在調(diào)用它的語(yǔ)句后面。
只要函數(shù)在代碼中進(jìn)行了聲明,無論它在哪個(gè)位置上進(jìn)行聲明, js引擎都會(huì)將它的聲明放在范圍作用域的頂部;
(3) 變量or函數(shù)聲明:函數(shù)聲明會(huì)覆蓋變量聲明,但不會(huì)覆蓋變量賦值。
同一個(gè)名稱標(biāo)識(shí)a,即有變量聲明var a,又有函數(shù)聲明function a() {},不管二者聲明的順序,函數(shù)聲明會(huì)覆蓋變量聲明,也就是說,此時(shí)a的值是聲明的函數(shù)function a() {}。注意:如果在變量聲明的同時(shí)初始化a,或是之后對(duì)a進(jìn)行賦值,此時(shí)a的值變量的值。eg: var a; var c = 1; a = 1; function a() { return true; } console.log(a);

原型,原型鏈 1.JavaScript原型,原型鏈 ? 有什么特點(diǎn)? 原型

每個(gè)對(duì)象都會(huì)在其內(nèi)部初始化一個(gè)屬性,就是prototype(原型)
使用hasOwnProperty() 可以判斷這個(gè)屬性是不是對(duì)象本身的屬性

問題:Javascript中,有一個(gè)函數(shù),執(zhí)行時(shí)對(duì)象查找時(shí),永遠(yuǎn)不會(huì)去查找原型,這個(gè)函數(shù)是?
hasOwnProperty
javaScript中hasOwnProperty函數(shù)方法是返回一個(gè)布爾值,指出一個(gè)對(duì)象是否具有指定名稱的屬性。此方法無法檢查該對(duì)象的原型鏈中是否具有該屬性;該屬性必須是對(duì)象本身的一個(gè)成員。

使用方法:
object.hasOwnProperty(proName)
其中參數(shù)object是必選項(xiàng)。一個(gè)對(duì)象的實(shí)例。
proName是必選項(xiàng)。一個(gè)屬性名稱的字符串值。

如果 object 具有指定名稱的屬性,那么JavaScript中hasOwnProperty函數(shù)方法返回 true,反之則返回 false。

原型鏈

當(dāng)我們?cè)谠L問一個(gè)對(duì)象的屬性時(shí),如果這個(gè)對(duì)象內(nèi)部不存在這個(gè)屬性,那么他就會(huì)去prototype里找這個(gè)屬性,這個(gè)prototype又會(huì)有自己的prototype,于是就這樣一直找下去,找到Object.__proto__為止,找不到就返回unde也就是我們平時(shí)所說的原型鏈的概念。
關(guān)系:instance.constructor.prototype = instance.__proto__
特點(diǎn):
JavaScript對(duì)象是通過引用來傳遞的,我們創(chuàng)建的每個(gè)新對(duì)象實(shí)體中并沒有一份屬于自己的原型副本。當(dāng)我們修改原型時(shí),與之相關(guān)的對(duì)象也會(huì)繼承這一改變。
當(dāng)我們需要一個(gè)屬性的時(shí),Javascript引擎會(huì)先看當(dāng)前對(duì)象中是否有這個(gè)屬性, 如果沒有的話,就會(huì)查找他的Prototype對(duì)象是否有這個(gè)屬性,如此遞推下去,一直檢索到 Object 內(nèi)建對(duì)象。

所有的引用類型(數(shù)組、對(duì)象、函數(shù)),都具有對(duì)象特性,即可自由擴(kuò)展屬性(null除外)
所有的引用類型(數(shù)組、對(duì)象、函數(shù)),都有一個(gè)__proto__屬性,屬性值是一個(gè)普通的對(duì)象
所有的函數(shù),都有一個(gè)prototype屬性,屬性值也是一個(gè)普通的對(duì)象
所有的引用類型(數(shù)組、對(duì)象、函數(shù)),__proto__屬性值指向它的構(gòu)造函數(shù)的prototype屬性值

原型鏈中的this

所有從原型或更高級(jí)原型中得到、執(zhí)行的方法,其中的this在執(zhí)行時(shí),就指向了當(dāng)前這個(gè)觸發(fā)事件執(zhí)行的對(duì)象。

閉包

閉包的形成與變量的作用域以及變量的生存周期有密切的關(guān)系

1.變量的作用域

在js中我們把作用域分為全局作用域和局部作用域,全局作用域就是window,在沒有塊級(jí)作用域概念的時(shí)候,每一個(gè)函數(shù)都是一個(gè)局部作用域。 ?

其實(shí)變量的作用域,就說指變量的有效范圍。我們最長(zhǎng)說的就是在函數(shù)中聲明的變量作用域。 ?

當(dāng)在函數(shù)中聲明一個(gè)變量的時(shí)候,如果改變量沒有用var關(guān)鍵字去定義那么該變量就是一個(gè)全局變量,但是這樣做最容易造成命名沖突。 ?

另一種情況就是使用var聲明的變量,這時(shí)候的變量就是局部變量,只有在該函數(shù)內(nèi)部可以訪問,在函數(shù)外面是訪問不到的 ?

在javascript中,函數(shù)可以用來創(chuàng)造函數(shù)作用域。在函數(shù)中搜索變量的時(shí)候,如果該函數(shù)當(dāng)中沒有這個(gè)變量,那么這次搜索過程會(huì)隨著代碼執(zhí)行環(huán)境創(chuàng)建的作用域鏈往外層逐層搜索,一直搜索到window對(duì)象為止,找不到就會(huì)拋出一個(gè)為定義的錯(cuò)誤。而這種從內(nèi)到外逐層查找的關(guān)系在js中我們稱為作用域鏈 ?

2.變量的生存周期

除了變量作用域之外,另外一個(gè)跟閉包有關(guān)的概念就是變量的生存周期,對(duì)于全局變量來說,全局變量的生存周期是永久的,除非我們主動(dòng)銷毀這個(gè)全局變量,而對(duì)于函數(shù)內(nèi)部的使用var聲明的變量來說,當(dāng)退出函數(shù)是,這些變量就會(huì)隨著函數(shù)的結(jié)束而銷毀。

3.閉包的形成

Javascript允許使用內(nèi)部函數(shù),可以將函數(shù)定義和函數(shù)表達(dá)式放在另一個(gè)函數(shù)的函數(shù)體內(nèi)。而且,內(nèi)部函數(shù)可以訪問它所在的外部函數(shù)聲明的局部變量、參數(shù)以及聲明的其他內(nèi)部函數(shù)。當(dāng)其中一個(gè)這樣的內(nèi)部函數(shù)在包含它們的外部函數(shù)之外被調(diào)用時(shí),就會(huì)形成閉包。常見的閉包寫法就是簡(jiǎn)單的函數(shù)套函數(shù),通過另一個(gè)函數(shù)訪問這個(gè)函數(shù)的局部變量,利用閉包可以突破作用域鏈,將函數(shù)內(nèi)部的變量和方法傳遞到外部,延續(xù)變量的生命。使用閉包可以減少全局環(huán)境的污染,也可用延續(xù)變量的生命。

4.閉包的適用場(chǎng)景

閉包的適用場(chǎng)景非常廣泛,首先從閉包的優(yōu)點(diǎn)出發(fā)就是:
減少全局環(huán)境的污染生成獨(dú)立的運(yùn)行環(huán)境
模塊化就是利用這個(gè)特點(diǎn)對(duì)不同的模塊都有自己獨(dú)立的運(yùn)行環(huán)境,不會(huì)和全局沖突,模塊和模塊之間通過拋出的接口進(jìn)行依賴使用
以及像我們常用的jquery類庫(kù)(避免和全局沖突使用閉包實(shí)現(xiàn)自己獨(dú)立的環(huán)境)

可以通過返回其他函數(shù)的方式突破作用域鏈
可以利用這個(gè)功能做一些值的緩存工作,例如常見的設(shè)計(jì)模式(單例模式),以及現(xiàn)在比較火的框架vue中的計(jì)算屬性

其實(shí)當(dāng)遇到以下場(chǎng)景的時(shí)候都可以使用閉包
1) 維護(hù)函數(shù)內(nèi)的變量安全,避免全局變量的污染。
2) 維持一個(gè)變量不被回收。
3) 封裝模塊

5.閉包的缺點(diǎn)

由于閉包會(huì)使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大。所以在閉包不用之后,將不使用的局部變量刪除,使其被回收。在IE中可能導(dǎo)致內(nèi)存泄露,即無法回收駐留在內(nèi)存中的元素,這時(shí)候需要手動(dòng)釋放。

6.內(nèi)存泄露

內(nèi)存泄漏指一塊被分配的內(nèi)存既不能使用,又不能回收,直到瀏覽器進(jìn)程結(jié)束。

出現(xiàn)原因:

1) 循環(huán)引用:含有DOM對(duì)象的循環(huán)引用將導(dǎo)致大部分當(dāng)前主流瀏覽器內(nèi)存泄露。循環(huán) 引用,簡(jiǎn)單來說假如a引用了b,b又引用了a,a和b就構(gòu)成了循環(huán)引用。
2) JS閉包:閉包,函數(shù)返回了內(nèi)部函數(shù)還可以繼續(xù)訪問外部方法中定義的私有變量。
3) Dom泄露,當(dāng)原有的DOM被移除時(shí),子結(jié)點(diǎn)引用沒有被移除則無法回收。??

7.JavaScript垃圾回收機(jī)制

Javascript中,如果一個(gè)對(duì)象不再被引用,那么這個(gè)對(duì)象就會(huì)被GC(garbage collection)回收。如果兩個(gè)對(duì)象互相引用,而不再被第3者所引用,那么這兩個(gè)互相引用的對(duì)象也會(huì)被回收。垃圾回收不是時(shí)時(shí)的,因?yàn)槠溟_銷比較大,所以垃圾回收器會(huì)按照固定的時(shí)間間隔周期性的執(zhí)行。

函數(shù)a被b引用,b又被a外的c引用,這就是為什么函數(shù)a執(zhí)行后不會(huì)被回收的原因。

8.垃圾回收的兩個(gè)方法: 標(biāo)記清除法:

1) 垃圾回收機(jī)制給存儲(chǔ)在內(nèi)存中的所有變量加上標(biāo)記,然后去掉環(huán)境中的變量以及被環(huán)境中變量所引用的變量(閉包)。
2) 操作1之后內(nèi)存中仍存在標(biāo)記的變量就是要?jiǎng)h除的變量,垃圾回收機(jī)制將這些帶有標(biāo)記的變量回收。

引用計(jì)數(shù)法:

1) 垃圾回收機(jī)制給一個(gè)變量一個(gè)引用次數(shù),當(dāng)聲明了一個(gè)變量并將一個(gè)引用類型賦值給該變量的時(shí)候這個(gè)值的引用次數(shù)就加1。
2) 當(dāng)該變量的值變成了另外一個(gè)值,則這個(gè)值得引用次數(shù)減1。
3) 當(dāng)這個(gè)值的引用次數(shù)變?yōu)?的時(shí)候,說明沒有變量在使用,垃圾回收機(jī)制會(huì)在運(yùn)行的時(shí)候清理掉引用次數(shù)為0的值占用的空間。

JS運(yùn)行機(jī)制

JavaScript引擎是單線程運(yùn)行的,瀏覽器無論在什么時(shí)候都只且只有一個(gè)線程在運(yùn)行JavaScript程序.瀏覽器的內(nèi)核是多線程的,它們?cè)趦?nèi)核制控下相互配合以保持同步,一個(gè)瀏覽器至少實(shí)現(xiàn)三個(gè)常駐線程:javascript引擎線程,GUI渲染線程,瀏覽器事件觸發(fā)線程。這些異步線程都會(huì)產(chǎn)生不同的異步的事件.

1) javascript引擎是基于事件驅(qū)動(dòng)單線程執(zhí)行的,JS引擎一直等待著任務(wù)隊(duì)列中任務(wù)的到來,然后加以處理,瀏覽器無論什么時(shí)候都只有一個(gè)JS線程在運(yùn)行JS程序。 ?
2) GUI渲染線程負(fù)責(zé)渲染瀏覽器界面,當(dāng)界面需要重繪(Repaint)或由于某種操作引發(fā)回流(reflow)時(shí),該線程就會(huì)執(zhí)行。但需要注意 GUI渲染線程與JS引擎是互斥的,當(dāng)JS引擎執(zhí)行時(shí)GUI線程會(huì)被掛起,GUI更新會(huì)被保存在一個(gè)隊(duì)列中等到JS引擎空閑時(shí)立即被執(zhí)行。 ?
3) 事件觸發(fā)線程,當(dāng)一個(gè)事件被觸發(fā)時(shí)該線程會(huì)把事件添加到待處理隊(duì)列的隊(duì)尾,等待JS引擎的處理。這些事件可來自JavaScript引擎當(dāng)前執(zhí)行的代碼塊如setTimeOut、也可來自瀏覽器內(nèi)核的其他線程如鼠標(biāo)點(diǎn)擊、AJAX異步請(qǐng)求等,但由于JS的單線程關(guān)系所有這些事件都得排隊(duì)等待JS引擎處理。(當(dāng)線程中沒有執(zhí)行任何同步代碼的前提下才會(huì)執(zhí)行異步代碼) ?

當(dāng)程序啟動(dòng)時(shí), 一個(gè)進(jìn)程被創(chuàng)建,同時(shí)也運(yùn)行一個(gè)線程, 即為主線程,js的運(yùn)行機(jī)制為單線程

程序中跑兩個(gè)線程,一個(gè)負(fù)責(zé)程序本身的運(yùn)行,作為主線程; 另一個(gè)負(fù)責(zé)主線程與其他線程的的通信,被稱為“Event Loop 線程" 。每當(dāng)遇到異步任務(wù),交給 EventLoop 線程,然后自己往后運(yùn)行,等到主線程運(yùn)行完后,再去 EventLoop 線程拿結(jié)果。

1)所有任務(wù)都在主線程上執(zhí)行,形成一個(gè)執(zhí)行棧(execution context stack)。

2)主線程之外,還存在一個(gè)"任務(wù)隊(duì)列"(task queue)。系統(tǒng)把異步任務(wù)放到"任務(wù)隊(duì)列"之中,然后繼續(xù)執(zhí)行后續(xù)的任務(wù)。

3)一旦"執(zhí)行棧"中的所有任務(wù)執(zhí)行完畢,系統(tǒng)就會(huì)讀取"任務(wù)隊(duì)列"。如果這個(gè)時(shí)候,異步任務(wù)已經(jīng)結(jié)束了等待狀態(tài),就會(huì)從"任務(wù)隊(duì)列"進(jìn)入執(zhí)行棧,恢復(fù)執(zhí)行。

4)主線程不斷重復(fù)上面的第三步。

"回調(diào)函數(shù)"(callback),就是那些會(huì)被主線程掛起來的代碼。異步任務(wù)必須指定回調(diào)函數(shù),當(dāng)異步任務(wù)從"任務(wù)隊(duì)列"回到執(zhí)行棧,回調(diào)函數(shù)就會(huì)執(zhí)行。"任務(wù)隊(duì)列"是一個(gè)先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),排在前面的事件,優(yōu)先返回主線程。主線程的讀取過程基本上是自動(dòng)的,只要執(zhí)行棧一清空,"任務(wù)隊(duì)列"上第一位的事件就自動(dòng)返回主線程。

主線程從"任務(wù)隊(duì)列"中讀取事件,這個(gè)過程是循環(huán)不斷的,所以整個(gè)的這種運(yùn)行機(jī)制又稱為Event Loop。

從主線程的角度看,一個(gè)異步過程包括下面兩個(gè)要素:

發(fā)起函數(shù)(或叫注冊(cè)函數(shù))A
回調(diào)函數(shù)callbackFn
它們都是在主線程上調(diào)用的,其中注冊(cè)函數(shù)用來發(fā)起異步過程,回調(diào)函數(shù)用來處理結(jié)果。

異步進(jìn)程有:

類似onclick等,由瀏覽器內(nèi)核的DOM binding模塊處理,事件觸發(fā)時(shí),回調(diào)函數(shù)添加到任務(wù)隊(duì)列中;
setTimeout等,由瀏覽器內(nèi)核的Timer模塊處理,時(shí)間到達(dá)時(shí),回調(diào)函數(shù)添加到任務(wù)隊(duì)列中;
Ajax,由瀏覽器內(nèi)核的Network模塊處理,網(wǎng)絡(luò)請(qǐng)求返回后,添加到任務(wù)隊(duì)列中。

例如setTimeout(fn, 1000),其中的setTimeout就是異步過程的發(fā)起函數(shù),fn是回調(diào)函數(shù)。用一句話概括:工作線程將消息放到消息隊(duì)列,主線程通過事件循環(huán)過程去取消息。

消息隊(duì)列:消息隊(duì)列是一個(gè)先進(jìn)先出的隊(duì)列,它里面存放著各種消息。
事件循環(huán):事件循環(huán)是指主線程重復(fù)從消息隊(duì)列中取消息、執(zhí)行的過程。

流程如下:

1) 主線程讀取js代碼, 形成相應(yīng)的堆和執(zhí)行棧, 執(zhí)行同步任務(wù)?
2) 當(dāng)主線程遇到異步任務(wù),,指定給異步進(jìn)程處理, 同時(shí)繼續(xù)執(zhí)行同步任務(wù)?
3) 當(dāng)異步進(jìn)程處理完畢后, 將相應(yīng)的異步任務(wù)推入到任務(wù)隊(duì)列首部?
4) 主線程任務(wù)處理完畢后,,查詢?nèi)蝿?wù)隊(duì)列,則取出一個(gè)任務(wù)隊(duì)列推入到主線程的執(zhí)行棧?
5) 重復(fù)執(zhí)行第2、3、4步,這就稱為事件循環(huán)?

JS-Web-API 知識(shí)點(diǎn)與高頻考題解析 BOM

BOM(瀏覽器對(duì)象模型)是瀏覽器本身的一些信息的設(shè)置和獲取,例如獲取瀏覽器的寬度、高度,設(shè)置讓瀏覽器跳轉(zhuǎn)到哪個(gè)地址。
navigator:?獲取瀏覽器特性(即俗稱的UA)然后識(shí)別客戶端
location:?獲取網(wǎng)址、協(xié)議、path、參數(shù)、hash 等
history: 操作瀏覽器的歷史紀(jì)錄,(前進(jìn),后退等功能)

1.什么是window對(duì)象? 什么是document對(duì)象?

window:它是一個(gè)頂層對(duì)象,而不是另一個(gè)對(duì)象的屬性,即瀏覽器的窗口。
document:代表整個(gè)HTML 文檔,可用來訪問頁(yè)面中的所有元素
Window 對(duì)象表示當(dāng)前瀏覽器的窗口,是JavaScript的頂級(jí)對(duì)象。我們創(chuàng)建的所有對(duì)象、函數(shù)、變量都是 Window 對(duì)象的成員。
Window 對(duì)象的方法和屬性是在全局范圍內(nèi)有效的。
Document 對(duì)象是 HTML 文檔的根節(jié)點(diǎn)與所有其他節(jié)點(diǎn)(元素節(jié)點(diǎn),文本節(jié)點(diǎn),屬性節(jié)點(diǎn), 注釋節(jié)點(diǎn))
Document 對(duì)象使我們可以通過腳本對(duì) HTML 頁(yè)面中的所有元素進(jìn)行訪問
Document 對(duì)象是 Window 對(duì)象的一部分,可通過 window.document 屬性對(duì)其進(jìn)行訪問

2.事件是?IE與火狐的事件機(jī)制有什么區(qū)別? 如何阻止冒泡?

1) 我們?cè)诰W(wǎng)頁(yè)中的某個(gè)操作(有的操作對(duì)應(yīng)多個(gè)事件)。例如:當(dāng)我們點(diǎn)擊一個(gè)按鈕就會(huì)產(chǎn)生一個(gè)事件。是可以被 JavaScript 偵測(cè)到的行為。
2) 事件處理機(jī)制:IE是事件冒泡、Firefox同時(shí)支持兩種事件模型,也就是:捕獲型事件和冒泡型事件;
3) ev.stopPropagation();(舊ie的方法 ev.cancelBubble = true;)

3.解釋一下事件代理

事件代理的原理其實(shí)就和作用域鏈的原理差不多,但是事件代理是利用事件的冒泡原理來實(shí)現(xiàn)的,事件代理就是通過給祖先元素添加事件,通過事件目標(biāo)對(duì)象開始向上查找找到匹配的子節(jié)點(diǎn)為止,如果找不到則到綁定事件的那個(gè)祖先元素為止,找到了就觸發(fā)事件,并且可以通過js中call和apply來改變觸發(fā)事件函數(shù)中的this為當(dāng)前綁定節(jié)點(diǎn),也是通過一層一層逐層向上的方式進(jìn)行匹配查找而觸發(fā)對(duì)應(yīng)事件,好處就是可以使后添加的dom元素也同樣有之前存在元素的事件,jquery中可以使用on,delegate,live實(shí)現(xiàn)的,不過在jquery1.7版本以后吧live給廢除了,原因就是live綁定事件的祖先元素是整個(gè)html頁(yè)面的根節(jié)點(diǎn),所以性能消耗比較大,在后邊的版本中給刪除了,使用on,delegate代替

優(yōu)點(diǎn):

使代碼簡(jiǎn)潔
減少瀏覽器的內(nèi)存占用

缺點(diǎn):

使用不當(dāng)會(huì)造成事件在不應(yīng)該觸發(fā)時(shí)觸發(fā)

function bindEvent(elem, type, selector, fn) { 
????// 這樣處理,可接收兩種調(diào)用方式 bindEvent(div1, "click", "a", function () {...}) 和 bindEvent(div1, "click", function () {...}) 這兩種 
????if (fn == null) { 
????????fn = selector 
????????selector = null 
????} 

????// 綁定事件 
????elem.addEventListener(type, function (e) { 
????????var target 
????????if (selector) { 
????????????// 有 selector 說明需要做事件代理 
????????????// 獲取觸發(fā)時(shí)間的元素,即 e.target 
????????????target = e.target 
????????????// 看是否符合 selector 這個(gè)條件 
????????????if (target.matches(selector)) { 
????????????????fn.call(target, e) 
????????????} 
????????} else { 
????????????// 無 selector ,說明不需要事件代理 
????????????fn(e) 
????????} 
????}) 
} 
// 使用代理,bindEvent 多一個(gè) "a" 參數(shù) 
var div1 = document.getElementById("div1") 
bindEvent(div1, "click", "a", function (e) { 
????console.log(this.innerHTML) 
}) 

// 不使用代理 
var a = document.getElementById("a1") 
bindEvent(div1, "click", function (e) { 
????console.log(a.innerHTML) 
}) 
4.offsetWidth/offsetHeight,clientWidth/clientHeight與scrollWidth/scrollHeight的區(qū)別

offsetWidth/offsetHeight返回值包含content + padding + border,效果與e.getBoundingClientRect()相同
clientWidth/clientHeight返回值只包含content + padding,如果有滾動(dòng)條,也不包含滾動(dòng)條
scrollWidth/scrollHeight返回值包含content + padding + 溢出內(nèi)容的尺寸

5.focus/blur與focusin/focusout的區(qū)別與聯(lián)系

focus/blur不冒泡,focusin/focusout冒泡
focus/blur兼容性好,focusin/focusout在除FireFox外的瀏覽器下都保持良好兼容性,如需使用事件托管,可考慮在FireFox下使用事件捕獲elem.addEventListener("focus", handler, true)

可獲得焦點(diǎn)的元素:

window
鏈接被點(diǎn)擊或鍵盤操作
表單空間被點(diǎn)擊或鍵盤操作
設(shè)置tabindex屬性的元素被點(diǎn)擊或鍵盤操作

6.mouseover/mouseout與mouseenter/mouseleave的區(qū)別與聯(lián)系

mouseover/mouseout是標(biāo)準(zhǔn)事件,所有瀏覽器都支持;mouseenter/mouseleave是IE5.5引入的特有事件后來被DOM3標(biāo)準(zhǔn)采納,現(xiàn)代標(biāo)準(zhǔn)瀏覽器也支持
mouseover/mouseout是冒泡事件;mouseenter/mouseleave不冒泡。需要為多個(gè)元素監(jiān)聽鼠標(biāo)移入/出事件時(shí),推薦mouseover/mouseout托管,提高性能
標(biāo)準(zhǔn)事件模型中event.target表示發(fā)生移入/出的元素,vent.relatedTarget對(duì)應(yīng)移出/如元素;在老IE中event.srcElement表示發(fā)生移入/出的元素,event.toElement表示移出的目標(biāo)元素,event.fromElement表示移入時(shí)的來源元素

7.介紹DOM0,DOM2,DOM3事件處理方式區(qū)別 DOM0級(jí)事件處理方式:

?

?btn.onclick = func;
? ?btn.onclick = null;

DOM2級(jí)事件處理方式:

? ?

btn.addEventListener("click", func, false); 
? ?btn.removeEventListener("click", func, false); 
? ?btn.attachEvent("onclick", func); 
? ?btn.detachEvent("onclick", func); 
DOM3級(jí)事件處理方式:

? ?eventUtil.addListener(input, "textInput", func);
? ?eventUtil 是自定義對(duì)象,textInput 是DOM3級(jí)事件

8.事件的三個(gè)階段

捕獲、目標(biāo)、冒泡

js的冒泡(Bubbling Event)和捕獲(Capture Event)的區(qū)別

冒泡型事件:事件按照從最特定的事件目標(biāo)到最不特定的事件目標(biāo)(document對(duì)象)的順序觸發(fā)。
捕獲型事件(event capturing):事件從最不精確的對(duì)象(document 對(duì)象)開始觸發(fā),然后到最精確(也可以在窗口級(jí)別捕獲事件,不過必須由開發(fā)人員特別指定)。
DOM事件流:同時(shí)支持兩種事件模型:捕獲型事件和冒泡型事件,但是,捕獲型事件先發(fā)生。兩種事件流會(huì)觸及DOM中的所有對(duì)象,從document對(duì)象開始,也在document對(duì)象結(jié)束。

事件捕獲

當(dāng)你使用事件捕獲時(shí),父級(jí)元素先觸發(fā),子級(jí)元素后觸發(fā),即div先觸發(fā),p后觸發(fā)。

事件冒泡

當(dāng)你使用事件冒泡時(shí),子級(jí)元素先觸發(fā),父級(jí)元素后觸發(fā),即p先觸發(fā),div后觸發(fā)。

阻止冒泡

在W3c中,使用stopPropagation()方法

在IE下設(shè)置cancelBubble = true;

在捕獲的過程中stopPropagation();后,后面的冒泡過程也不會(huì)發(fā)生了。

阻止捕獲

阻止事件的默認(rèn)行為,例如click 后的跳轉(zhuǎn)

在W3c中,使用preventDefault()方法;

在IE下設(shè)置window.event.returnValue = false;

9.介紹事件“捕獲”和“冒泡”執(zhí)行順序和事件的執(zhí)行次數(shù)?

按照W3C標(biāo)準(zhǔn)的事件:首是進(jìn)入捕獲階段,直到達(dá)到目標(biāo)元素,再進(jìn)入冒泡階段
事件執(zhí)行次數(shù)(DOM2-addEventListener):元素上綁定事件的個(gè)數(shù)
注意1:前提是事件被確實(shí)觸發(fā)
注意2:事件綁定幾次就算幾個(gè)事件,即使類型和功能完全一樣也不會(huì)“覆蓋”
事件執(zhí)行順序:判斷的關(guān)鍵是否目標(biāo)元素
非目標(biāo)元素:根據(jù)W3C的標(biāo)準(zhǔn)執(zhí)行:捕獲->目標(biāo)元素->冒泡(不依據(jù)事件綁定順序)
目標(biāo)元素:依據(jù)事件綁定順序:先綁定的事件先執(zhí)行(不依據(jù)捕獲冒泡標(biāo)準(zhǔn))
最終順序:父元素捕獲->目標(biāo)元素事件1->目標(biāo)元素事件2->子元素捕獲->子元素冒泡->父元素冒泡
注意:子元素事件執(zhí)行前提 事件確實(shí)“落”到子元素布局區(qū)域上,而不是簡(jiǎn)單的具有嵌套關(guān)系
在一個(gè)DOM上同時(shí)綁定兩個(gè)點(diǎn)擊事件:一個(gè)用捕獲,一個(gè)用冒泡。事件會(huì)執(zhí)行幾次,先執(zhí)行冒泡還是捕獲?

該DOM上的事件如果被觸發(fā),會(huì)執(zhí)行兩次(執(zhí)行次數(shù)等于綁定次數(shù))
如果該DOM是目標(biāo)元素,則按事件綁定順序執(zhí)行,不區(qū)分冒泡/捕獲
如果該DOM是處于事件流中的非目標(biāo)元素,則先執(zhí)行捕獲,后執(zhí)行冒泡

10.window.onload 和 document.DOMContentLoaded ?(注:$(document).ready()) ?的區(qū)別?

一般情況下,DOMContentLoaded事件要在window.onload之前執(zhí)行,當(dāng)DOM樹構(gòu)建完成的時(shí)候就會(huì)執(zhí)行DOMContentLoaded事件,而window.onload是在頁(yè)面載入完成的時(shí)候,才執(zhí)行,這其中包括圖片等元素。大多數(shù)時(shí)候我們只是想在DOM樹構(gòu)建完成后,綁定事件到元素,我們并不需要圖片元素,加上有時(shí)候加載外域圖片的速度非常緩慢。

DOM

講 DOM 先從 HTML 講起,講 HTML 先從 XML 講起。XML 是一種可擴(kuò)展的標(biāo)記語(yǔ)言,所謂可擴(kuò)展就是它可以描述任何結(jié)構(gòu)化的數(shù)據(jù),它是一棵樹!

1.documen.write和 innerHTML的區(qū)別

document.write只能重繪整個(gè)頁(yè)面
innerHTML可以重繪頁(yè)面的一部分

2.DOM操作——怎樣添加、移除、移動(dòng)、復(fù)制、創(chuàng)建和查找節(jié)點(diǎn)?

1)創(chuàng)建新節(jié)點(diǎn)

createDocumentFragment() ? ?//創(chuàng)建一個(gè)DOM片段 
createElement() ? //創(chuàng)建一個(gè)具體的元素 
createTextNode() ? //創(chuàng)建一個(gè)文本節(jié)點(diǎn) 

2)添加、移除、替換、插入

appendChild() 
removeChild() 
replaceChild() 
insertBefore() //在已有的子節(jié)點(diǎn)前插入一個(gè)新的子節(jié)點(diǎn) 

3)查找

getElementsByTagName() ? ?//通過標(biāo)簽名稱 
getElementsByName() ? ?//通過元素的Name屬性的值(IE容錯(cuò)能力較強(qiáng),會(huì)得到一個(gè)數(shù)組,其中包括id等于name值的) 
getElementById() ? ?//通過元素Id,唯一性


3.attribute和property的區(qū)別是什么?

attribute是dom元素在文檔中作為html標(biāo)簽擁有的屬性;
property就是dom元素在js中作為對(duì)象擁有的屬性。
所以: ?
對(duì)于html的標(biāo)準(zhǔn)屬性來說,attribute和property是同步的,是會(huì)自動(dòng)更新的,
但是對(duì)于自定義的屬性來說,他們是不同步的,

4.src和href的區(qū)別

src用于替換當(dāng)前元素,href用于在當(dāng)前文檔和引用資源之間確立聯(lián)系。
src是source的縮寫,指向外部資源的位置,指向的內(nèi)容將會(huì)嵌入到文檔中當(dāng)前標(biāo)簽所在位置;在請(qǐng)求src資源時(shí)會(huì)將其指向的資源下載并應(yīng)用到文檔內(nèi),當(dāng)瀏覽器解析到該元素時(shí),會(huì)暫停其他資源的下載和處理,直到將該資源加載、編譯、執(zhí)行完畢,圖片和框架等元素也如此,類似于將所指向資源嵌入當(dāng)前標(biāo)簽內(nèi)。這也是為什么將js腳本放在底部而不是頭部。
Src source,指向外部資源的位置,如果我們添加瀏覽器會(huì)暫停其他資源的下載和處理,直到該資源加載,編譯,執(zhí)行完畢(圖片和框架也是如此),這也就是為什么js腳本要放在底部。
src用于替換當(dāng)前元素,href用于在當(dāng)前文檔和引入資源之間建立聯(lián)系。

對(duì)象

1,JavaScript繼承的幾種實(shí)現(xiàn)方式?

1)構(gòu)造函數(shù)繼承,使用call和apply兩個(gè)方法的特性可以實(shí)現(xiàn),改變方法中的this 
2)原型鏈繼承 
3)組合式繼承 
2.javascript創(chuàng)建對(duì)象的幾種方式?

javascript創(chuàng)建對(duì)象簡(jiǎn)單的說,無非就是使用內(nèi)置對(duì)象或各種自定義對(duì)象,當(dāng)然還可以用JSON;但寫法有很多種,也能混合使用。
1) 對(duì)象字面量的方式 ? ? ? person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};
2) 用function來模擬無參的構(gòu)造函數(shù)
? ? ? ? ?

?function Person(){}
? ? ? ? ? ? ? ? ? ? ? ?var person=new Person();//定義一個(gè)function,如果使用new"實(shí)例化",該function可以看作是一個(gè)Class
? ? ? ? ? ? ? ? ? ? ? ?person.name=“Mark";
? ? ? ? ? ? ? ? ? ? ? ?person.age="25";
? ? ? ? ? ? ? ? ? ? ? ?person.work=function(){
? ? ? ? ? ? ? ? ? ? ? ?alert(person.name+" hello...");
? ? ? ? ? ?}
? ? ? ? ? ?person.work();

3) 用function來模擬參構(gòu)造函數(shù)來實(shí)現(xiàn)(用this關(guān)鍵字定義構(gòu)造的上下文屬性)
? ? ? ? ?

?function Pet(name,age,hobby){
? ? ? ? ? ? ? ? ? ? ? ?this.name=name;//this作用域:當(dāng)前對(duì)象
? ? ? ? ? ? ? ? ? ? ? ?this.age=age;
? ? ? ? ? ? ? ? ? ? ? ?this.hobby=hobby;
? ? ? ? ? ? ? ? ? ? ? ?this.eat=function(){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?alert("我叫"+this.name+",我喜歡"+this.hobby+",是個(gè)程序員");
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ?var maidou =new Pet("麥兜",25,"coding");//實(shí)例化、創(chuàng)建對(duì)象
? ? ? ? ? ?maidou.eat();//調(diào)用eat方法

4) 用工廠方式來創(chuàng)建(內(nèi)置對(duì)象)
? ? ? ? ? ? ? ? ? ? ?

 var wcDog =new Object(); 
? ? ? ? ? ? ? ? ? ? ? wcDog.name="旺財(cái)"; 
? ? ? ? ? ? ? ? ? ? ? wcDog.age=3; 
? ? ? ? ? ? ? ? ? ? ? wcDog.work=function(){ 
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?alert("我是"+wcDog.name+",汪汪汪......"); 
? ? ? ? ? ? ? ? ? ? ? ? } 
? ? ? ? ? ?wcDog.work(); 
5、用原型方式來創(chuàng)建 
? ? ? ? ? ?function Dog(){ } 
? ? ? ? ? ?Dog.prototype.name="旺財(cái)"; 
? ? ? ? ? ?Dog.prototype.eat=function(){alert(this.name+"是個(gè)吃貨");} 
? ? ? ? ? ?var wangcai =new Dog(); 
? ? ? ? ? ?wangcai.eat(); 

5) 用混合方式來創(chuàng)建
? ? ? ? ? ?

function Car(name,price){ 
? ? ? ? ? ? ? ? ? ? ? ?this.name=name; 
? ? ? ? ? ? ? ? ? ? ? ?this.price=price; 
? ? ? ? ? ?} 
? ? ? ? ? ?Car.prototype.sell=function(){ 
? ? ? ? ? ? ? ? ? ? ? ?alert("我是"+this.name+",我現(xiàn)在賣"+this.price+"萬元"); 
? ? ? ? ? ? } 
? ? ? ? ? ? var camry =new Car("凱美瑞",27); 
? ? ? ? ? ?camry.sell();


3.談?wù)凾his對(duì)象的理解。

this分為幾個(gè)不同的使用場(chǎng)景,在function中this指的的是window,如果是實(shí)用new 調(diào)用的話this指的是當(dāng)前的實(shí)例化對(duì)象,在事件調(diào)用函數(shù)中this指的調(diào)用事件的window特殊的是在IE中的attachEvent中的this總是指向全局對(duì)象Window;,在定時(shí)器中this指的是window,在es6中有一個(gè)箭頭函數(shù),在箭頭函數(shù)中this永遠(yuǎn)指向的是父級(jí)對(duì)象,this也是可以改變的,在js中call, apply, bind都可以改變this的指向, call, apply都是執(zhí)行一個(gè)函數(shù)并且改變this,區(qū)別就是參數(shù)傳遞不一樣,而bind是返回一個(gè)綁定this之后的新函數(shù)

4.javascript 代碼中的"use strict";是什么意思 ? 使用它區(qū)別是什么?

use strict是一種ECMAscript 5 添加的(嚴(yán)格)運(yùn)行模式,這種模式使得 Javascript 在更嚴(yán)格的條件下運(yùn)行,

使JS編碼更加規(guī)范化的模式,消除Javascript語(yǔ)法的一些不合理、不嚴(yán)謹(jǐn)之處,減少一些怪異行為。
默認(rèn)支持的糟糕特性都會(huì)被禁用,比如不能用with,也不能在意外的情況下給全局變量賦值;
全局變量的顯示聲明,函數(shù)必須聲明在頂層,不允許在非函數(shù)代碼塊內(nèi)聲明函數(shù),arguments.callee也不允許使用;
消除代碼運(yùn)行的一些不安全之處,保證代碼運(yùn)行的安全,限制函數(shù)中的arguments修改,嚴(yán)格模式下的eval函數(shù)的行為和非嚴(yán)格模式的也不相同;

提高編譯器效率,增加運(yùn)行速度;
為未來新版本的Javascript標(biāo)準(zhǔn)化做鋪墊。

5.JSON 的了解?

JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。
它是基于JavaScript的一個(gè)子集。數(shù)據(jù)格式簡(jiǎn)單, 易于讀寫, 占用帶寬小
如:{"age":"12", "name":"back"}
JSON字符串轉(zhuǎn)換為JSON對(duì)象:

var obj =eval("("+ str +")"); 
var obj = str.parseJSON(); 
var obj = JSON.parse(str); 

JSON對(duì)象轉(zhuǎn)換為JSON字符串:

var last=obj.toJSONString(); 
var last=JSON.stringify(obj);
6. .call() 和 .apply() 的區(qū)別? 7.什么是函數(shù)節(jié)流?介紹一下應(yīng)用場(chǎng)景和原理?

函數(shù)節(jié)流(throttle)是指阻止一個(gè)函數(shù)在很短時(shí)間間隔內(nèi)連續(xù)調(diào)用。 只有當(dāng)上一次函數(shù)執(zhí)行后達(dá)到規(guī)定的時(shí)間間隔,才能進(jìn)行下一次調(diào)用。 但要保證一個(gè)累計(jì)最小調(diào)用間隔(否則拖拽類的節(jié)流都將無連續(xù)效果)

函數(shù)節(jié)流用于 onresize, onscroll 等短時(shí)間內(nèi)會(huì)多次觸發(fā)的事件

函數(shù)節(jié)流的原理:使用定時(shí)器做時(shí)間節(jié)流。 當(dāng)觸發(fā)一個(gè)事件時(shí),先用 setTimout 讓這個(gè)事件延遲一小段時(shí)間再執(zhí)行。 如果在這個(gè)時(shí)間間隔內(nèi)又觸發(fā)了事件,就 clearTimeout 原來的定時(shí)器, 再 setTimeout 一個(gè)新的定時(shí)器重復(fù)以上流程。

函數(shù)節(jié)流簡(jiǎn)單實(shí)現(xiàn):

function throttle(method, context) { 
? ? clearTimeout(methor.tId); 
? ? method.tId = setTimeout(function(){ 
? ? ? ? method.call(context); 
? ? }, 100); // 兩次調(diào)用至少間隔 100ms 
} 
// 調(diào)用 
window.onresize = function(){ 
? ?throttle(myFunc, window); 
} 
8.new 操作符具體干了什么?

創(chuàng)建實(shí)例對(duì)象,this 變量引用該對(duì)象,同時(shí)還繼承了構(gòu)造函數(shù)的原型
屬性和方法被加入到 this 引用的對(duì)象中
新創(chuàng)建的對(duì)象由 this 所引用,并且最后隱式的返回 this

new共經(jīng)歷了四個(gè)過程。
var fn = function () { }; 
var fnObj = new fn(); 

1)創(chuàng)建了一個(gè)空對(duì)象

var obj = new object(); 

2)設(shè)置原型鏈

obj._proto_ = fn.prototype; 

3)讓fn的this指向obj,并執(zhí)行fn的函數(shù)體

var result = fn.call(obj); 

4)判斷fn的返回值類型,如果是值類型,返回obj。如果是引用類型,就返回這個(gè)引用類型的對(duì)象。

if (typeof(result) == "object"){ 
fnObj = result; 
} else { 
fnObj = obj;} 
兼容與優(yōu)化 1.頁(yè)面重構(gòu)怎么操作?

網(wǎng)站重構(gòu):在不改變外部行為的前提下,簡(jiǎn)化結(jié)構(gòu)、添加可讀性,而在網(wǎng)站前端保持一致的行為。
也就是說是在不改變UI的情況下,對(duì)網(wǎng)站進(jìn)行優(yōu)化,在擴(kuò)展的同時(shí)保持一致的UI。
對(duì)于傳統(tǒng)的網(wǎng)站來說重構(gòu)通常是:
表格(table)布局改為DIV+CSS
使網(wǎng)站前端兼容于現(xiàn)代瀏覽器(針對(duì)于不合規(guī)范的CSS、如對(duì)IE6有效的)
對(duì)于移動(dòng)平臺(tái)的優(yōu)化
針對(duì)于SEO進(jìn)行優(yōu)化
深層次的網(wǎng)站重構(gòu)應(yīng)該考慮的方面
減少代碼間的耦合 ? ? ? ? ? ? ?
讓代碼保持彈性
嚴(yán)格按規(guī)范編寫代碼
設(shè)計(jì)可擴(kuò)展的API
代替舊有的框架、語(yǔ)言(如VB)
增強(qiáng)用戶體驗(yàn)

通常來說對(duì)于速度的優(yōu)化也包含在重構(gòu)中
壓縮JS、CSS、image等前端資源(通常是由服務(wù)器來解決)
程序的性能優(yōu)化(如數(shù)據(jù)讀寫)
采用CDN來加速資源加載
對(duì)于JS DOM的優(yōu)化
HTTP服務(wù)器的文件緩存

2.列舉IE與其他瀏覽器不一樣的特性?

1)事件不同之處:
? ?1-1,觸發(fā)事件的元素被認(rèn)為是目標(biāo)(target)。而在 IE 中,目標(biāo)包含在 event 對(duì)象的 srcElement 屬性;
? ?1-2,獲取字符代碼、如果按鍵代表一個(gè)字符(shift、ctrl、alt除外),IE 的 keyCode 會(huì)返回字符代碼(Unicode),DOM 中按鍵的代碼和字符是分離的,要獲取字符代碼,需要使用 charCode 屬性;
? ?1-3,阻止某個(gè)事件的默認(rèn)行為,IE 中阻止某個(gè)事件的默認(rèn)行為,必須將 returnValue 屬性設(shè)置為 false,Mozilla 中,需要調(diào)用 preventDefault() 方法;
? ?1-4,停止事件冒泡,IE 中阻止事件進(jìn)一步冒泡,需要設(shè)置 cancelBubble 為 true,Mozzilla 中,需要調(diào)用 stopPropagation();

3.什么叫優(yōu)雅降級(jí)和漸進(jìn)增強(qiáng)?

優(yōu)雅降級(jí):Web站點(diǎn)在所有新式瀏覽器中都能正常工作,如果用戶使用的是老式瀏覽器,則代碼會(huì)針對(duì)舊版本的IE進(jìn)行降級(jí)處理了,使之在舊式瀏覽器上以某種形式降級(jí)體驗(yàn)卻不至于完全不能用。
如:border-shadow

漸進(jìn)增強(qiáng):從被所有瀏覽器支持的基本功能開始,逐步地添加那些只有新版本瀏覽器才支持的功能,向頁(yè)面增加不影響基礎(chǔ)瀏覽器的額外樣式和功能的。當(dāng)瀏覽器支持時(shí),它們會(huì)自動(dòng)地呈現(xiàn)出來并發(fā)揮作用。
如:默認(rèn)使用flash上傳,但如果瀏覽器支持 HTML5 的文件上傳功能,則使用HTML5實(shí)現(xiàn)更好的體驗(yàn);

4.說說嚴(yán)格模式的限制

嚴(yán)格模式主要有以下限制:
變量必須聲明后再使用
函數(shù)的參數(shù)不能有同名屬性,否則報(bào)錯(cuò)
不能使用with語(yǔ)句
不能對(duì)只讀屬性賦值,否則報(bào)錯(cuò)
不能使用前綴0表示八進(jìn)制數(shù),否則報(bào)錯(cuò)
不能刪除不可刪除的屬性,否則報(bào)錯(cuò)
不能刪除變量delete prop,會(huì)報(bào)錯(cuò),只能刪除屬性delete global[prop]
eval不會(huì)在它的外層作用域引入變量
eval和arguments不能被重新賦值
arguments不會(huì)自動(dòng)反映函數(shù)參數(shù)的變化
不能使用arguments.callee
不能使用arguments.caller
禁止this指向全局對(duì)象
不能使用fn.caller和fn.arguments獲取函數(shù)調(diào)用的堆棧
增加了保留字(比如protected、static和interface)
設(shè)立"嚴(yán)格模式"的目的,主要有以下幾個(gè):
消除Javascript語(yǔ)法的一些不合理、不嚴(yán)謹(jǐn)之處,減少一些怪異行為;
消除代碼運(yùn)行的一些不安全之處,保證代碼運(yùn)行的安全;
提高編譯器效率,增加運(yùn)行速度;
為未來新版本的Javascript做好鋪墊。
注:經(jīng)過測(cè)試IE6,7,8,9均不支持嚴(yán)格模式。

5.檢測(cè)瀏覽器版本版本有哪些方式?

根據(jù) navigator.userAgent // UA.toLowerCase().indexOf("chrome")
根據(jù) window 對(duì)象的成員 // "ActiveXObject" in window

6.總結(jié)前端性能優(yōu)化的解決方案

優(yōu)化原則和方向
性能優(yōu)化的原則是以更好的用戶體驗(yàn)為標(biāo)準(zhǔn),具體就是實(shí)現(xiàn)下面的目標(biāo):
多使用內(nèi)存、緩存或者其他方法
減少 CPU 和GPU 計(jì)算,更快展現(xiàn)

優(yōu)化的方向有兩個(gè):
減少頁(yè)面體積,提升網(wǎng)絡(luò)加載
優(yōu)化頁(yè)面渲染

減少頁(yè)面體積,提升網(wǎng)絡(luò)加載
靜態(tài)資源的壓縮合并(JS 代碼壓縮合并、CSS 代碼壓縮合并、雪碧圖)
靜態(tài)資源緩存(資源名稱加 MD5 戳)
使用 CDN 讓資源加載更快

優(yōu)化頁(yè)面渲染
CSS 放前面,JS 放后面
懶加載(圖片懶加載、下拉加載更多)
減少DOM 查詢,對(duì) DOM 查詢做緩存
減少DOM 操作,多個(gè)操作盡量合并在一起執(zhí)行(DocumentFragment)
事件節(jié)流
盡早執(zhí)行操作(DOMContentLoaded)
使用 SSR 后端渲染,數(shù)據(jù)直接輸出到 HTML 中,減少瀏覽器使用 JS 模板渲染頁(yè)面 HTML 的時(shí)間

7.圖片懶加載與預(yù)加載

圖片懶加載的原理就是暫時(shí)不設(shè)置圖片的src屬性,而是將圖片的url隱藏起來,比如先寫在data-src里面,等某些事件觸發(fā)的時(shí)候(比如滾動(dòng)到底部,點(diǎn)擊加載圖片)再將圖片真實(shí)的url放進(jìn)src屬性里面,從而實(shí)現(xiàn)圖片的延遲加載
圖片預(yù)加載是指在一些需要展示大量圖片的網(wǎng)站,實(shí)現(xiàn)圖片的提前加載。從而提升用戶體驗(yàn)。常用的方式有兩種,一種是隱藏在css的background的url屬性里面,一種是通過javascript的Image對(duì)象設(shè)置實(shí)例對(duì)象的src屬性實(shí)現(xiàn)圖片的預(yù)加載。相關(guān)代碼如下:

CSS預(yù)加載圖片方式:
#preload-01 { background: url(http://domain.tld/image-01.png) no-repeat -9999px -9999px; } ? 
#preload-02 { background: url(http://domain.tld/image-02.png) no-repeat -9999px -9999px; } ? 
#preload-03 { background: url(http://domain.tld/image-03.png) no-repeat -9999px -9999px; } 
Javascript預(yù)加載圖片的方式:
function preloadImg(url) { 
? ?var img = new Image(); 
? ?img.src = url; 
? ?if(img.complete) { 
? ? ? ?//接下來可以使用圖片了 
? ? ? ?//do something here 
? ?} else { 
? ? ? ?img.onload = function() { 
? ? ? ? ? ?//接下來可以使用圖片了 
? ? ? ? ? ?//do something here 
? ? ? ?}; 
? ?} 
} 
5.描述瀏覽器的渲染過程,DOM樹和渲染樹的區(qū)別?

瀏覽器的渲染過程:
解析HTML構(gòu)建 DOM(DOM樹),并行請(qǐng)求 css/image/js
CSS 文件下載完成,開始構(gòu)建 CSSOM(CSS樹)
CSSOM 構(gòu)建結(jié)束后,和 DOM 一起生成 Render Tree(渲染樹)
布局(Layout):計(jì)算出每個(gè)節(jié)點(diǎn)在屏幕中的位置
顯示(Painting):通過顯卡把頁(yè)面畫到屏幕上
DOM樹 和 渲染樹 的區(qū)別:
DOM樹與HTML標(biāo)簽一一對(duì)應(yīng),包括head和隱藏元素
渲染樹不包括head和隱藏元素,大段文本的每一個(gè)行都是獨(dú)立節(jié)點(diǎn),每一個(gè)節(jié)點(diǎn)都有對(duì)應(yīng)的css屬性

7.重繪和回流(重排)的區(qū)別和關(guān)系?

重繪:當(dāng)渲染樹中的元素外觀(如:顏色)發(fā)生改變,不影響布局時(shí),產(chǎn)生重繪
回流:當(dāng)渲染樹中的元素的布局(如:尺寸、位置、隱藏/狀態(tài)狀態(tài))發(fā)生改變時(shí),產(chǎn)生重繪回流
注意:JS獲取Layout屬性值(如:offsetLeft、scrollTop、getComputedStyle等)也會(huì)引起回流。因?yàn)闉g覽器需要通過回流計(jì)算最新值
回流必將引起重繪,而重繪不一定會(huì)引起回流

8.如何最小化重繪(repaint)和回流(reflow)?

需要要對(duì)元素進(jìn)行復(fù)雜的操作時(shí),可以先隱藏(display:"none"),操作完成后再顯示

需要?jiǎng)?chuàng)建多個(gè)DOM節(jié)點(diǎn)時(shí),使用DocumentFragment創(chuàng)建完后一次性的加入document
緩存Layout屬性值,
如:var left = elem.offsetLeft; 這樣,多次使用 left 只產(chǎn)生一次回流

盡量避免用table布局(table元素一旦觸發(fā)回流就會(huì)導(dǎo)致table里所有的其它元素回流)

避免使用css表達(dá)式(expression),因?yàn)槊看握{(diào)用都會(huì)重新計(jì)算值(包括加載頁(yè)面)

盡量使用 css 屬性簡(jiǎn)寫,如:用 border 代替 border-width, border-style, border-color

批量修改元素樣式:elem.className 和 elem.style.cssText 代替 elem.style.xxx

9.script 的位置是否會(huì)影響首屏顯示時(shí)間?

在解析 HTML 生成 DOM 過程中,js 文件的下載是并行的,不需要 DOM 處理到 script 節(jié)點(diǎn)。因此,script的位置不影響首屏顯示的開始時(shí)間。
瀏覽器解析 HTML 是自上而下的線性過程,script作為 HTML 的一部分同樣遵循這個(gè)原則
因此,script 會(huì)延遲 DomContentLoad,只顯示其上部分首屏內(nèi)容,從而影響首屏顯示的完成時(shí)間

存儲(chǔ) cookie

cookie 本身不是用來做服務(wù)器端存儲(chǔ)的(計(jì)算機(jī)領(lǐng)域有很多這種“狗拿耗子”的例子,例如 CSS 中的 float),它是設(shè)計(jì)用來在服務(wù)器和客戶端進(jìn)行信息傳遞的,因此我們的每個(gè) HTTP 請(qǐng)求都帶著 cookie。但是 cookie 也具備瀏覽器端存儲(chǔ)的能力(例如記住用戶名和密碼),因此就被開發(fā)者用上了。

使用起來也非常簡(jiǎn)單,document.cookie = ....即可。

但是 cookie 有它致命的缺點(diǎn):

存儲(chǔ)量太小,只有 4KB
所有 HTTP 請(qǐng)求都帶著,會(huì)影響獲取資源的效率
API 簡(jiǎn)單,需要封裝才能用

locationStorage 和 sessionStorage

后來,HTML5 標(biāo)準(zhǔn)就帶來了sessionStorage和localStorage,先拿localStorage來說,它是專門為了瀏覽器端緩存而設(shè)計(jì)的。

其優(yōu)點(diǎn)有:

存儲(chǔ)量增大到 5MB
不會(huì)帶到 HTTP 請(qǐng)求中
API 適用于數(shù)據(jù)存儲(chǔ) localStorage.setItem(key, value) localStorage.getItem(key)
sessionStorage的區(qū)別就在于它是根據(jù) session 過去時(shí)間而實(shí)現(xiàn),而localStorage會(huì)永久有效,應(yīng)用場(chǎng)景不同。例如,一些需要及時(shí)失效的重要信息放在sessionStorage中,一些不重要但是不經(jīng)常設(shè)置的信息,放在localStorage中。

es6/7 1.說說對(duì)es6的理解(說一下es6,知道es6嗎)

語(yǔ)法糖(箭頭函數(shù),類的定義,繼承),以及一些新的擴(kuò)展(數(shù)組,字符串,對(duì)象,方法等),對(duì)作用域的重新定義,以及異步編程的解決方案(promise,async,await)、解構(gòu)賦值的出現(xiàn)

2.ES6常用特性

變量定義(let和const,可變與不可變,const定義對(duì)象的特殊情況)
解構(gòu)賦值
模板字符串
數(shù)組新API(例:Array.from(),entries(),values(),keys())
箭頭函數(shù)(rest參數(shù),擴(kuò)展運(yùn)算符,::綁定this)
Set和Map數(shù)據(jù)結(jié)構(gòu)(set實(shí)例成員值唯一存儲(chǔ)key值,map實(shí)例存儲(chǔ)鍵值對(duì)(key-value))
Promise對(duì)象(前端異步解決方案進(jìn)化史,generator函數(shù),async函數(shù))
Class語(yǔ)法糖(super關(guān)鍵字)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

3.說說你對(duì)Promise的理解

Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件監(jiān)聽——更合理和更強(qiáng)大。Promise 有三種狀態(tài):pending(進(jìn)行中)、fulfilled(已成功)和rejected(已失敗)。但是無法獲取到pending狀態(tài),在promise中接受兩個(gè)內(nèi)置參數(shù)分別是resolve(成功)和reject(失敗),Promise實(shí)例生成以后,可以用then方法分別指定resolved狀態(tài)和rejected狀態(tài)的回調(diào)函數(shù)。then方法可以傳遞兩個(gè)回調(diào)函數(shù)第一個(gè)是成功,第二個(gè)是失敗,失敗回調(diào)也可以使用promise的catch方法回調(diào),promise還有一個(gè)強(qiáng)大的功能那就是all方法可以組合多個(gè)promise實(shí)例,包裝成一個(gè)新的 Promise 實(shí)例。

4.介紹一下async和await;

async 會(huì)將其后的函數(shù)(函數(shù)表達(dá)式或 Lambda)的返回值封裝成一個(gè) Promise 對(duì)象,而 await 會(huì)等待這個(gè) Promise 完成,并將其 resolve 的結(jié)果返回出來。

async / await是ES7的重要特性之一,也是目前社區(qū)里公認(rèn)的優(yōu)秀異步解決方案。目前async / await 在 IE edge中已經(jīng)可以直接使用了,但是chrome和Node.js還沒有支持。幸運(yùn)的是,babel已經(jīng)支持async的transform了,所以我們使用的時(shí)候引入babel就行。在開始之前我們需要引入以下的package,preset-stage-3里就有我們需要的async/await的編譯文件。

5.es6中的Module

ES6 中模塊化語(yǔ)法更加簡(jiǎn)潔,使用export拋出,使用import from 接收,
如果只是輸出一個(gè)唯一的對(duì)象,使用export default即可
// 創(chuàng)建 util1.js 文件,內(nèi)容如

export default { 
????a: 100 
} 

// 創(chuàng)建 index.js 文件,內(nèi)容如

import obj from "./util1.js" 

如果想要輸出許多個(gè)對(duì)象,就不能用default了,且import時(shí)候要加{...},代碼如下
// 創(chuàng)建 util2.js 文件,內(nèi)容如

export function fn1() { 
????alert("fn1") 
} 
export function fn2() { 
????alert("fn2") 
} 

// 創(chuàng)建 index.js 文件,內(nèi)容如

import { fn1, fn2 } from "./util2.js’ 
6.ES6 class 和普通構(gòu)造函數(shù)的區(qū)別

class 其實(shí)一直是 JS 的關(guān)鍵字(保留字),但是一直沒有正式使用,直到 ES6 。 ES6 的 class 就是取代之前構(gòu)造函數(shù)初始化對(duì)象的形式,從語(yǔ)法上更加符合面向?qū)ο蟮膶懛?
1)class 是一種新的語(yǔ)法形式,是class Name {...}這種形式,和函數(shù)的寫法完全不一樣 ?
2)兩者對(duì)比,構(gòu)造函數(shù)函數(shù)體的內(nèi)容要放在 class 中的constructor函數(shù)中,constructor即構(gòu)造器,初始化實(shí)例時(shí)默認(rèn)執(zhí)行 ?
3)class 中函數(shù)的寫法是add() {...}這種形式,并沒有function關(guān)鍵字 ?
而且使用 class 來實(shí)現(xiàn)繼承就更加簡(jiǎn)單了
在class中直接extends關(guān)鍵字就可以實(shí)現(xiàn)繼承,而不像之前的繼承實(shí)現(xiàn)有多種不同的實(shí)現(xiàn)方式,在es6中就只有一種

注意以下兩點(diǎn):
使用extends即可實(shí)現(xiàn)繼承,更加符合經(jīng)典面向?qū)ο笳Z(yǔ)言的寫法,如 Java
子類的constructor一定要執(zhí)行super(),以調(diào)用父類的constructor

7.ES6 中新增的數(shù)據(jù)類型有哪些?

Set 和 Map 都是 ES6 中新增的數(shù)據(jù)結(jié)構(gòu),是對(duì)當(dāng)前 JS 數(shù)組和對(duì)象這兩種重要數(shù)據(jù)結(jié)構(gòu)的擴(kuò)展。由于是新增的數(shù)據(jù)結(jié)構(gòu)
1)Set 類似于數(shù)組,但數(shù)組可以允許元素重復(fù),Set 不允許元素重復(fù) ?
2)Map 類似于對(duì)象,但普通對(duì)象的 key 必須是字符串或者數(shù)字,而 Map 的 key 可以是任何數(shù)據(jù)類型 ?

8.箭頭函數(shù)的作用域上下文和 普通函數(shù)作用域上下文 的區(qū)別

箭頭函數(shù)其實(shí)只是一個(gè)密名函數(shù)的語(yǔ)法糖,區(qū)別在于普通函數(shù)作用域中的this有特定的指向,一般指向window,而箭頭函數(shù)中的this只有一個(gè)指向那就是指當(dāng)前函數(shù)所在的對(duì)象,其實(shí)現(xiàn)原理其實(shí)就是類似于之前編程的時(shí)候在函數(shù)外圍定義that一樣,用了箭頭函數(shù)就不用定義that了直接使用this

9.es6如何轉(zhuǎn)為es5?

使用Babel 轉(zhuǎn)碼器,Babel 的配置文件是.babelrc,存放在項(xiàng)目的根目錄下。使用 Babel 的第一步,就是配置這個(gè)文件。

算法 1.淺拷貝vs深拷貝

拷貝其實(shí)就是對(duì)象復(fù)制,為了解決對(duì)象復(fù)制是產(chǎn)生的引用類型問題
淺拷貝:利用迭代器,循環(huán)對(duì)象將對(duì)象中的所有可枚舉屬性復(fù)制到另一個(gè)對(duì)象上,但是淺拷貝的有一個(gè)問題就是只是拷貝了對(duì)象的一級(jí),其他級(jí)還如果是引用類型的值的話依舊解決不了
深拷貝:深拷貝解決了淺拷貝的問題,利用遞歸的形勢(shì)便利對(duì)象的每一級(jí),實(shí)現(xiàn)起來較為復(fù)雜,得判斷值是數(shù)組還是對(duì)象,簡(jiǎn)單的說就是,在內(nèi)存中存在兩個(gè)數(shù)據(jù)結(jié)構(gòu)完全相同又相互獨(dú)立的數(shù)據(jù),將引用型類型進(jìn)行復(fù)制,而不是只復(fù)制其引用關(guān)系。

2.常見的幾種數(shù)組排序算法JS實(shí)現(xiàn) 1)快速排序

從給定的數(shù)據(jù)中,隨機(jī)抽出一項(xiàng),這項(xiàng)的左邊放所有比它小的,右邊放比它大的,然后再分別這兩邊執(zhí)行上述操作,采用的是遞歸的思想,總結(jié)出來就是 實(shí)現(xiàn)一層,分別給兩邊遞歸,設(shè)置好出口

function fastSort(array,head,tail){ 
? ?//考慮到給每個(gè)分區(qū)操作的時(shí)候都是在原有的數(shù)組中進(jìn)行操作的,所以這里head,tail來確定分片的位置 
? ?/*生成隨機(jī)項(xiàng)*/ 
? ?var randomnum = Math.floor(ranDom(head,tail)); 
? ?var random = array[randomnum]; 
? ?/*將小于random的項(xiàng)放置在其左邊 ?策略就是通過一個(gè)臨時(shí)的數(shù)組來儲(chǔ)存分好區(qū)的結(jié)果,再到原數(shù)組中替換*/ 
? ?var arrayTemp = []; 
? ?var unshiftHead = 0; 
? ?for(var i = head;i <= tail;i++){ 
? ? ?if(array[i]random){ 
? ? ? ?arrayTemp.push(array[i]); 
? ? ?} 
? ? ?/*當(dāng)它等于的時(shí)候放哪,這里我想選擇放到隊(duì)列的前面,也就是從unshift后的第一個(gè)位置放置*/ 
? ? ?if(array[i]===random){ 
? ? ? ?arrayTemp.splice(unshiftHead,0,array[i]); 
? ? ?} 
? ?} 
? ?/*將對(duì)應(yīng)項(xiàng)覆蓋原來的記錄*/ 
? ?for(var j = head , u=0;j <= tail;j++,u++){ 
? ? ?array.splice(j,1,arrayTemp[u]); 
? ?} 
? ?/*尋找中間項(xiàng)所在的index*/ 
? ?var nowIndex = array.indexOf(random); 

? ?/*設(shè)置出口,當(dāng)要放進(jìn)去的片段只有2項(xiàng)的時(shí)候就可以收工了*/ 
? ?if(arrayTemp.length <= 2){ 
? ? ?return; 
? ?} 
? ?/*遞歸,同時(shí)應(yīng)用其左右兩個(gè)區(qū)域*/ 
? ?fastSort(array,head,nowIndex); 
? ?fastSort(array,nowIndex+1,tail); 
} 
2)插入排序

思想就是在已經(jīng)排好序的數(shù)組中插入到相應(yīng)的位置,以從小到大排序?yàn)槔瑨呙枰呀?jīng)排好序的片段的每一項(xiàng),如大于,則繼續(xù)往后,直到他小于一項(xiàng)時(shí),將其插入到這項(xiàng)的前面

function insertSort(array){ 
? ?/*start根據(jù)已排列好的項(xiàng)數(shù)決定*/ 
? ?var start=1; 
? ?/*按順序,每一項(xiàng)檢查已排列好的序列*/ 
? ?for(var i=start; i
3)冒泡排序

故名思意 ,就是一個(gè)個(gè)冒泡到最前端或者最后端,主要是通過兩兩依次比較,以升序?yàn)槔绻耙豁?xiàng)比后一項(xiàng)大則交換順序,一直比到最后一對(duì)

function bubbleSort(array){ 
? ?/*給每個(gè)未確定的位置做循環(huán)*/ 
? ?for(var unfix=array.length-1; unfix>0; unfix--){ 
? ? ?/*給進(jìn)度做個(gè)記錄,比到未確定位置*/ 
? ? ?for(var i=0; iarray[i+1]){ 
? ? ? ? ?var temp = array[i]; 
? ? ? ? ?array.splice(i,1,array[i+1]); 
? ? ? ? ?array.splice(i+1,1,temp); 
? ? ? ?} 
? ? ?} 
? ?} 
?} 
4)選擇排序

將當(dāng)前未確定塊的min或者max取出來插到最前面或者后面

 function selectSort(array){ 
    ? ?/*給每個(gè)插入后的未確定的范圍循環(huán),初始是從0開始*/ 
    ? ?for(var unfixed=0; unfixedarray[j]){ 
    ? ? ? ? ?min = array[j]; 
    ? ? ? ? ?minIndex = j; 
    ? ? ? ?} 
    ? ? ?} 
    ? ? ?/*將最小值插入到unfixed,并且把它所在的原有項(xiàng)替換成*/ 
    ? ? ?array.splice(unfixed,0,min); 
    ? ? ?array.splice(minIndex+1,1); 
    ? ?} 
    ?} 
3.寫一個(gè)數(shù)組去重的方法
/** 方法一: 
* 1.構(gòu)建一個(gè)新的數(shù)組存放結(jié)果 
* 2.for循環(huán)中每次從原數(shù)組中取出一個(gè)元素,用這個(gè)元素循環(huán)與結(jié)果數(shù)組對(duì)比 
* 3.若結(jié)果數(shù)組中沒有該元素,則存到結(jié)果數(shù)組中 
* 缺陷:不能去重?cái)?shù)組中得引用類型的值和NaN 
*/ 
function unique(array){ 
??var result = []; 
??for(var i = 0;i < array.length; i++){ 
????if(result.indexOf(array[i]) == -1) { 
??????result.push(array[i]); 
????} 
??} 
??return result; 
} 

// [1,2,1,2,"1","2",0,"1","你好","1","你好",NaN,NaN] => [1, 2, "1", "2", 0, "你好",NaN,NaN] 
// [{id: "1"}, {id: "1"}] => [{id: "1"}, {id: "1’}] 

//方法二:ES6 
Array.from(new Set(array)) 
// [1,2,1,2,"1","2",0,"1","你好","1","你好",NaN,NaN] => [1, 2, "1", "2", 0, "你好", NaN] 
4.說一下js模板引擎

模板引擎原理總結(jié)起來就是:先獲取html中對(duì)應(yīng)的id下得innerHTML,利用開始標(biāo)簽和關(guān)閉標(biāo)簽進(jìn)行字符串切分,其實(shí)是將模板劃分成兩部份內(nèi)容,一部分是html部分,一部分是邏輯部分,通過區(qū)別一些特殊符號(hào)比如each、if等來將字符串拼接成函數(shù)式的字符串,將兩部分各自經(jīng)過處理后,再次拼接到一起,最后將拼接好的字符串采用new Function()的方式轉(zhuǎn)化成所需要的函數(shù)。
常用的模版引擎主要有,Template.js,handlebars.js

5.是否了解公鑰加密和私鑰加密。

一般情況下是指私鑰用于對(duì)數(shù)據(jù)進(jìn)行簽名,公鑰用于對(duì)簽名進(jìn)行驗(yàn)證;
HTTP網(wǎng)站在瀏覽器端用公鑰加密敏感數(shù)據(jù),然后在服務(wù)器端再用私鑰解密。

6.js深度復(fù)制的方式

1)使用jq的$.extend(true, target, obj)
2)newobj = Object.create(sourceObj),// 但是這個(gè)是有個(gè)問題就是 newobj的更改不會(huì)影響到 sourceobj但是 sourceobj的更改會(huì)影響到newObj
3)newobj = JSON.parse(JSON.stringify(sourceObj))

7.js設(shè)計(jì)模式

總體來說設(shè)計(jì)模式分為三大類
創(chuàng)建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
結(jié)構(gòu)型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責(zé)任鏈模式、命令模式、備忘錄模式、狀態(tài)模式、訪問者模式、中介者模
詳細(xì):詳情
http://www.alloyteam.com/2012...

8.圖片懶加載與預(yù)加載?

1)圖片懶加載的原理就是暫時(shí)不設(shè)置圖片的src屬性,而是將圖片的url隱藏起來,比如先寫在data-src里面,等某些事件觸發(fā)的時(shí)候(比如滾動(dòng)到底部,點(diǎn)擊加載圖片)再將圖片真實(shí)的url放進(jìn)src屬性里面,從而實(shí)現(xiàn)圖片的延遲加載
Javascript預(yù)加載圖片的方式:

function preloadImg(url) {
????var img = new Image();
????img.src = url;
????if(img.complete) {
????????//接下來可以使用圖片了
????????//do something here
????} else {
????????img.onload = function() {
????????????//接下來可以使用圖片了
????????????//do something here
????????};
????}
}

2)圖片預(yù)加載,是指在一些需要展示大量圖片的網(wǎng)站,實(shí)現(xiàn)圖片的提前加載。從而提升用戶體驗(yàn)。常用的方式有兩種,一種是隱藏在css的background的url屬性里面,一種是通過javascript的Image對(duì)象設(shè)置實(shí)例對(duì)象的src屬性實(shí)現(xiàn)圖片的預(yù)加載。
CSS預(yù)加載圖片方式:

#preload-01 { background: url(http://domain.tld/image-01.png) no-repeat -9999px -9999px; }??
#preload-02 { background: url(http://domain.tld/image-02.png) no-repeat -9999px -9999px; }??
#preload-03 { background: url(http://domain.tld/image-03.png) no-repeat -9999px -9999px; }
9.統(tǒng)計(jì)字符串中次數(shù)最多字母
function findMaxDuplicateChar(str) { 
??if(str.length == 1) { 
????return str; 
??} 
??var charObj = {}; 
??for(var i = 0; i < str.length; i++) { 
????if(!charObj[str.charAt(i)]) { 
??????charObj[str.charAt(i)] = 1; 
????} else { 
??????charObj[str.charAt(i)] += 1; 
????} 
??} 
??var maxChar = "", 
??????maxValue = 1; 
??for(var k in charObj) { 
????if(charObj[k] >= maxValue) { 
??????maxChar = k; 
??????maxValue = charObj[k]; 
????} 
??} 
??return maxChar + ":" + maxValue; 
} 
19.{{BANNED}}題目解析

https://juejin.im/entry/58ada...

11.對(duì)Node的優(yōu)點(diǎn)和缺點(diǎn)提出了自己的看法?

(優(yōu)點(diǎn))因?yàn)镹ode是基于事件驅(qū)動(dòng)和無阻塞的,所以非常適合處理并發(fā)請(qǐng)求,因此構(gòu)建在Node上的代理服務(wù)器相比其他技術(shù)實(shí)現(xiàn)(如Ruby)的服務(wù)器表現(xiàn)要好得多。此外,與Node代理服務(wù)器交互的客戶端代碼是由javascript語(yǔ)言編寫的,因此客戶端和服務(wù)器端都用同一種語(yǔ)言編寫,這是非常美妙的事情。

(缺點(diǎn))Node是一個(gè)相對(duì)新的開源項(xiàng)目,所以不太穩(wěn)定,它總是一直在變,而且缺少足夠多的第三方庫(kù)支持。看起來,就像是Ruby/Rails當(dāng)年的樣子。

模塊化 1.commonjs?requirejs?AMD|CMD|UMD?

1)CommonJS就是為JS的表現(xiàn)來制定規(guī)范,NodeJS是這種規(guī)范的實(shí)現(xiàn),webpack 也是以CommonJS的形式來書寫。因?yàn)閖s沒有模塊的功能,所以CommonJS應(yīng)運(yùn)而生。但它不能在瀏覽器中運(yùn)行。 CommonJS定義的模塊分為:{模塊引用(require)} {模塊定義(exports)} {模塊標(biāo)識(shí)(module)}

2)RequireJS 是一個(gè)JavaScript模塊加載器。?????????RequireJS有兩個(gè)主要方法(method): defi

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/96530.html

相關(guān)文章

  • 你不能錯(cuò)過的前端面試題合集

    摘要:收集的一些前端面試題從面試題發(fā)現(xiàn)不足,進(jìn)而查漏補(bǔ)缺,比通過面試更難得及各大互聯(lián)網(wǎng)公司前端筆試面試題篇及各大互聯(lián)網(wǎng)公司前端筆試面試題篇面試題個(gè)和個(gè)經(jīng)典面試題前端開發(fā)面試題如何面試前端工程師很重要個(gè)變態(tài)題解析如何通過餓了么面試輕 收集的一些前端面試題 從面試題發(fā)現(xiàn)不足,進(jìn)而查漏補(bǔ)缺,比通過面試更難得 1 BAT及各大互聯(lián)網(wǎng)公司2014前端筆試面試題--Html,Css篇 2 BAT...

    ninefive 評(píng)論0 收藏0
  • 你不能錯(cuò)過的前端面試題合集

    摘要:收集的一些前端面試題從面試題發(fā)現(xiàn)不足,進(jìn)而查漏補(bǔ)缺,比通過面試更難得及各大互聯(lián)網(wǎng)公司前端筆試面試題篇及各大互聯(lián)網(wǎng)公司前端筆試面試題篇面試題個(gè)和個(gè)經(jīng)典面試題前端開發(fā)面試題如何面試前端工程師很重要個(gè)變態(tài)題解析如何通過餓了么面試輕 收集的一些前端面試題 從面試題發(fā)現(xiàn)不足,進(jìn)而查漏補(bǔ)缺,比通過面試更難得 1 BAT及各大互聯(lián)網(wǎng)公司2014前端筆試面試題--Html,Css篇 2 BAT...

    darkbaby123 評(píng)論0 收藏0
  • 7個(gè) Javascript 面試題及回答策略

    摘要:使用異步編程,有一個(gè)事件循環(huán)。它作為面向?qū)ο缶幊痰奶娲桨福渲袘?yīng)用狀態(tài)通常與對(duì)象中的方法搭配并共享。在用面向?qū)ο缶幊虝r(shí)遇到不同的組件競(jìng)爭(zhēng)相同的資源的時(shí)候,更是如此。 翻譯:瘋狂的技術(shù)宅原文:https://www.indeed.com/hire/i... 本文首發(fā)微信公眾號(hào):jingchengyideng歡迎關(guān)注,每天都給你推送新鮮的前端技術(shù)文章 不管你是面試官還是求職者,里面...

    李義 評(píng)論0 收藏0
  • 深入理解js

    摘要:詳解十大常用設(shè)計(jì)模式力薦深度好文深入理解大設(shè)計(jì)模式收集各種疑難雜癥的問題集錦關(guān)于,工作和學(xué)習(xí)過程中遇到過許多問題,也解答過許多別人的問題。介紹了的內(nèi)存管理。 延遲加載 (Lazyload) 三種實(shí)現(xiàn)方式 延遲加載也稱為惰性加載,即在長(zhǎng)網(wǎng)頁(yè)中延遲加載圖像。用戶滾動(dòng)到它們之前,視口外的圖像不會(huì)加載。本文詳細(xì)介紹了三種延遲加載的實(shí)現(xiàn)方式。 詳解 Javascript十大常用設(shè)計(jì)模式 力薦~ ...

    caikeal 評(píng)論0 收藏0
  • 前端資源系列(4)-前端學(xué)習(xí)資源分享&前端面試資源匯總

    摘要:特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點(diǎn)多,可以很快搞定,沒想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補(bǔ)充。有錯(cuò)誤的地方,還請(qǐng)斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會(huì)及時(shí)更新,平時(shí)業(yè)務(wù)工作時(shí)也會(huì)不定期更...

    princekin 評(píng)論0 收藏0
  • 你需要知道面試中的10個(gè)JavaScript概念

    摘要:自我學(xué)習(xí)目前有成千上萬的年輕人在學(xué)習(xí)和開發(fā),希望獲得一份工作。知道的綁定規(guī)則。知道和原型屬性是什么以及它們的作用。高階函數(shù)了解函數(shù)是中的一級(jí)對(duì)象,這意味著什么知道從另一個(gè)函數(shù)返回函數(shù)是完全合法的。了解閉包和高階函數(shù)允許我們使用的情況。 翻譯原文出處:10 JavaScript concepts you need to know for interviews 之前不是鬧得沸沸揚(yáng)揚(yáng)的大漠窮...

    YacaToy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

fantix

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<