前端面試知識點錦集(JavaScript篇)絕對乾貨

1、談談你對Ajax的理解?(概念、特點、作用) 
2、說說你對延遲對象deferred的理解? 
3、什麼是跨域,如何實現跨域訪問? 
4、爲什麼要使用模板引擎? 
5、JavaScript是一門什麼樣的語言,它有哪些特點? 
6、JavaScript的數據類型有哪些? 
7、已知ID的Input輸入框,如何獲取這個輸入框的輸入值?(不使用第三方框架) 
8、根據你的理解,請簡述JavaScript腳本的執行原理? 
9、DOM操作怎樣添加、移除、移動、複製、創建和查找節點? 
10、說說你對json的理解? 
11、ionic和angularjs的區別? 
12、談談你對閉包的理解? 
13、談談你This對象的理解? 
14、JavaScript對象的幾種創建方式? 
15、get和post的區別,何時使用post 
16、null和undefined的區別? 
17、請寫出js內存泄漏的問題? 
18、哪些地方會出現css阻塞,哪些地方會出現js阻塞? 
19、對比Flash與ajax哪個好? 
20、請你解釋一下事件冒泡機制 
21、請你說說split()與join() 函數的區別? 
22、說說你對Promise的理解? 
23、談談你對Javascript垃圾回收機制的理解? 
24、說說你對原型(prototype)理解? 
25、typeof與instanceof的區別是什麼? 
26、說說你對node.js的理解 
27、NPM(包管理器)作用是什麼?

1、談談你對Ajax的理解?(概念、特點、作用)

AJAX全稱爲“Asynchronous JavaScript And XML”(異步JavaScript和XML) 是指一種創建交互式網頁應用的開發技術、改善用戶體驗,實現無刷新效果。

優點

a、不需要插件支持 
b、優秀的用戶體驗 
c、提高Web程序的性能 
d、減輕服務器和帶寬的負擔

缺點

a、破壞瀏覽器“前進”、“後退”按鈕的正常功能,可以通過簡單的插件彌補 
b、對搜索引擎的支持不足

2、說說你對延遲對象deferred的理解?

deferred對象是從jQuery 1.5.0版本開始引入的一個新功能。

a、什麼是deferred對象

開發網站的過程中,我們經常遇到某些耗時很長的javascript操作。其中,既有異步的操作(比如ajax讀取服務器數據),也有同步的操作(比如遍歷一個大型數組),它們都不是立即能得到結果的。 
通常的做法是,爲它們指定回調函數(callback)。即事先規定,一旦它們運行結束,應該調用哪些函數。 
但是,在回調函數方面,jQuery的功能非常弱。爲了改變這一點,jQuery開發團隊就設計了deferred對象。 
簡單說,deferred對象就是jQuery的回調函數解決方案。在英語中,defer的意思是”延遲”,所以deferred對象的含義就是”延遲”到未來某個點再執行。 
它解決了如何處理耗時操作的問題,對那些操作提供了更好的控制,以及統一的編程接口。

b、它的主要功能,可以歸結爲四點:

(1)、實現鏈式操作 
(2)、指定同一操作的多個回調函數 
(3)、爲多個操作指定回調函數 
(4)、普通操作的回調函數接口

3、什麼是跨域,如何實現跨域訪問?

跨域是指不同域名之間相互訪問。 
JavaScript同源策略的限制,A域名下的JavaScript無法操作B或是C域名下的對象


實現:

(1)、JSONP跨域:利用script腳本允許引用不同域下的js實現的,將回調方法帶入服務器,返回結果時回調。 
(2)、跨域資源共享(CORS) 
跨域資源共享(CORS)是一種網絡瀏覽器的技術規範,它爲Web服務器定義了一種方式,允許網頁從不同的域訪問其資源。

CORS與JSONP相比:

a、 JSONP只能實現GET請求,而CORS支持所有類型的HTTP請求。 
b、 使用CORS,開發者可以使用普通的XMLHttpRequest發起請求和獲得數據,比起JSONP有更好的錯誤處理。 
c、 JSONP主要被老的瀏覽器支持,它們往往不支持CORS,而絕大多數現代瀏覽器都已經支持了CORS。

4、爲什麼要使用模板引擎?

