【經驗之談】前端面試知識點總結03(JavaScript相關)——附答案



    • 一、談談你對Ajax的理解?(概念、特色、做用)

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

      優勢
      a、不須要插件支持
      b、優秀的用戶體驗
      c、提升Web程序的性能
      d、減輕服務器和帶寬的負擔
      缺點
      a、瀏覽器對XMLHttpRequest對象的支持度不足,幾乎全部瀏覽器如今都支持
      b、破壞瀏覽器「前進」、「後退」按鈕的正常功能,能夠經過簡單的插件彌補
      c、對搜索引擎的支持不足前端

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

      deferred對象是從jQuery 1.5.0版本開始引入的一個新功能。
      a、什麼是deferred對象
      開發網站的過程當中,咱們常常遇到某些耗時很長的javascript操做。其中,既有異步的操做(好比ajax讀取服務器數據),也有同步的操做(好比遍歷一個大型數組),它們都不是當即能獲得結果的。
      一般的作法是,爲它們指定回調函數(callback)。即事先規定,一旦它們運行結束,應該調用哪些函數。
      可是,在回調函數方面,jQuery的功能很是弱。爲了改變這一點,jQuery開發團隊就設計了deferred對象。
      簡單說,deferred對象就是jQuery的回調函數解決方案。在英語中,defer的意思是"延遲",因此deferred對象的含義就是"延遲"到將來某個點再執行。
      它解決了如何處理耗時操做的問題,對那些操做提供了更好的控制,以及統一的編程接口。
      b、它的主要功能,能夠歸結爲四點:
      (1)、實現鏈式操做
      (2)、指定同一操做的多個回調函數
      (3)、爲多個操做指定回調函數
      (4)、普通操做的回調函數接口java

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

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

      實現:
      (1)、JSONP跨域:利用script腳本容許引用不一樣域下的js實現的,將回調方法帶入服務器,返回結果時回調。
      (2)、跨域資源共享(CORS)
      跨域資源共享(CORS)是一種網絡瀏覽器的技術規範,它爲Web服務器定義了一種方式,容許網頁從不一樣的域訪問其資源。
      CORS與JSONP相比:
      a、 JSONP只能實現GET請求,而CORS支持全部類型的HTTP請求。
      b、 使用CORS,開發者可使用普通的XMLHttpRequest發起請求和得到數據,比起JSONP有更好的錯誤處理。
      c、 JSONP主要被老的瀏覽器支持,它們每每不支持CORS,而絕大多數現代瀏覽器都已經支持了CORS。git

      四、爲何要使用模板引擎?

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

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

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

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

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

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

      document.getElementById("ID").value

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

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

      九、DOM操做怎樣添加、移除、移動、複製、建立和查找節點?

      (1)建立新節點

      createDocumentFragment() //建立一個DOM片斷
      createElement() //建立一個具體的元素 createTextNode() //建立一個文本節點

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

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

      (3)查找

      getElementsByTagName() //經過標籤名稱
      getElementsByName() //經過元素的Name屬性的值(IE容錯能力較強,會獲得一個數組,其中包括id等於name值的) getElementById() //經過元素Id,惟一性

      十、說說你對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種結構就能夠組合成複雜的數據結構了。

      十一、ionic和angularjs的區別?

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

      十二、談談你對閉包的理解?

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

      1三、談談你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對象。

      1四、JavaScript對象的幾種建立方式?

      (1) var obj = new Object();
      (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();
      複製代碼

      1五、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 爲好。

      1六、null和undefined的區別?

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

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

      回答一:
      (1)、IE7/8 DOM對象或者ActiveX對象循環引用致使內存泄漏
      a、多個對象循環引用
      b、循環引用本身
      (2)、基礎的DOM泄漏
      當原有的DOM被移除時,子結點引用沒有被移除則沒法回收。
      (3)、timer定時器泄漏
      這個時候你沒法回收buggyObject,解決辦法,先中止timer而後再回收
      回答二:
      內存泄漏指任何對象在您再也不擁有或須要它以後仍然存在。
      垃圾回收器按期掃描對象,並計算引用了每一個對象的其餘對象的數量。若是一個對象的引用數量爲 0(沒有其餘對象引用過該對象),或對該對象的唯一引用是循環的,那麼該對象的內存便可回收。
      setTimeout 的第一個參數使用字符串而非函數的話,會引起內存泄漏。
      閉包、控制檯日誌、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)也會引起內存泄漏問題。

      1八、哪些地方會出現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無阻塞加載具體方式
      將腳本放在底部。<link>仍是放在head中,用以保證在js加載前,能加載出正常顯示的頁面。<script>標籤放在</body>前。
      成組腳本:因爲每一個<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連接)。

      1九、對比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
      複製代碼

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

      前者是切割成數組的形式,後者是將數組轉換成字符串

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

      2二、說說你對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 狀態時,沒法得知目前進展到哪個階段(剛剛開始仍是即將完成)。

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

      (1)、標記清除(mark and sweep)
      這是`JavaScript`最多見的垃圾回收方式,當變量進入執行環境的時候,好比函數中聲明一個變量,垃圾回收器將其標記爲「進入環境」,當變量離開環境的時候(函數執行結束)將其標記爲「離開環境」。
      垃圾回收器會在運行的時候給存儲在內存中的全部變量加上標記,而後去掉環境中的變量以及被環境中變量所引用的變量(閉包),在這些完成以後仍存在標記的就是要刪除的變量了
      (2)、引用計數(reference counting)
      在低版本`IE`中常常會出現內存泄露,不少時候就是由於其採用引用計數方式進行垃圾回收。引用計數的策略是跟蹤記錄每一個值被使用的次數,當聲明瞭一個 變量並將一個引用類型賦值給該變量的時候這個值的引用次數就加1,若是該變量的值變成了另一個,則這個值得引用次數減1,當這個值的引用次數變爲0的時 候,說明沒有變量在使用,這個值無法被訪問了,所以能夠將其佔用的空間回收,這樣垃圾回收器會在運行的時候清理掉引用次數爲0的值佔用的空間。
      在IE中雖然`JavaScript`對象經過標記清除的方式進行垃圾回收,但BOM與DOM對象倒是經過引用計數回收垃圾的,也就是說只要涉及BOM及DOM就會出現循環引用問題。

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

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

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

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

      2五、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 方法要求開發者明確地確認對象爲某特定類型。

      2六、說說你對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,是如今流行的語言中能同時運行在前端與後臺的程序語言

      2七、NPM(包管理器)做用是什麼?

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

      博客數據來源聲明:本博客大部分數據來源於各大網站的收集整理改編,主要有GitHub(https://github.com)、題來了(http://www.tilaile.com)、牛客網(https://www.nowcoder.com)、一些英文網站,還有一些論壇、博客、IT招聘等網站。還有少部分數據時來源於本人本身整理添加,添加的內容主要是本人認爲比較重要知識點,面試時可能會問到的題目,本身整理題目以及參考答案,答案僅供參考,答案可能存有錯誤或不足,歡迎你們批評指正或補充更好的答案。好讓我及時更正,以避免誤導其餘人。本博客僅提供參考做用。

相關文章
相關標籤/搜索