位元組跳動前端研發面經-2020春招技術面

不夠自律的孫同學發表於2020-03-05

記了一些重要的問題,過了有一個多星期,記不太清了見諒

一面

時間:一個小時,自我介紹的什麼的直接省略直接上乾貨

1. ts泛型幹嘛的?

主要解決在編寫函式時某個資料有多個型別的可能,要根據實際的呼叫情況才可確定;同時如果函式體如果多出用到同一個型別,也可以達到減少重複程式碼的效果。

2. nodejs從接收到請求到返回給頁面經歷了什麼?

根據本人的專案說的,層接收資料,打到server層進而處理前端資料,dao層進行資料庫查詢,再一層層返回。

3. js中的事件迴圈是怎樣的?

ps:請見本人另一篇關於event loop的文章

擴充問題:callback、promise、瀏覽器nextTick執行順序?(題目好像是這樣,因為瀏覽器nextTick()不知道所以這個題略過了)

4. 前端安全:你知道哪些常見的web攻擊方式?如何避免?

答:xss、csrf、點選劫持、SQL隱碼攻擊(我只答了這些,其他的忘了)

5. 給定一個二叉樹,返回路徑等於k的路徑節點陣列(沒寫完,面試官跳過了,可能是因為對我印象比較好吧)

下面是一個不完整的程式碼,直接把當時寫的粘過來的

function getPath(root, k) {
    const   result = [];
    function __search(root, sum) {
        if(root) {
            console.log(result)
            if(root.val === sum) {
                result.push(new Node(root.val));
                return true;
            }else {
                result.push(new Node(root.val));
                __search(root.left, sum - root.val);
                __search(root.right, sum - root.val)
            }
        }else {
            return false;
        }
    }
    __search(root, k);
    return __search(root, k) ? result : false;
}
複製程式碼

6. 給定一個層級很深的陣列

function flatten(arr) {
    const res = [];
    for(let i = 0; i < arr.length; i ++) {
        if ( typeof arr[i] === "array") {
          res.push(...flatten(arr[i]));
        }
        else res.push(arr[i])
    }
    return res;
}
const arr = flatten([1,2,[1,2,[2,3,4],3,5],3,4,5,6]);
console.log(arr);
複製程式碼

二面

時間:一個小時,同樣直接上乾貨

0. 函式柯里化

固定某個函式的一些引數,得到該函式剩餘引數的一個新函式,如果沒有剩餘引數,則呼叫

核心在於固定函式的引數

Function.prototype.curry = function (func) {
    var args = Array.prototype.slice.call(arguments, 1);
    var self = this;
    return function () {
        var curArgs = Array.from(arguments);
        var totalArgs = args.concat(curArgs);
        if(totalArgs.length >= func.length){ 
            // 引數夠了
            return func.apply(null, totalArgs)
        }else {
            // 引數數量仍然不夠
            totalArgs.unshift(func);
            return curry.apply(that, totalaArgs);
        }
    }
}
複製程式碼

1. 手寫雙向資料繫結(vue3.0之前)

<input type="text" id='inp'>
<div id='view'></div>
<script>
    const input = document.getElementById('inp');
    const view = document.getElementById('view');

    let data = {
        // name: 'view'
        valueObj:{
            name:'view'
        }
    }

    function update() { //更新檢視
        view.innerText = data.valueObj.name;
    }

    input.oninput = function () { //更新資料 
        data.valueObj.name = this.value
    }

    function observerData(obj) {
        if (!obj || typeof obj != 'object') return obj; //容錯 + 遞迴出口
        
        Object.keys(obj).forEach(key => {
            definedRective(obj, key, obj[key]);
        })
        
        observerData(data);

        function definedRective(obj, key, val) {
            observerData(val); //深層資料遞迴處理
            Object.defineProperty(obj, key, {
                get () {
                    return val;
                },
                set (newVal) {
                    if (val === newVal) return; //優化效能
                    val = newVal;
                    update();
                }
            })
        }
    }
</script>
複製程式碼

2. 需求題

頁面延遲至少1s再結束loading

面試官給出的程式碼,如下

async handleClick() { 
  // loading至少持續1秒
  this.loading = true;
  await ajax.post(url, data);
  this.loading = false;
}
複製程式碼

作答,如下:

async handleClick() {
    this.loading = true;
    const delay = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve();           
        }, 1000);
    })
    const ajax = await ajax.post(url, data);
    Promise.all([delay, ajax]).then((res) =>{
       this.loading = false;
    }, err => {
        throw err;
    })
}
複製程式碼

3. 程式設計題

給定一個陣列,有正有負(答 的最菜的一個題,讓面試官給我提示蒙了,後來的沒做,就結束了)

  1. 求加起來的最大和
function max (arr) {
    let res = 0;
    let max = 0;
    let resArr = [];
    for(let i = 0 ; i < arr.length; i ++){
        res += arr[i];
        if(res < 0) {
            res = 0;
            left = i + 1;
        }
        else if(res > max) {
            max = res;
            right = i;
        }
    }
    console.log(max);
}