a、模板引擎(這裏特指用於Web開發的模板引擎)是爲了使用戶界面與業務數據(內容)分離而產生的,它可以生成特定格式的文檔,用於網站的模板引擎就會生成一個標準的HTML文檔。 
b、在一些示例中javascript有大量的html字符串,html中有一些像onclick樣的javascript,這樣javascript中有html,html中有javascript,代碼的偶合度很高,不便於修改與維護,使用模板引擎可以解決問題。

5、JavaScript是一門什麼樣的語言,它有哪些特點?

JavaScript 是一種腳本語言,官方名稱爲 ECMAScript(因定義語言的標準爲 ECMA-262)。 
JS 的主要特點: 
a、語法類似於常見的高級語言,如 C 和 Java; 
b、腳本語言,不需要編譯就可以由解釋器直接運行; 
c、 變量鬆散定義,屬於弱類型語言; 
d、面向對象的。 
JS 最初是爲網頁設計而開發的,現在也是Web 開發的重要語言。它支持對瀏覽器(瀏覽器對象模型,BOM)和HTML 文檔(文檔對象模型,DOM)進行操作而使網頁呈現動態的交互特性。 
嚴格的說,JS只是ECMAScript 的一種實現,是ECMAScript和BOM、DOM組成的一種Web 開發技術。

6、JavaScript的數據類型有哪些?

基本數據類型:字符串 String、數字 Number、布爾Boolean 
複合數據類型:數組 Array、對象 Object 
特殊數據類型:Null 空對象、Undefined 未定義

7、已知ID的Input輸入框,如何獲取這個輸入框的輸入值?(不使用第三方框架)

document.getElementById("ID").value

8、根據你的理解,請簡述JavaScript腳本的執行原理?

JavaScript是一種動態、弱類型、基於原型的語言,通過瀏覽器可以直接執行。 
當瀏覽器遇到\<script> 標記的時候,瀏覽器會執行之間的javascript代碼。嵌入的js代碼是順序執行的,每個腳本定義的全局變量和函數,都可以被後面執行的腳本所調用。 變量的調用,必須是前面已經聲明,否則獲取的變量值是undefined。

9、DOM操作怎樣添加、移除、移動、複製、創建和查找節點?

(1)創建新節點

createDocumentFragment() //創建一個DOM片段

createElement() //創建一個具體的元素

createTextNode() //創建一個文本節點

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

appendChild()

removeChild()

replaceChild()

insertBefore() //在已有的子節點前插入一個新的子節點

(3)查找

getElementsByTagName() //通過標籤名稱

getElementsByName() //通過元素的Name屬性的值(IE容錯能力較強,會得到一個數組,其中包括id等於name值的)

getElementById() //通過元素Id,唯一性

10、說說你對json的理解?

回答一:

a、JSON對象:以“{”開始,以“}”結束,裏面則是一系列的鍵(key)值(value)對,鍵和值用“:”分開,每對鍵值對之間用“,”分開。參考以下語法結構:{key1:value1,key2:value2,key3:value3…}其中鍵(key)是字符串,而值(value)可以是字符串,數值,true,false,null,對象或數組,也就是說某個鍵(key)的值(value)可以是一個數組,數組裏面又是一些JSON對象,這種表示稍微複雜一些,但是參照這些理解可以很容易分辨出來。 
b、JSON數組:以”[”開始,”]”結束,如同程序語言一樣,例如C#,Button[] btnArray,則BtnArray是一個Button類型的數組,裏面就存放Button類型的對象,那麼JSON數組也一樣,裏面存放的也是JSON對象.

回答二:

a、JSON 指的是 JavaScript 對象表示法(JavaScript Object Notation) 
b、JSON 是輕量級的文本數據交換格式,並不是編程語言 
c、JSON 獨立於語言存在 
d、JSON 具有自我描述性,更易理解 
e、JSON 可以將 JavaScript 對象中表示的一組數據轉換爲字符串,然後就可以在函數之間輕鬆地傳遞這個字符串,或者在異步應用程序中將字符串從 Web 客戶機傳遞給服務器端程序。這個字符串看起來有點兒古怪,但是JavaScript很容易解釋它,而且 JSON 可以表示比”名稱 / 值對”更復雜的結構。例如,可以表示數組和複雜的對象,而不僅僅是鍵和值的簡單列表

