今天下午面试了字节跳动,嗯.....,面完三分钟出结果,被刷了,准备不够充分啊
然后作一下总结先:
自我介绍
这一边自己好像讲了不到30秒,太简短了,得加强一下.
基础问题
- TCP的三次握手(太紧张讲晕了)
- https的原理和通信过程.(好像把C/S讲反了)
- JS的基本类型(不包括引用类型,null,undefined,Number,String,Symbol)
- 引用类型有哪几种(function,Object,Array)
- 基本类型和引用类型的存储方式有什么不同(可以看看这个)
接下来直接做题
1.实现一个自适应的搜索框,搜索按钮固定宽度,搜索框内容自适应填充父容器的剩余空间.
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
-
这边按照主->微->宏的顺序去想就可以,不断地按照这个次序进行循环.
-
这边问了个小问题: 宏任务和微任务有什么关系和不同.(没答上来)
3.考察闭包
给你一个函数头如下:
const repeat = function (func, times, wait) {};
要求能够实现如下的情况:
repeat函数返回一个函数,使之可以这样子执行
let repeatFunc = repeat(alert,4,3000);
repeatFunc("hello world"); //alert "hello world" 四次,每次之间间隔3秒,并且repeatFunc可以再次使用.
我的实现如下:
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){ //这边是发现无法重用,然后修改的,也是面试官提醒.
i=0;break;
}
}
}
};
好的,眼尖的应该已经发现了,我这道题完全写错了,3秒后四次会同时执行.并不是间隔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秒一次
之后要求修改为:
传入的函数func有多个不同的参数,要求在多参数条件下也能进行实现.
例如这个func为:
function logSum(a,b,c){
console.log(a+b+c);
}
然后我就想到了arguments,但是我发现我搞不清楚作用域,捂脸.
然后就写下了这样的代码
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.类数组对象和数组
- 先问了两者差异
- 然后是类数组转成数组的方法
[...arguments]
Array.from(arguments);
Array.prototype.slice.call(arguments);//建议乖乖写Array,不要写[]
5.JS实现单链表
这个就不讲了...自己写就行了,记得维护一个尾部的对象引用就行,方便插入
项目
因为写了vue项目,所以问了vue的虚拟DOM树的原理,也就是vue怎么进行dom动态更新的.
这个东西可以看这个.
最后就是面试官问有什么想问的嘛?
我问他第一题有么有更好的实现,然后他说flex,好吧,我想到了没有写,因为觉得实现不了....感觉问这个问题好傻逼,捂脸
大致先总结如下
网友评论