1. 程式人生 > >美團一面 電話面試(web前端開發工程師)

美團一面 電話面試(web前端開發工程師)

人生中的第一次面試,就是來自美團的,懷著萬分緊張的心情,今天上午十點鐘,接了美團一面面試官的電話,面試官人挺好的,挺有耐心,恩,我自己也不是很緊張,問啥說啥,不會的問題就直接說不知道,我問的問題他也都給我講了。
首先,面試官上來就問了我簡歷上寫的關於計算機設計大賽的專案,做的是什麼,我就簡單的跟他講了講。
然後他給我發了一個圖片,讓我根據他發的要求寫出程式碼,
程式設計題
要求如下:

  1. 使用 ajax 提交表單,直接使用假想的 doSomething() 方法(包含傳送 ajax 和獲取表單輸入的邏輯)
  2. 點選複選框文字就能選中/反選複選框
  3. 在文字框回車會能提交表單
  4. 不用考慮表單校驗

然後他讓我進入一個網站,是可以兩人同時線上檢視程式碼的程式設計房間,我在那個網站寫程式碼他也能看得到,我問他可不可以用我自己電腦的IDE寫程式,他同意了,我就在我電腦上的PHPStorm裡面寫好後貼上到那個網站上給他看。他覺得哪裡不滿足要求,我就繼續改,大概改了三四次左右,就都差不多了,以下是我的最終程式碼:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content
="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> .user_info{ float: right; } </style> </head
>
<body> <script> function doSomething() { //TODO } </script> <form action="" method="post"> <table> <tr> <td class="user_info"> 名字:</td> <td colspan="4"> <input type="text" required> </td> </tr> <tr> <td class="user_info">您的愛好:</td> <td> <input type="checkbox" id="Vue" value="Vue" name="Vue"> <label for="Vue">Vue</label> </td> <td> <input type="checkbox" id="PHP" value="PHP" name="PHP"> <label for="PHP">PHP</label> </td> <td> <input type="checkbox" id="Docker" value="Docker" name="Docker"> <label for="Docker">Docker</label> </td> <td> <input type="checkbox" id="Jenkins" value="Jenkins" name="Jenkins"> <label for="Jenkins">Jenkins</label> </td> </tr> <tr> <td colspan="5"> <button type="submit" onclick="doSomething()">提交</button> </td> </tr> </table> </form> </body> </html>

寫完這些後,時間大概過去了30多分鐘,這時他就接著問我別的問題了。先問我html中id和class的區別,我就說id是唯一的,他問還有什麼別的區別,我就不知道了,然後又問我css中id和class的區別,我就說了和html不是一樣的麼。。。他又問那你還知道兩者之間別的區別嗎,我說不知道。現在想想css中id和class中的區別應該指表現形式不同,id是以#開頭,class是以.開頭。

之後下一個問題,是問我跨域的問題,我就直接說我不知道了,因為我確實不知道啥是跨域。結束後去搜了一下:

接下來面試官就問了我一些JavaScript方面的問題了,
第一個問題是:
a.b()
(a.b)()
這兩者有什麼區別。我說第一個中b是物件a的一個函式屬性。第二個沒說出來。面試官說兩者是一樣的。

第二個問題是:JavaScript中哪些是傳值哪些是傳址。我說我不知道。事後百度了一下:

JS 傳值 傳址
在JS中,有兩種不同的方式可以操作資料的值,這兩種技術分別叫做 傳值 和 傳址。
傳值:在賦值過程中,首先對值進行了一份拷貝,而後將這份拷貝儲存到一個變數、物件屬性或陣列元素中。拷貝的值和原始的值是完全獨立、互不影響的。當一份資料通過值傳遞給一個函式,實際上被傳遞的不是資料本身,而是資料的一份拷貝。因此,如果函式修改了這個值,影響到的只是資料的那份拷貝,而並不影響資料本身。
傳址:在賦值過程中,變數實際上儲存的是資料的地址(對資料的引用),而不是原始資料或者是資料的拷貝。如果值通過一個地址發生了改變,這個改變也會通過原始地址表現出來。
根據操作資料方式的不同,我們可以把資料型別分為兩類:基礎型別 和 引用型別。
基礎型別主要有:數字(Number)、布林型別(Boolean)、字串(String);其操作方式為 傳值。
引用型別主要有:物件(Object) —— 陣列(Array)、函式(Function);其操作方式為 傳址。

其實現在想想這個問題答不上來挺虧的,因為js的傳址和傳值和java中基本上是一樣的,基本型別是傳值,引用型別是傳址,如果換成提問Java我一定能答得上來,但換成js居然就想不起來了,歸根到底還是因為自己對js的不熟悉、不瞭解。

第三個問題:
使用 JavaScript,使一個列表發生如下轉變:

var original = [
  {id: 0, name: 'root', parent: null},
  {id: 1, name: 'foo', parent: 4},
  {id: 2, name: 'bar', parent: 0},
  {id: 3, name: 'tom', parent: 2},
  {id: 4, name: 'jerry', parent: 0},
  {id: 5, name: 'dust', parent: null}
// , ...
]
var transformed = [
  {id: 0, name: 'root', parent: null, children: [
    {id: 2, name: 'bar', parent: 0, children: [
      {id: 3, name: 'tom', parent: 2, children: []}
    ]},
    {id: 4, name: 'jerry', parent: 0, children: [
      {id: 1, name: 'foo', parent: 4, children: []}
    ]}
  ]},
  {id: 5, name: 'dust', parent: null, children: []}
]

對於這個問題,看一眼就覺得好麻煩啊,我就胡亂說了一堆,說再用一個輔助陣列,迴圈遍歷原陣列,查找出每一個元素id對應的parent,存起來,,,。好吧,我自己說的都感覺不對,面試官貌似也沒說什麼,就又發來了下一個問題,讓我解釋一下下面程式碼的作用:

const arr = [10, 12, 15, 21];
for (let i = 0; i < arr.length; i++) {
    setTimeout(function() {
        window.alert('The index of this number is: ' + i);
    }, 3000);
}

我一看到這個程式碼就感覺挺簡單的,我就說了這個程式碼是每隔3秒中網頁彈出一個字串加一個數字,共彈了四次。面試官又問我依次是什麼數字,我說是0,1,2,3。我感覺這個題我應該是答對了。

之後就問了一些Linux的問題,問我了不瞭解Linux命令,平時有沒有用過,我說我的電腦就是Ubuntu的,所以平時經常用。然後他又問我是什麼時候開始用Ubuntu的,我說是今年上半年,大概用了好幾個月了。然後又問我平時經常用到哪些命令,我說有更新、安裝軟體,還有查詢修改刪除,還有修改檔案的許可權chmod等。他問我知不知道檔案許可權是什麼,我說是指檔案的讀和寫;0644是什麼意思,我說不知道,我平時只用777,他又問我知不知道777的第三位指什麼,777有什麼危害,我說我只知道檔案許可權為777時,可讀可改,很方便,但所有使用者都可以修改它並不安全,其他的危害我就不知道了。

之後又問了我http的傳輸方式,我說有get和post。他又問了兩者的區別,我說get是明文傳輸,資訊都在瀏覽器的位址列,不安全,而post為安全傳輸,當需要傳輸密碼或者是長的字串時需要用post,因為瀏覽器的地址有長度限制,所以長的字串也不能用get傳輸。

然後又問我知不知道HTTP狀態碼,這個問題我喜歡,剛好是我上個星期總結過存在手機便籤裡的,我趕緊開啟便籤說:

200伺服器正確返回響應
404請求的資源不存在
403沒有訪問許可權
500伺服器內部錯誤

他又問我知不知道303,我說我不知道,這些我都是遇到一些就總結一下記下來,沒遇到過的也就不知道。

這個時候差不多快十一點了,問題問得基本上也都差不多了,他問我有沒有什麼想問的,我就問了啥時候有一面的結果,他說7日之內。然後我又說我這是第一次面試,也不知道該準備什麼,他說知道什麼就說什麼就好了,也不需要特地準備。
尬聊了一小時,我說了句拜拜,恩,,終於結束了,,,我也不知道我這次的表現算怎麼樣,不過畢竟是第一次面試,我也不是很緊張。恩,不過,還是希望有個好結果~

(我覺得我該刷刷前端的面試題了,要不然問啥啥不會)