回答三:

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。 
它是基於JavaScript的一個子集。數據格式簡單, 易於讀寫, 佔用帶寬小. 
json簡單說就是javascript中的對象和數組,所以這兩種結構就是對象和數組兩種結構,通過這兩種結構可以表示各種複雜的結構。 
(1)、對象:對象在js中表示爲“{}”括起來的內容,數據結構爲 {key:value,key:value,…}的鍵值對的結構,在面向對象的語言中,key爲對象的屬性,value爲對應的屬性值,所以很容易理解,取值方法爲 對象.key 獲取屬性值,這個屬性值的類型可以是 數字、字符串、數組、對象幾種。 
(1)、數組:數組在js中是中括號“[]”括起來的內容,數據結構爲 [“java”,”javascript”,”vb”,…],取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是數字、字符串、數組、對象幾種。 
經過對象、數組2種結構就可以組合成複雜的數據結構了。

11、ionic和angularjs的區別?

a、ionic是一個用來開發混合手機應用的,開源的,免費的代碼庫。可以優化html、css和js的性能,構建高效的應用程序,而且還可以用於構建Sass和AngularJS的優化。 
b、AngularJS通過新的屬性和表達式擴展了HTML。AngularJS可以構建一個單一頁面應用程序(SPAs:Single Page Applications)。 
c、Ionic是一個混合APP開發工具,它以AngularJS爲中間腳本工具(稱爲庫,似乎又不恰當),所以,你如果要使用Ionic開發APP,就必須瞭解AngularJS。

12、談談你對閉包的理解?

(1)、使用閉包主要是爲了設計私有的方法和變量。閉包的優點是可以避免全局變量的污染,缺點是閉包會常駐內存,會增大內存使用量,使用不當很容易造成內存泄露。 
(2)、閉包有三個特性: 
a、函數嵌套函數 
b、函數內部可以引用外部的參數和變量 
c、參數和變量不會被垃圾回收機制回收

13、談談你This對象的理解?

回答一:

(1)、js的this指向是不確定的,也就是說是可以動態改變的。call/apply 就是用於改變this指向的函數,這樣設計可以讓代碼更加靈活,複用性更高 
(2)、this 一般情況下,都是指向函數的擁有者。 
(3)、在函數自執行裏,this 指向的是 window 對象。 
擴展:關於this,還有一個地方比較讓人模糊的是在dom事件裏,通常有如下3種情況: 
a、使用標籤屬性註冊事件,此時this指向的是window對象。 
b、對與a,要讓this指向input,可以將this作爲參數傳遞。 
c、使用addEventListener等註冊事件。此時this也是指向 input。

回答二:

(1)、處於全局作用域下的this:

this;/*window*/

var a = {name: this}/*window*/

var b = [this];/*window*/

在全局作用域下,this默認指向window對象。 
(2)、處在函數中的this,又分爲以下幾種情況: 
a、一般定義的函數,然後一般的執行:

var a = function(){

console.log(this);

}

a();/*window*/

this還是默認指向window。 
b、一般定義,用new調用執行:

var a = function(){

console.log(this);

}

new a();/*新建的空對象*/

這時候讓this指向新建的空對象,我們纔可以給空對象初始化自有變量 
c、作爲對象屬性的函數,調用時:

var a = {

f:function(){

console.log(this)

}

}

a.f();/*a對象*/

這時候this指向調用f函數的a對象。 
(3)、通過call()和apply()來改變this的默認引用:

var b = {id: 'b'};

var a = {

f:function(){

console.log(this)

 }

}

a.f.call(b);/*window*/

所有函數對象都有的call方法和apply方法,它們的用法大體相似,f.call(b);的意思 是,執行f函數,並將f函數執行期活動對象裏的this指向b對象,這樣標示符解析時,this就會是b對象了。不過調用函數是要傳參的。所以,f.call(b, x, y); f.apply(b, [x, y]);好吧,以上就是用call方法執行f函數,與用apply方法執行f函數時傳參方式,它們之間的差異,大家一目瞭然:apply通過數組的方式傳遞參數,call通過一個個的形參傳遞參數。 
(4)、一些函數特殊執行情況this的指向問題: 
a、setTimeout()和setInverval():

var a = function(){

console.log(this);

}

setTimeout(a,0);/*window*/

setInterval()類似。 
b、dom模型中觸發事件的回調方法執行中活動對象裏的this指向該dom對象。

14、JavaScript對象的幾種創建方式?

(1) 工廠模式

function Parent(){

var Child = new Object();

Child.name="欲淚成雪";

Child.age="20";

return Child;

};

var x = Parent();