max([-2, 2,3,4,-10, -10, 5, -2])
複製程式碼
  1. 記錄最大的子陣列

  2. 返回所有的最大子陣列

三面

0. 面試官自我介紹,我自我介紹

1. TCP如何建立連線,如何斷開連線?

核心點:建立連線之所以是三次,是因為確保通訊雙方都具有收發的能力; 斷開連線之所以是四次,是因為保證傳送方已經傳送完成,而接受雙方已經接受完成。

估計答出這點面試官也不會問你為什麼是三次?為什麼是四次了吧?

2. 實習公司相關

3. 實習專案相關

4. 將ajax封裝成Promise

function ajax (url) {
    return new Promise(() => {
        var xhr = null;
        if (window.XMLHttpRequest) {
            xhr = new XMLHttpRequest();
        } else {
            xhr = new ActiveXObject("Microsoft.XMLHttp");
        }
        xhr.open("get",url)
        xhr.send()
        xhr.onreadystatechange = function (){
            if(xhr.readystate == 4 && xhr.status == 200){
                resolve(xhr.responseText);
            }else if(xhr.readystate == 4 && xhr.status !== 200){
                reject(new Error("出錯啦!"));
            }
            
        }
    }){}
}
複製程式碼

擴充問題:原生ajax中,readystate有幾個數值各個數值的意義表示什麼?

0表示未初始化,未呼叫send()方法;1表示讀取中,已呼叫send(),正在傳送請求;2表示已讀取,send()方法執行完成,接收到全部響應內容;3表示互動中,正在解析內容;4表示完成,響應內容解析完成;

5. 賽馬問題

之前沒聽說過這個題,本以為很難,想了有10分鐘吧(以為是剪支問題)才答出來,其實很簡單...

題目:一共64匹馬,一個場地,該場地可以同時容納8匹馬比賽(比賽結果:只知道名次,不知道具體時間),問需要最少比多少場可以找出最快的4匹馬?

答:12場

解析

  • 第一次(8場):將64匹馬分8組比8場
  • 第二次(1場):將8組中的第一名拿出來比1場
  • 第三次(2場):將第二次比賽的馬,排名前4的馬所在的組篩選出來,取每組前4,4 * 4一共16匹馬,比2場
  • 第四次(1):將第三次比賽的兩場的每場前四名取出來,2 * 4 一共8匹,比1場,取前四,即為結果

6. 有什麼想問我的?

最後

位元組跳動只有3次技術面,過了兩天直接收到hr的面試通過通知,也簡單的瞭解了一下本人情況(這時本人收到了快手的hr面試通過的訊息,也談了薪資,沒簽三方,不過有一說一快手真有錢),說是確定發offer,先走公司流程。

我的求職之路

至此我的春招也準備結束了,也不準備再面其他公司了,回想起去年這個時候自己還是一個什麼都不懂的大三學生,可能連js都不會(大學前兩年半都沒有學習,專業課都是飄過),機緣巧合選擇前端放棄考研。

  • 2019.7:位元組跳動秋招,人生中第一次面試,以完敗告終;又面京東數科實習崗,同樣讓人人家以委婉的理由拒絕(我二面電話等了整整兩天,唉),那會兒連個陣列去重都能被難住。
  • 2019.8:由於沒有找到工作,回到了老家準備正式的秋招,除了吃飯的時間都在學習,早晨8點到晚上1、2點,期間寫了50多篇部落格,在CSDN(這不算打廣告吧)。
  • 2019.9:再次投簡歷,找到了我的實習公司,一天150。工作了三個月跟leader提出離職。(ps:當時leader找了我兩三次要我留下,對我真的不錯,無奈我有一顆大廠的心。這是不有點裝了哈哈)

其實我在實習期間也找過成都的一家做中型大資料的公司,走校招,可能也是讓我印象最深的一次面試,讓我無地自容,後來為什麼努力也有他一部分功勞吧哈哈。

  • 2019.12:辭職,列計劃,準備春招。
  • 2020.2:月初投遞,位元組跳動、快手等等20+吧,有的內推,有的官方招聘
  • 2020.3:月初受到兩家公司的offer call,其他公司,有的簡歷石沉大海,有的收到筆試邀請,過了筆試也不準備面試了,畢竟面試是一個勞心的工作。

寫在最後

說了這麼多,只是個人的經歷,能給大家做個參考更好,畢竟我這麼菜的人都能得到大廠的青睞,大家只管努力,剩下的交給天意(好像是句雞湯,但也是實話嘿嘿)。其實如果我春招沒有上岸,也會繼續努力,去一家小公司積累兩年經驗,繼續投遞大廠,圓自己一個大廠夢。

程式設計師註定是一個終生學習的職業,與君共勉!!!

相關文章