写在前面:

投了三个简历,最后不知道是那个部门约面,就去面试了,哈哈哈。其实好多东西记得不太清楚了,哈哈哈。

一面: 10月22日
直接前一晚睡在实验室了。第二天起来就9:20了,然后洗了把脸就调试设备。

10:30 面试开始:

Q1: 介绍自己?

A: 云云云…

Q2:在百度做了什么?

A:主要用mxgraph + node (express) + nuxt 做了两个项目(具体云云)

Q3:那面试开始吧。js数据类型?

A: 基本:Number,String,null,undefined,Boolean,
引用: Function Date Array Object
ES6新增: symbol , set等

Q:说一下基本数据类型和引用数据类型实质区别?
A:基本数据类型因为占用内存较小,存储在栈内存中,方便查找,同时当基本类型的变量互相赋值的时候,不会出现值共享问题(及污染变量)。 引用类型值存储在堆内存中,通过一个引用指向其堆内存中的空间,互相赋值的时候会出现引用值共享问题。
Q:简单说一下set,symbol数据结构?
A:set数据结构是es6新增的一种数据结构,set数据结构中不会出现重复元素,也为js去重提供了一种新的方法,symbol通过 Symbol关键字创建,其创建的的值不会有重复的,主要为对象创建属性名,避免对象属性名重复。
云云…

Q4:变量类型检测?
A:主要有 typeof 返回 String,Number。Boolean,null, undefined, object
instanceof 缺点不能检测 基本类型值 number tring,但可以检测包装类型的 new String(),new Number()
简单说一下包装类

/*
        *  js复习: js包装类
        *   简介: 为了便于操作基本类型的值 
        *   javascript引入了三个特殊的引用类型  boolean  string number 的包装类
        */

        var a = 123;
        a.name = 'kjh';
        console.log(a.name);  //undefined

        var b = new Number(234);
        console.log(typeof b) // object
        console.log(typeof +b); //number


        
        // 那么,为什么基本类型可以添加属性,访问不报错,并且返回来undefined呢?
        // {
        //     第一步:var a = 123;  这一步并没有什么问题

        //     第二步: a.name = 'kjh'  
        //             {
        //                 这一步:系统知道a是个常量,所以包装类为你创建了一个Number类型的实例,
        //                 同时为这个实例添加了name属性为'kjh',之后又迅速销毁了这个实例。

        //                 new Number(123).name = 'kjh'
        //                 delete
        //             }
            
                    
        //     第三步:console.log(a.name);
        //             {
        //                 系统又直到你错了,包装类再次为你创建了一个Number类型的实例,
        //                 但是这个实例并没有name属性,所以返回了undefined。
        //             }
            
        // }

Q:可以手动实现一个instanceof嘛?

  function instanceof2(L,R){
            var O = R.prototype;
            L = L.__proto__;

            while(true){
                if(L == null){
                    return false;
                }`在这里插入代码片`
                if(L == O){
                    return true;
                }

                L = L.__proto__;
            }
        }

Q5:说一下闭包吧?
A;闭包概念 -> 闭包代码解析 -> 闭包本质 (AO,GO结合执行器上下文)->垃圾回收机制->闭包优缺点等。

Q6:js跨域问题
Q:为什么会出现跨域?
A同源策略, http://www.baidu.com:8080 协议,域名,端口一个不同都会出现跨域
Q:你怎么解决?
A:jsonp 云云
A:cors跨域
A:webpack 配置dev-server proxy代理跨域
A:Nginx跨域
详情可以看我文章。

Q7: 说一下原型,原型链查找过程吧?
A:bbbbbb


//         // 原型里面有以下三个主要概念
//         // constructor
//         // prototype
//         // __proto__


//         //Father的原型对象
//         Person.prototype.name = 'JiaHAO KANG';

//         function Person(){

//         }

//         // 创建了一个Fathe构造函数的实例
//         var person = new Person();  

//         //constructor
//         // 原型对象的constuctor属性指向其构造函数
//        Person.prototype.constructor == Person;  //true

//         //同时实例的constuctor属性也是指向创建它的构造函数
//        person.constructor == Person;  //true


//         //__proto__
//         //同时实例可以通过__poto__属性访问到实例原型
//        person.__proto__ == Person.prototype;  //true




//     //    原型链
//     Father.lol = '你是信仰';
//     function Father(){
//         this.name = 'kjh'
//     }