引用該對象的時候,這裏使用的是 var x = Parent()而不是 var x = new Parent();因爲後者會可能出現很多問題(前者也成爲工廠經典方式,後者稱之爲混合工廠方式),不推薦使用new的方式使用該對象

(2)構造函數方式

function Parent(){

  this.name="欲淚成雪";

  this.age="20";

};

var x =new Parent();

(3) 原型模式

function Parent(){

};

Parent.prototype.name="欲淚成雪";

Parent.prototype.age="20";

var x =new Parent();

(4)混合的構造函數,原型方式(推薦)

function Parent(){

  this.name="欲淚成雪";

  this.age=22;

};

Parent.prototype.lev=function(){

  return this.name;

};

var x =new Parent();

(5)動態原型方式

function Parent(){

  this.name="欲淚成雪";

  this.age=22;

;

if(typeof Parent._lev=="undefined"){

Parent.prototype.lev=function(){

  return this.name;

}

Parent._lev=true;

}

};

var x =new Parent();

15、get和post的區別,何時使用post

(1)、get 是從服務器上獲取數據,post 是向服務器傳送數據。 get 請求返回 request - URI 所指出的任意信息。 
Post 請求用來發送電子郵件、新聞或發送能由交互用戶填寫的表格。這是唯一需要在請求中發送body的請求。使用Post請求時需要在報文首部 Content - Length 字段中指出body的長度。 
(2)、get 是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到。post是通過HTTP post機制,將表單內各個字段與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址,用戶看不到這個過程。 
(3)、對於 get 方式,服務器端用Request.QueryString獲取變量的值,對於 post 方式,服務器端用Request.Form獲取提交的數據。 
(4)、get 傳送的數據量較小,不能大於2KB。post 傳送的數據量較大,一般被默認爲不受限制。但理論上,IIS4中最大量爲80KB,IIS5中爲100KB。 用IIS過濾器的只接受get參數,所以一般大型搜索引擎都是用get方式。 
(5)get安全性非常低,post 安全性相對較高。如果這些數據是中文數據而且是 
非敏感數據,那麼使用get;如果用戶輸入的數據不是中文字符而且包含敏感數據,那麼還是使用 post 爲好。

16、null和undefined的區別?

(1)、null是一個表示”無”的對象,轉爲數值時爲0;undefined是一個表示”無”的原始值,轉爲數值時爲NaN。當聲明的變量還未被初始化時,變量的默認值爲undefined。 
(2)、null用來表示尚未存在的對象,常用來表示函數企圖返回一個不存在的對象。 
(3)、undefined表示”缺少值”,就是此處應該有一個值,但是還沒有定義。典型用法是: 
a、變量被聲明瞭,但沒有賦值時,就等於undefined。 
b、調用函數時,應該提供的參數沒有提供,該參數等於undefined。 
c、對象沒有賦值的屬性,該屬性的值爲undefined。 
d、函數沒有返回值時,默認返回undefined。 
(4)、null表示”沒有對象”,即該處不應該有值。典型用法是: 
a、作爲函數的參數,表示該函數的參數不是對象。 
b、作爲對象原型鏈的終點。

17、請寫出js內存泄漏的問題?

回答一:

(1)、IE7/8 DOM對象或者ActiveX對象循環引用導致內存泄漏 
a、多個對象循環引用 
b、循環引用自己 
(2)、基礎的DOM泄漏 
當原有的DOM被移除時,子結點引用沒有被移除則無法回收。 
(3)、timer定時器泄漏 
這個時候你無法回收buggyObject,解決辦法,先停止timer然後再回收

回答二:

內存泄漏指任何對象在您不再擁有或需要它之後仍然存在。 
垃圾回收器定期掃描對象,並計算引用了每個對象的其他對象的數量。如果一個對象的引用數量爲 0(沒有其他對象引用過該對象),或對該對象的惟一引用是循環的,那麼該對象的內存即可回收。 
setTimeout 的第一個參數使用字符串而非函數的話,會引發內存泄漏。 
閉包、控制檯日誌、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)也會引發內存泄漏問題。

18、哪些地方會出現css阻塞,哪些地方會出現js阻塞?

js的阻塞特性:

