今天下午面試了字節(jié)跳動,嗯.....,面完三分鐘出結果,被刷了,準備不夠充分啊
然后作一下總結先:
自我介紹
這一邊自己好像講了不到30秒,太簡短了,得加強一下.
基礎問題
- TCP的三次握手(太緊張講暈了)
- https的原理和通信過程.(好像把C/S講反了)
- JS的基本類型(不包括引用類型,null,undefined,Number,String,Symbol)
- 引用類型有哪幾種(function,Object,Array)
- 基本類型和引用類型的存儲方式有什么不同(可以看看這個)
接下來直接做題
1.實現(xiàn)一個自適應的搜索框,搜索按鈕固定寬度,搜索框內容自適應填充父容器的剩余空間.
2.考察eventloop
console.log("begin");
setTimeout(function(){
console.log("setTimeout");
promise.resolve().then(()=>{
console.log("promise1");
});
setTimeout(function(){
promise.resolve().then(()=>{
console.log("promise between promise1 & promise2");
})
});
promise.resolve().then(()=>{
console.log("promise2");
});
},0);
console.log("end");
正確輸出為(運行結果):
begin
end
setTimeout
promise1
promise2
promise between promise1 & promise2
這邊按照主->微->宏的順序去想就可以,不斷地按照這個次序進行循環(huán).
這邊問了個小問題: 宏任務和微任務有什么關系和不同.(沒答上來)
3.考察閉包
給你一個函數(shù)頭如下:
const repeat = function (func, times, wait) {};
要求能夠實現(xiàn)如下的情況:
repeat函數(shù)返回一個函數(shù),使之可以這樣子執(zhí)行
let repeatFunc = repeat(alert,4,3000);
repeatFunc("hello world"); //alert "hello world" 四次,每次之間間隔3秒,并且repeatFunc可以再次使用.
我的實現(xiàn)如下:
const repeat = function (func, times, wait) {
let i=0;
return function (message) {
while(i<times){
setTimeout(function () {
func(message); //這邊一開始寫成了alert(message),捂臉,被面試官糾正了.
},wait);
i++;
if(i===times){ //這邊是發(fā)現(xiàn)無法重用,然后修改的,也是面試官提醒.
i=0;break;
}
}
}
};
好的,眼尖的應該已經(jīng)發(fā)現(xiàn)了,我這道題完全寫錯了,3秒后四次會同時執(zhí)行.并不是間隔3秒來一次.
//改動
const repeat = function (func, times, wait) {
let i=0;
return function (message) {
let i=0;
while(i<times){
setTimeout(function () {
func(message);
},(i+1)*wait);
i++;
}
}
};
let repeatFunc = repeat(alert,4,3000);
repeatFunc("helloWorld"); //輸出四次hello world,間隔3秒一次
之后要求修改為:
傳入的函數(shù)func有多個不同的參數(shù),要求在多參數(shù)條件下也能進行實現(xiàn).
例如這個func為:
function logSum(a,b,c){
console.log(a+b+c);
}
然后我就想到了arguments,但是我發(fā)現(xiàn)我搞不清楚作用域,捂臉.
然后就寫下了這樣的代碼
const repeat = function (func, times, wait) {
let i=0;
return function (message) {
let arg = this.arguments; //this亂指問題.....算是低級錯誤了吧
while(i<times){
setTimeout(function () {
func(...arg);
},wait);
i++;
if(i===times){
i=0;break;
}
}
}
};
好的,因為那個this和setTimeout,這題完全涼了.
修改如下:
const repeat = function (func, times, wait) {
let i=0;
return function (message) {
let arg = arguments; //去掉this
while(i<times){
setTimeout(function () {
func(...arg);
},wait);
i++;
if(i===times){
i=0;break;
}
}
}
};
let repeatFunc = repeat(function(a,b,c){
console.log(a+b+c);
},4,3000);
repeatFunc(1,2,3); //四次6,但是并非間隔3秒一次
4.類數(shù)組對象和數(shù)組
- 先問了兩者差異
- 然后是類數(shù)組轉成數(shù)組的方法
[...arguments]
Array.from(arguments);
Array.prototype.slice.call(arguments);//建議乖乖寫Array,不要寫[]
5.JS實現(xiàn)單鏈表
這個就不講了...自己寫就行了,記得維護一個尾部的對象引用就行,方便插入
項目
因為寫了vue項目,所以問了vue的虛擬DOM樹的原理,也就是vue怎么進行dom動態(tài)更新的.
這個東西可以看這個.
最后就是面試官問有什么想問的嘛?
我問他第一題有么有更好的實現(xiàn),然后他說flex,好吧,我想到了沒有寫,因為覺得實現(xiàn)不了....感覺問這個問題好傻逼,捂臉
大致先總結如下