//    var son = new Father();

//     //子类可以通过原型链去访问父类的一些属性。
//     //原型链的查找过程

//     // 当我们要访问子类实例的属性的时候:
//     // (1)首先去son实例身上查找
//     // (2)son身上没有的话,就通过son.__proto__去Father.prototype查找
//     //  (3) Father.prototype没有的话,就通过Father.prototype__proto__ 去Object.prototype查找
//     //  (4) 最后一直找到Object.prototype.__proto__ == null,表示一次原型查找完毕。

Q8: 看一下代码输出?
在这里插入图片描述
A: 3 3 因为首先varb = 7,这时候i相当于全局对象window上有个b属性为7;但是 a函数执行的时候,this符合默认绑定,这个时候this指向window所以修改了 b = 3,所以console.log(b) 为3. 又因为var c = new a() 在修改a的原型之前,所以c.b = 3.
Q:你确定你的输出嘛?
A: ??? 我又看了一遍,确定吧,应该没问题吧。(面完之后打印了一下,的却没问题,面试官问了我三次,搞心态,哈哈哈哈)

Q9:了解promise嘛?
A:promise主要有两个参数,三个状态,resolve参数是一个函数,同时resolve对应请求成功,执行.then函数,reject是一个函数对应请求失败,执行.catch函数等。云云云。。。
Q:看一下以下输出:
在这里插入图片描述
A:第一个打印 2 3 失败 第二个不太清楚。
面试官给我讲了一遍。哈哈哈

Q10:问了几个CSS问题。
A:…

Q11:来一个算法。
>
A:貌似是个滑动窗口最大值问题.(剑指offer 64刷过)
是的。

function maxInWindows(num, size) {
        var maxArr = [];   //存储每个片段里面最大元素数组
        var scorllArr = [];   //滚动片段数组
        var max = null;   //最大值

        for (let i = 0; i < num.length; i++) {
            if (size > 0) {     //片段长度 > 0
                if (scorllArr.length < size) {
                    scorllArr.push(num[i])  
                }  //如果片段的长度小于size就继续给数组中推入元素
                if (scorllArr.length == size) {
                    maxArr.push(Math.max(...scorllArr));  
                    scorllArr.shift();
                }  //如果片段的长度等于size  1.计算长度  2.删除片段首部元素
            }
        }

        return maxArr;   //返回自己的数组
    }

Q:整个数组去重吧。
A: indexOf, 利用对象去重,es6去重,代码就不复现了。

Q:有什么问题问我?
A:部门主要是什么技术栈? Q:react
A:假如我能过,大概多久通知
Q:这一面,我给你过了,有几个问题答得挺深比较满意,给你联系下一个面试官。

==一面总结:==整体问题简单,面试官人也很好。

二面:大约5分钟后

先去乐华玩了,回来了继续写。哈哈哈

Q1:实现一个两栏布局
A: 开启一个BFC即可 float
说说什么是BFC,怎么开启BFC
A:BFC… 设置 float postiion visiable display:flex等

Q2:垂直居中
A: css2 使用postion:absolute定位 css3使用flex

Q3:三次握手四次挥手?
A:…

Q4:TCP/IP OSI七层模型架构?
A:…

Q5:HTTP1.0和HTTP2.0区别?
A:…

Q6:HTTP/HTTPS的区别?
A:…

Q7:TCP拥塞控制和双全工通信具体过程?
A:…

Q8:可以手写一个promise.all嘛
在这里插入图片描述

A:之前没写过 haha promise.all () 返回一个新的promise,方法需要全部成功才能成功执行
promise.all 你想想返回值是什么,参数是什么?
A:传入一个promise元素数组,返回一个新的promise对象
ok,那你实现一下
具体代码:

 myPromise.all = function (arr) {
            return new Promise ((resolve,reject) => {
                if(!Array.isArray(arr)){
                    throw new TypeError('arguments must be a array');
                }

                var len = arr.length;
                var resolveNum = 0;
                var resolveResult = [];

                for(var i = 0; i < len; i++){
                    arr[i].then((data) => {
                        resolveNum ++;
                        resolveResult.push(data);
                        if(resolveNum == len){
                            return resolve(resolveResult);
                        }
                    }).catch((error) => {
                        return reject(error);
                    })
                }
            })
        }