所有瀏覽器在下載JS的時候,會阻止一切其他活動,比如其他資源的下載,內容的呈現等等。直到JS下載、解析、執行完畢後纔開始繼續並行下載其他資源並呈現內容。爲了提高用戶體驗,新一代瀏覽器都支持並行下載JS,但是JS下載仍然會阻塞其它資源的下載(例如.圖片,css文件等)。 
由於瀏覽器爲了防止出現JS修改DOM樹,需要重新構建DOM樹的情況,所以就會阻塞其他的下載和呈現。 
嵌入JS會阻塞所有內容的呈現,而外部JS只會阻塞其後內容的顯示,2種方式都會阻塞其後資源的下載。也就是說外部樣式不會阻塞外部腳本的加載,但會阻塞外部腳本的執行。

CSS怎麼會阻塞加載?

CSS本來是可以並行下載的,在什麼情況下會出現阻塞加載了(在測試觀察中,IE6下CSS都是阻塞加載) 
當CSS後面跟着嵌入的JS的時候,該CSS就會出現阻塞後面資源下載的情況。而當把嵌入JS放到CSS前面,就不會出現阻塞的情況了。 
根本原因:因爲瀏覽器會維持html中css和js的順序,樣式表必須在嵌入的JS執行前先加載、解析完。而嵌入的JS會阻塞後面的資源加載,所以就會出現上面CSS阻塞下載的情況。

JS應該放在什麼位置?

(1)、放在底部,雖然放在底部照樣會阻塞所有呈現,但不會阻塞資源下載。 
(2)、如果嵌入JS放在head中,請把嵌入JS放在CSS頭部。 
(3)、使用defer(只支持IE) 
(4)、不要在嵌入的JS中調用運行時間較長的函數,如果一定要用,可以用setTimeout來調用

Javascript無阻塞加載具體方式

將腳本放在底部。\還是放在head中,用以保證在js加載前,能加載出正常顯示的頁面。\<script>標籤放在\前。 
成組腳本:由於每個\<script>標籤下載時阻塞頁面解析過程,所以限制頁面的\<script>總數也可以改善性能。適用於內聯腳本和外部腳本。 
非阻塞腳本:等頁面完成加載後,再加載js代碼。也就是,在window.onload事件發出後開始下載代碼。 
(1)defer屬性:支持IE4和fierfox3.5更高版本瀏覽器 
(2)動態腳本元素:文檔對象模型(DOM)允許你使用js動態創建HTML的幾乎全部文檔內容。代碼如下:

<script>

var script=document.createElement("script");

script.type="text/javascript";

script.src="file.js";

document.getElementsByTagName("head")[0].appendChild(script);

</script>

此技術的重點在於:無論在何處啓動下載,文件額下載和運行都不會阻塞其他頁面處理過程。即使在head裏(除了用於下載文件的http鏈接)。

19、對比Flash與ajax哪個好?

Ajax的優勢:

(1)、可搜索性 
普通的文本網頁會更有利於SEO。文本內容是搜索引擎容易檢索的,而繁瑣的swf字節碼卻是搜索引擎不願觸及的。雖然Google等一些大型的搜索引擎可以檢索SWF內部的內容,但是仍然有很多麻煩存在。 
(2)、開放性 
Flash常年以來被Macromedia看的很死。包括Flex、FMS等輔佐技術一直都需要昂貴的安裝、維護費用。而JS則沒有這樣的麻煩。沒有人願意承擔法律和版權的風險。 
費用 
Flash開發是很昂貴的,因爲FlashIDE等環境都是要收費的.而Ajax則不同.雖然有一些便宜的生成swf的工具,但是他們的工能實在無法滿足複雜需求。 
(3)、易用性 
Ajax程序有更好的易用性。由於中間有一層Flashplayer代理層,因此許多輔助功能無法被Flash靈活利用。而且Flash在一些方面有着不好的口碑。比如彈出廣告、比如惡意代碼。 
(awflasher.com個人認爲這八成是亂上xx網站造成的) 
(4)、易於開發 
人們開發複雜的Ajax和Flash應用程序時,都會藉助一些高級的開發工具。普遍來說,Ajax的開發包比Flash簡便、容易。

Flash的優勢:

(1)、多媒體處理 
Flash在音頻、視頻等多媒體領域相比HTML有絕對的優勢。現在幾乎所有的網站都包含有Flash內容。 
(2)、兼容性 
兼容性好:由於通過了唯一的FlashPlayer“代理”。人們不必像調試JS那樣,在不同的瀏覽器中調試程序。 
(3)、矢量圖型 
這是Flash最大的優勢,同樣處在這一領域的SVG、Canvas element以及Direct完全不能與Flash相比。 
(4)、客戶端資源調度 
Flash能夠更容易的調用瀏覽器以外的外部資源。比如攝像頭、麥克風等。然而這是普通的HTML無法完成的。但是這也許是一個缺點(爲什麼呢?)

