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

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

Oct 12, 2016 pm 02:17 PM

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

 

我估計很多有人其它方法來證明他自己,像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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1327
25
PHP教程
1273
29
C# 教程
1253
24