我知道有很多人不同意這種類型的面試。其實不管你喜不喜歡,你都得接受。尤其當你是自學的,而且要申請第一份工作時。
我估計很多有人其它方法來證明他自己,像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);
(function() { 'use strict'; var a = window.b = 5; })(); console.log(b);
應列印 hellohellohello。
一個可能的實作如下所示:
console.log('hello'.repeatify(3));
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();
下面的代码会输出什么结果?给出你的答案。
var fullname = 'John Doe'; var obj = { fullname: 'Colin Ihrig', prop: { fullname: 'Aurelio De Rosa', 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))