首頁  >  文章  >  类库下载  >  問得最多的十個JavaScript前端面試問題

問得最多的十個JavaScript前端面試問題

高洛峰
高洛峰原創
2016-10-12 14:17:131826瀏覽

我知道有很多人不同意這種類型的面試。其實不管你喜不喜歡,你都得接受。尤其當你是自學的,而且要申請第一份工作時。

 

我估計很多有人其它方法來證明他自己,像Github/ 專案地址可能是非常理想的證明方法,但也別全都指望這些。

 

好消息是有一些很難的問題,在有限的時間裡我沒答上來(比如說Event Loop和楊輝三角),一些其它面試侯選人也承認他們也沒答上來,這會讓討論變得輕鬆很多。

 

壞消息是有些面試之後就沒有任何回饋了。有三家公司再也沒聯絡過。這點擊打擊自信,而且沒有受到尊重。然後你可能會有心理鬥爭,“面試的不夠好?”,“他們不喜歡我這種類型?”。所以如果你是面試官,請給你的面試官一個明確的答复,即使是自動回復也比什麼都沒有的強。

 

1. 設計一個函數傳回第n行的楊輝三角形。 (整個面試只有這個問題)

 

註* 楊輝三角也叫Pascal's Triangle

 

           1

           1

           1🠜

1    1     2     1

   1     3     3      1

   ...

 . 設計一個函數,傳回一串字串中重複次最多的單字。

 

3. 使用遞歸列印長度為n的費波那契數列。

 

注* 費波那契數列由0和1開始,之後就由之前的兩數相加0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233

 

4. 解釋一下bind, apply和call的用法和區別。

 

5. 解釋一下什麼是event delegation(事件代理)和為什麼它有用。

 

6. 什麼是event loop (事件循環)?

 

7. hoisting(聲明提升)在JavaScript裡是怎麼工作的?

 

8. 描述一下你在設計應用或網站時的流程。

 

9. 你最希望JavaScript或瀏覽器中加入哪些功能,為什麼?

 

10. 函數式程式設計與命令式程式設計的差異?你喜歡哪一個?

 

 

 5個經典的前端面試問題 

  

問題1:Scope作用範圍

考慮在控制台上的代碼: 

回答 

上面的程式碼會印 5。

這個問題的訣竅是,這裡有兩個變數聲明,但 a 使用關鍵字var聲明的。代表它是一個函數的局部變數。與此相反,b 變成了全域變數。

這個問題的另一個訣竅是,它沒有使用嚴格模式 ('use strict';) 。如果啟用了嚴格模式,程式碼就會引發ReferenceError的錯誤:B沒有定義(b is not defined)。請記住,嚴格模式,則需要明確指定,才能實現全域變數聲明。例如,你應該寫:

(function() {
   var a = b = 5;
})();

console.log(b);

問題2:建立「原生」(native)方法

給字串物件定義一個repeatify功能。當傳入一個整數n時,它會傳回重複n次字串的結果。例如: 

(function() {
   'use strict';
   var a = window.b = 5;
})();

console.log(b);

應列印 hellohellohello。 

回答 


一個可能的實作如下所示: 

console.log('hello'.repeatify(3));

現在的問題測試開發者有關JavaScript繼承和prototype的知識點。這也驗證了開發者是否知道該如何擴展內建物件(儘管這不應該做的)。 

這裡的另一個重點是,你要知道如何不覆蓋可能已經定義的功能。測試一下這個功能定義之前並不存在: 



String.prototype.repeatify = String.prototype.repeatify || function(times) {/* code here */};

噹噹你被要求做好JavaScript函數相容時這種技術特別有用。 


問題3:聲明提升(Hoisting)

執行這段程式碼,輸出何種結果。 

String.prototype.repeatify = String.prototype.repeatify || function(times) {
   var str = '';
   for (var i = 0; i < times; i++) {
      str += this;
   }
   return str;
};

回答 


這段程式碼的結果是 undefined 和 2。 

原因是,變數和函數的宣告都被提前了(移到了函數的頂部),但變數不分配任何值。因此,在列印變數的時候,它在函數中存在(它被聲明了),但它仍然是 undefined 。表示換句話說,上面的程式碼等同於以下內容: 

function test() {
   console.log(a);
   console.log(foo());
   var a = 1;
   function foo() {
      return 2;
   }
}

test();

問題4:this在JavaScript中如何運作的


下面的代码会输出什么结果?给出你的答案。 

var fullname = &#39;John Doe&#39;;
var obj = {
   fullname: &#39;Colin Ihrig&#39;,
   prop: {
      fullname: &#39;Aurelio De Rosa&#39;,
      getFullname: function() {
         return this.fullname;
      }
   }
};

console.log(obj.prop.getFullname());
 
var test = obj.prop.getFullname;
 
console.log(test());

回答 

答案是Aurelio De Rosa和John Doe。原因是,在一个函数中,this的行为,取决于JavaScript函数的调用方式和定义方式,而不仅仅是看它如何被定义的。 

在第一个 console.log()调用中,getFullname() 被调用作为obj.prop对象的函数。所以,上下文指的是后者,函数返回该对象的fullname。与此相反,当getFullname()被分配到test变量时,上下文指的是全局对象(window)。这是因为test是被隐式设置为全局对象的属性。出于这个原因,该函数返回window的fullname,即定义在第一行的那个值。 

问题5:call() 和 apply()


现在让你解决前一个问题,使最后的console.log() 打印 Aurelio De Rosa。 

回答 

该问题可以通过强制使用 call() 或者 apply() 改变函数上下文。在下面我将使用call(),但在这种情况下,apply()会输出相同的结果: 

console.log(test.call(obj.prop))


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn