記了一些重要的問題,過了有一個多星期,記不太清了見諒
一面
時間:一個小時,自我介紹的什麼的直接省略直接上乾貨
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. 程式設計題
給定一個陣列,有正有負(答 的最菜的一個題,讓面試官給我提示蒙了,後來的沒做,就結束了)
- 求加起來的最大和
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])
複製程式碼
-
記錄最大的子陣列
-
返回所有的最大子陣列
三面
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,其他公司,有的簡歷石沉大海,有的收到筆試邀請,過了筆試也不準備面試了,畢竟面試是一個勞心的工作。
寫在最後
說了這麼多,只是個人的經歷,能給大家做個參考更好,畢竟我這麼菜的人都能得到大廠的青睞,大家只管努力,剩下的交給天意(好像是句雞湯,但也是實話嘿嘿)。其實如果我春招沒有上岸,也會繼續努力,去一家小公司積累兩年經驗,繼續投遞大廠,圓自己一個大廠夢。
程式設計師註定是一個終生學習的職業,與君共勉!!!