iOS面试总结JavaScript

字节跳动前端一面凉经

2019-03-23  本文已影响1018人  CRJ997

今天下午面试了字节跳动,嗯.....,面完三分钟出结果,被刷了,准备不够充分啊
然后作一下总结先:

自我介绍

这一边自己好像讲了不到30秒,太简短了,得加强一下.

基础问题

  1. TCP的三次握手(太紧张讲晕了)
  2. https的原理和通信过程.(好像把C/S讲反了)
  3. JS的基本类型(不包括引用类型,null,undefined,Number,String,Symbol)
  4. 引用类型有哪几种(function,Object,Array)
  5. 基本类型和引用类型的存储方式有什么不同(可以看看这个)

接下来直接做题

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,好吧,我想到了没有写,因为觉得实现不了....感觉问这个问题好傻逼,捂脸

大致先总结如下

上一篇 下一篇

猜你喜欢

热点阅读