Q9:讲一下双向绑定原理,实现vue双向绑定。
A:vue双向绑定主要通过Object.defioneProperty配合发布者-订阅者模式来实现。
Object.defioneProperty具有两个对象属性,一个数据属性,一个构造器属性,构造器属性中get函数和set函数主要用于数据劫持。
代码实现

let obj = {};

        Object.defineProperty(obj,'value',{
            get:function(){

            },
            set:function(newValue){
                obtn.value = newValue;
                show.innerText = newValue;
            }
        })

        obtn.addEventListener('keyup',function(e){
            obj.value = this.value;
        })

Q10:事件模型,事件委托。

Q11:vue生命周期

Q12:来一个算法题吧
在这里插入图片描述
哈哈哈,这个写了2边都有问题,最后说了自己的思路(使用栈来实现),面试官说没问题就过了。
代码:

var removeDuplicates = function(S) {
    let stack = []
    for(c of S) {
        let prev = stack.pop()
        if(prev !== c) {
            stack.push(prev)
            stack.push(c)
        }
    }
    return stack.join('')
};

二面完了,问了面试官自己在学习中的一些问题,以及以后的侧重点,是往深里学还是广学,最后问了,如果二面能过什么时候通知,二面面试官说我基础很好,给我过了,三面具体通知会有hr电话联系。

周四:三面
三面真的特别尴尬,周四早上还在睡觉的我,突然hr打电话说,leader比较忙,希望推到下一周,但是我这边因为其他公司原因说自己时间不够之类的,最后协商三面从下午4点调到了下午2点,然后背着书包去复习找教室。

自己刷了字节很多面经,发现三面大多比较温柔,甚至好多三面都没怎么问技术,然后窃喜。

Q1:简单自我介绍
A:balalalaal

Q2:说一说你在学习前端碰到的最大的问题?
A:balabalabalbalbal

这个时候窃喜,疯狂,难道我也运气号,聊聊天不怎么问技术,????
是我想多了。。。。

Q3:开始一些技术问题吧
实现trim方法
在这里插入图片描述
在这里插入图片描述
通过获取字符串空格位置,通过字符串截取实现。

Q4:实现模板字符串的过程
在这里插入图片描述
在这里插入图片描述
这个有点恶心,哈哈哈。
Q5:实现三栏布局
在这里插入图片描述
A:写的圣杯布局:

 .box{
            padding: 0 200px 0 200px;
        }

        .center, .left, .right{
            height: 500px;
            float: left;
            position: relative;
        }

        .center{
            width: 100%;
            background: pink;
        }

        .left{
            width: 200px;
            background: red;
            left: -200px;
            margin-left: -100%;
        }

        .right{
            width: 200px;
            background: green;
            right: -200px;
            margin-left: -200px;
        }
    </style>
</head>
<body>
    <div class="box">
        <div class="center"></div>
        <div class="left"></div>
        <div class="right"></div>
    </div>
</body>

Q6:实现一个继承?
A:那就来个最难的吧。
在这里插入图片描述

Q7:求一下二叉树高度?
A:这个没写过,封装一个完整二叉搜索树可以吗?数据结构没问题,算法略差。
Q;写个快排吧?
A:好嘞。

//快速排序


function quickSort(arr,left,right){
    var i = left;
    var j = right;
    var key = arr[left];
    
    if(left >= right) return;
    
    while(i < j){
        while(arr[j] > key && i < j){
            j --;
        }
        
        while(arr[i] <= key && i < j){
            i ++;
        } 
        
        if(i < j){
            var temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    
    arr[left] = arr[i];
    arr[i] = key;
    
    quickSort(arr,left,i-1);
    quickSort(arr,i + 1,right);
    
    return arr;
}


var arr = [1,2,8,5,4,0,9,6,3];

console.log(quickSort(arr,0,arr.length-1));

Q:好了,就这样吧,我去给你找HR。

可以的,三面敲了这么久的代码。

HR面:
1.你是怎么学习前端的?
2.为什么没有考虑出省上大学?
3.学习中碰到的困难?
4.在百度实习做了什么?
5.实习有什么收获?
6.可以什么时候来实习,大概多久?
7.西安邮电大学在西安具体算个什么水平?(hahahah)
8.介绍部门情况
9.还有别的offer嘛
.反问。。。。

最后希望大家加油,上岸。我尽可能把自己能想到的都写了。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