Ajax的劣勢:

(1)、它可能破壞瀏覽器的後退功能 
(2)、使用動態頁面更新使得用戶難於將某個特定的狀態保存到收藏夾中 ,不過這些都有相關方法解決。

Flash的劣勢:

(1)、二進制格式 
(2)、格式私有 
(3)、flash 文件經常會很大,用戶第一次使用的時候需要忍耐較長的等待時間 
(4)/性能問題 
ajax與flash各有利弊,到底哪個好,這取決於你的需求

20、請你解釋一下事件冒泡機制

a、在一個對象上觸發某類事件(比如單擊onclick事件),如果此對象定義了此事件的處理程序,那麼此事件就會調用這個處理程序,如果沒有定義此事件處理程序或者事件返回true,那麼這個事件會向這個對象的父級對象傳播,從裏到外,直至它被處理(父級對象所有同類事件都將被激活),或者它到達了對象層次的最頂層,即document對象(有些瀏覽器是window)。 
b、冒泡型事件:事件按照從最特定的事件目標到最不特定的事件目標(document對象)的順序觸發 
c、js冒泡機制是指如果某元素定義了事件A,如click事件,如果觸發了事件之後,沒有阻止冒泡事件,那麼事件將向父級元素傳播,觸發父類的click函數。

//阻止冒泡時間方法,兼容ie(e.cancleBubble)和ff(e.stopProgation)

