【面试】百度广告&旷世 前端开发实习岗

233 阅读4分钟

百度一面

  1. 自我介绍
  2. 移动端相关的CSS(flex、vm & vh、rem & em、meta)
  3. Event Loop
  4. 发请求是异步吗?
  5. 什么是跨域?跨域请求有哪些方式(jsonp、CORS、WebSocket、Vue的devServer)
  6. 详述CORS(简单请求:请求头带Origin、复杂请求:OPTIONS预检请求)
  7. 从输入url到页面呈现发生了什么?
    • 网络请求(构建请求、查找缓存、DNS解析、建立TCP链接、发送HTTP请求)
    • 网络相应
    • 渲染阶段(构建DOM树、样式计算、布局阶段、分层、绘制、分块、光栅化、合成)
  8. 怎样建立TCP链接,即三次握手是什么
  9. 缓存包括哪些?相关的请求头有哪些?
    • 怎样区分强缓存和协商缓存
    • Expires、Cache-Control、Last-Modified、If-Modified-Since、Etag、If-None-Match各自的含义
  10. 用过的HTTP状态码有哪些,分别有什么含义
  11. 闭包(含义、优缺点、使用场景、怎样解决闭包带来的内存泄露问题)
  12. 怎样理解作用域(ES6、ES5)怎样改变作用域(call、apply)
  13. 怎样理解this?箭头函数的this
  14. 怎样理解 async await(使用、优点)
  15. 防抖和节流的区别、原理、使用场景
  16. 原型链、ES6的继承(extends对原型链的影响)
  17. new的原理
  18. 用过哪些页面性能优化的方法(Object.freeze、缓存、资源按需加载、异步加载非核心代码、Repaint、Reflow)
  19. audio标签在不同手机浏览器的兼容性问题(在Safari和部分安卓浏览器中,audio标签的自动播放和循环播放会有兼容性问题)
  20. 代码题:用Promise包一个xhr请求 & 快速排序算法 二选一

百度二面

  1. 自我介绍
  2. 问了实习经历,简述项目
  3. 除了工作,平时自己一般怎么学习,印象最深刻的知识点是什么?
  4. (上一问回答了Vue的MVVM源码)简述了源码的原理
  5. 问实习项目,包括自己印象最深刻的解bug,感觉自己思路比较厉害的

开始基础问题

  1. 从输入url到页面呈现发生了什么?(和一面一样)
  2. 缓存相关:304状态码的含义
  3. 介绍HTTP三次握手四次回收以及原因
  4. 浏览器的渲染过程

面试官突然发现基础问题一面都基本问完了,开始算法题

  1. 一个数组(包括正负重复数字),求其中三个加和为零的组合 LeetCode三数之和
const sumZero = function(nums) {
   let res = [];
   const len = nums.length;
   if(nums == null || len < 3) return ans;
   nums.sort((a, b) => a - b);
   for (let i = 0; i < len ; i++) {
       if(nums[i] > 0) break;
       if(i > 0 && nums[i] === nums[i-1]) continue;
       let L = i + 1;
       let R = len - 1;
       while(L < R) {
           const sum = nums[i] + nums[L] + nums[R];
           if(sum === 0) {
               res.push([nums[i], nums[L], nums[R]]);
               while (L < R && nums[L] === nums[L + 1]) L++;
               while (L < R && nums[R] === nums[R - 1]) R--;
               L++;
               R--;
           }
           else if (sum < 0) L++;
           else if (sum > 0) R--;
       }
   }        
   return res;
};
  1. 上一个算法题的进阶,求三数之和最接近零的情况,返回这个最接近零的值(假设不存在最接近的值有重复的情况,例如-1 & 1)
const sumZero = function(nums) {
   const len = nums.length;
   if(nums === null || len < 3) return null;
   nums.sort((a, b) => a - b); 
   let mindeff = nums[0] + nums[1] + nums[2];
   for (let i = 0; i < len ; i++) {
       if(nums[i] > 0) break;
       if(i > 0 && nums[i] === nums[i - 1]) continue;
       let L = i + 1;
       let R = len - 1;
       while(L < R) {
           const sum = nums[i] + nums[L] + nums[R];
           if(Math.abs(mindeff) > Math.abs(sum)) {
             mindeff = sum;
           }
           if(sum === 0) {
             return 0;
           } else if (sum < 0) {
             L++;
           } else if (sum > 0) {
             R--;
           }
           
       }
   }        
   return mindeff;
};

旷世一面

自我介绍

  1. Event Loop,微任务宏任务的含义与区别
  2. new运算符
  3. 当有一个非常大的数组时,取第一个元素与取最后一个元素的时间复杂度相同吗?
  4. 常用的ES6特性
  5. 箭头函数的优点
  6. 闭包
  7. div居中的几种方案(分该div长宽是否已知回答)
  8. position的取值及含义
  9. Vue的生命周期函数,常用的有哪些,分别用于什么场景
  10. v-if、v-show的区别及使用场景
  11. 为何Vue中的data是一个函数

旷世二面

自我介绍

  1. 介绍项目背景
  2. 用过的跨域方法(jsonp的弊端)
  3. vue自定义指令
  4. mixin
  5. webpack
  6. nodejs