function stopBubble(e){

var evt = e||window.event;

evt.stopPropagation?evt.stopPropagation():(evt.cancelBubble=true);//阻止冒泡

evt.preventDefault

21、請你說說split()與join() 函數的區別?

前者是切割成數組的形式,後者是將數組轉換成字符串Join 函數獲取一批字符串,然後用分隔符字符串將它們聯接起來,從而返回一個字符串。Split 函數獲取一個字符串,然後在分隔符處將其斷開,從而返回一批字符串。但是,這兩個函數之間的主要區別在於 Join 可以使用任何分隔符字符串將多個字符串連接起來,而 Split 只能使用一個字符分隔符將字符串斷開。 
簡單地說,如果你用split,是把一串字符(根據某個分隔符)分成若干個元素存放在一個數組裏。而Join是把數組中的字符串連成一個長串,可以大體上認爲是split的逆操作。

22、說說你對Promise的理解?

ES6 原生提供了 Promise 對象。 
所謂 Promise,就是一個對象,用來傳遞異步操作的消息。它代表了某個未來纔會知道結果的事件(通常是一個異步操作),並且這個事件提供統一的 API,可供進一步處理。 
Promise 對象有以下兩個特點。 
(1)、對象的狀態不受外界影響。Promise 對象代表一個異步操作,有三種狀態:Pending(進行中)、Resolved(已完成,又稱 Fulfilled)和 Rejected(已失敗)。只有異步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態。這也是 Promise 這個名字的由來,它的英語意思就是「承諾」,表示其他手段無法改變。 
(2)、一旦狀態改變,就不會再變,任何時候都可以得到這個結果。Promise 對象的狀態改變,只有兩種可能:從 Pending 變爲 Resolved 和從 Pending 變爲 Rejected。只要這兩種情況發生,狀態就凝固了,不會再變了,會一直保持這個結果。就算改變已經發生了,你再對 Promise 對象添加回調函數,也會立即得到這個結果。這與事件(Event)完全不同,事件的特點是,如果你錯過了它,再去監聽,是得不到結果的。

有了 Promise 對象,就可以將異步操作以同步操作的流程表達出來,避免了層層嵌套的回調函數。此外,Promise 對象提供統一的接口,使得控制異步操作更加容易。

Promise 也有一些缺點。首先,無法取消 Promise,一旦新建它就會立即執行,無法中途取消。其次,如果不設置回調函數,Promise 內部拋出的錯誤,不會反應到外部。第三,當處於 Pending 狀態時,無法得知目前進展到哪一個階段(剛剛開始還是即將完成)。

23、談談你對Javascript垃圾回收機制的理解?

(1)、標記清除(mark and sweep)

這是JavaScript最常見的垃圾回收方式,當變量進入執行環境的時候,比如函數中聲明一個變量,垃圾回收器將其標記爲“進入環境”,當變量離開環境的時候(函數執行結束)將其標記爲“離開環境”。 
垃圾回收器會在運行的時候給存儲在內存中的所有變量加上標記,然後去掉環境中的變量以及被環境中變量所引用的變量(閉包),在這些完成之後仍存在標記的就是要刪除的變量了

(2)、引用計數(reference counting)

在低版本IE中經常會出現內存泄露,很多時候就是因爲其採用引用計數方式進行垃圾回收。引用計數的策略是跟蹤記錄每個值被使用的次數,當聲明瞭一個 變量並將一個引用類型賦值給該變量的時候這個值的引用次數就加1,如果該變量的值變成了另外一個,則這個值得引用次數減1,當這個值的引用次數變爲0的時 候,說明沒有變量在使用,這個值沒法被訪問了,因此可以將其佔用的空間回收,這樣垃圾回收器會在運行的時候清理掉引用次數爲0的值佔用的空間。 
在IE中雖然JavaScript對象通過標記清除的方式進行垃圾回收,但BOM與DOM對象卻是通過引用計數回收垃圾的,也就是說只要涉及BOM及DOM就會出現循環引用問題。

24、說說你對原型(prototype)理解?

JavaScript是一種通過原型實現繼承的語言與別的高級語言是有區別的,像java,C#是通過類型決定繼承關係的,JavaScript是的動態的弱類型語言,總之可以認爲JavaScript中所有都是對象,在JavaScript中,原型也是一個對象,通過原型可以實現對象的屬性繼承,JavaScript的對象中都包含了一個” prototype”內部屬性,這個屬性所對應的就是該對象的原型。

“prototype”作爲對象的內部屬性,是不能被直接訪問的。所以爲了方便查看一個對象的原型,Firefox和Chrome內核的JavaScript引擎中提供了”proto“這個非標準的訪問器(ECMA新標準中引入了標準對象原型訪問器”Object.getPrototype(object)”)。

原型的主要作用就是爲了實現繼承與擴展對象。

25、typeof與instanceof的區別是什麼?

在 JavaScript 中,判斷一個變量的類型可以用typeof

(1)、數字類型, typeof 返回的值是 number。比如說:typeof(1),返回值是number 
(2)、字符串類型, typeof 返回的值是 string。比如typeof(“123”)返回值是string。 
(3)、布爾類型, typeof 返回的值是 boolean 。比如typeof(true)返回值是boolean。 
(4)、對象、數組、null 返回的值是 object 。比如typeof(window),typeof(document),typeof(null)返回的值都是object。 
(5)、函數類型,返回的值是 function。比如:typeof(eval),typeof(Date)返回的值都是function。 
(6)、不存在的變量、函數或者undefined,將返回undefined。比如:typeof(abc)、typeof(undefined)都返回undefined。

在 JavaScript 中,instanceof用於判斷某個對象是否被另一個函數構造。

使用 typeof 運算符時採用引用類型存儲值會出現一個問題,無論引用的是什麼類型的對象,它都返回 “object”。ECMAScript 引入了另一個 Java 運算符 instanceof 來解決這個問題。instanceof 運算符與 typeof 運算符相似,用於識別正在處理的對象的類型。與 typeof 方法不同的是,instanceof 方法要求開發者明確地確認對象爲某特定類型。

26、說說你對node.js的理解

a、Node.js 是一個基於Google Chrome V8 引擎的 JavaScript 運行環境。Node.js 使用了一個事件驅動、非阻塞式 I/O 的模型,使其輕量又高效。Node.js 的包管理器 npm,是全球最大的開源庫生態系統。 
b、能方便地搭建響應速度快、易於擴展的網絡應用,Node.js 使用事件驅動, 非阻塞I/O 模型而得以輕量和高效,非常適合在分佈式設備上運行的數據密集型的實時應用。 
c、簡單說Node.js就是運行在服務器端的JavaScript,是現在流行的語言中能同時運行在前端與後臺的程序語言

27、NPM(包管理器)作用是什麼?

NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問題,常見的使用場景有以下幾種: 
a、允許用戶從NPM服務器下載別人編寫的第三方包到本地使用。 
b、允許用戶從NPM服務器下載並安裝別人編寫的命令行程序到本地使用。 
c、允許用戶將自己編寫的包或命令行程序上傳到NPM服務器供別人使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章