# 2018 前端校招总结

虽然现在很多大公司的校招都已经接近尾声了我才拿到满意的一个 offer,但还是稍微分享一下我觉得前端校招的一些内容。

基本上的大公司对于前端校招同学的要求都不仅仅局限于前端领域,因为对于一般的候选人来说都是侧重潜力的考察。而小一点的公司对于候选人的技术能力以及项目经历不会有过多的要求,更多的是希望能够以比较低廉的价格签下一个愿意做切图之类工作的同学。个人觉得对于同学未来几年的发展不是很好。

# 流程

不管是电话面试还是现场面试,基本的流程是:自我介绍基础部分项目经历拓展部分(通常都是以面试者自己回答的内容为发散点)面试者询问

# 自我介绍

这部分应该有很多同学觉得都不用准备,但是事实上面试官第一个问题如果回答的没有条理不仅面试官的印象会不好,而且对自己接下来的状态也会有很大的影响。所以面试者最好自己写好自我介绍的草稿,设计到的内容包括但不限于为什么学前端?拿过什么样的奖项之类的?,虽然简历中有写。

接着面试官可能会问:

  • 如何学前端的?
  • 你认为的前端都要做什么样的工作?
  • 你理解的前端工程师是什么?
  • 你认为前端工程师对于用户和公司有哪些作用?
  • 你最近遇到过什么技术挑战?你是如何解决的?
  • 项目中遇到的问题是如何解决的?
  • 平时都是怎么学习的?
  • 实习了多久,在哪实习,实习的工作是什么?
  • 实习过程中能不能完成公司给你的工作?工作量如何?
  • ...

好了,前戏差不多了,现在开始划一下基础知识的重点。

# 知识点汇总

# HTML

  • HTML5 新特性,语义化
  • 浏览器的标准模式和怪异模式
  • xhtml 和 html 的区别
  • 使用 data-的好处
  • meta 标签
  • canvas
  • HTML 废弃的标签
  • IE6 bug,和一些定位写法
  • css js 放置位置和原因
  • 什么是渐进式渲染
  • html 模板语言
  • meta viewport 原理

# CSS

  • CSS3 新特性,伪类,伪元素,锚伪类
  • CSS 实现隐藏页面的方式
  • 如何实现水平居中和垂直居中。
  • 说说 position,display
  • 浮动元素引起的问题和解决办法?绝对定位和相对定位,元素浮动后的 display 值
  • link 和@import 引入 css 的区别
  • 解释一下 css3 的 flexbox,以及适用场景
  • inline 和 inline-block 的区别
  • 哪些是块级元素那些是行级元素,各有什么特点
  • grid 布局
  • table 布局的作用
  • 实现两栏布局有哪些方法?
  • css dpi
  • 你知道 attribute 和 property 的区别么
  • css 布局问题?css 实现三列布局怎么做?如果中间是自适应又怎么做?
  • 流式布局如何实现,响应式布局如何实现
  • 移动端布局方案
  • 实现三栏布局(圣杯布局,双飞翼布局,flex 布局)
  • 清除浮动的原理
  • overflow:hidden 有什么缺点?
  • padding 百分比是相对于父级宽度还是自身的宽度
  • css3 动画,transition 和 animation 的区别,animation 的属性,加速度,重力的模拟实现
  • CSS 3 如何实现旋转图片(transform: rotate)
  • sass less
  • 对移动端开发了解多少?(响应式设计、Zepto;@media、viewport、JavaScript 正则表达式判断平台。)
  • 什么是 bfc,如何创建 bfc?解决什么问题?
  • CSS 中的长度单位(px,pt,rem,em,ex,vw,vh,vh,vmin,vmax)
  • CSS 选择器的优先级是怎样的?
  • 雪碧图
  • svg
  • 媒体查询的原理是什么?
  • CSS 的加载是异步的吗?表现在什么地方?
  • 常遇到的浏览器兼容性问题有哪些?常用的 hack 的技巧
  • 外边距合并
  • 解释一下“::before”和“:after”中的双冒号和单冒号的区别

# JS

  • js 的基本类型有哪些?引用类型有哪些?null 和 undefined 的区别。
  • 如何判断一个变量是 Array 类型?如何判断一个变量是 Number 类型?(都不止一种)
  • Object 是引用类型嘛?引用类型和基本类型有什么区别?哪个是存在堆哪一个是存在栈上面的?
  • JS 常见的 dom 操作 api
  • 解释一下事件冒泡和事件捕获 https://www.cnblogs.com/Chen-XiaoJun/p/6210987.html
  • 事件委托(手写例子),事件冒泡和捕获,如何阻止冒泡?如何组织默认事件?
  • 对闭包的理解?什么时候构成闭包?闭包的实现方法?闭包的优缺点?
  • this 有哪些使用场景?跟 C,Java 中的 this 有什么区别?如何改变 this 的值?
  • call,apply,bind
  • 显示原型和隐式原型,手绘原型链,原型链是什么?为什么要有原型链
  • 创建对象的多种方式
  • 实现继承的多种方式和优缺点
  • new 一个对象具体做了什么
  • 手写 Ajax,XMLHttpRequest
  • 变量提升
  • 举例说明一个匿名函数的典型用例
  • 指出 JS 的宿主对象和原生对象的区别,为什么扩展 JS 内置对象不是好的做法?有哪些内置对象和内置函数?
  • attribute 和 property 的区别
  • document load 和 document DOMContentLoaded 两个事件的区别
  • === 和 == , [] === [], undefined === undefined,[] == [], undefined == undefined
  • typeof 能够得到哪些值
  • 什么是“use strict”,好处和坏处
  • 函数的作用域是什么?js 的作用域有几种?
  • JS 如何实现重载和多态
  • 常用的数组 api,字符串 api
  • 原生事件绑定(跨浏览器),dom0 和 dom2 的区别?
  • 给定一个元素获取它相对于视图窗口的坐标
  • 如何实现图片滚动懒加载
  • js 的字符串类型有哪些方法? 正则表达式的函数怎么使用?
  • 深拷贝
  • 编写一个通用的事件监听函数
  • web 端 cookie 的设置和获取
  • setTimeout 和 promise 的执行顺序
  • JavaScript 的事件流模型都有什么?
  • navigator 对象,location 和 history
  • js 的垃圾回收机制
  • 内存泄漏的原因和场景
  • DOM 事件的绑定的几种方式
  • DOM 事件中 target 和 currentTarget 的区别
  • typeof 和 instanceof 区别,instanceof 原理
  • js 动画和 css3 动画比较
  • JavaScript 倒计时(setTimeout)
  • js 处理异常
  • js 的设计模式知道那些
  • 轮播图的实现,以及轮播图组件开发,轮播 10000 张图片过程
  • websocket 的工作原理和机制。
  • 手指点击可以触控的屏幕时,是什么事件?
  • 什么是函数柯里化?以及说一下 JS 的 API 有哪些应用到了函数柯里化的实现?(函数柯里化一些了解,以及在函数式编程的应用,最后说了一下 JS 中 bind 函数和数组的 reduce 方法用到了函数柯里化。)
  • JS 代码调试

# ES6

  • 谈一谈 promise
  • 所有的 ES6 特性你都知道吗?如果遇到一个东西不知道是 ES6 还是 ES5, 你该怎么区分它
  • es6 的继承和 es5 的继承有什么区别
  • promise 封装 ajax
  • let const 的优点
  • es6 generator 是什么,async/await 实现原理
  • ES6 和 node 的 commonjs 模块化规范区别
  • 箭头函数,以及它的 this

# 计算机网络

  • HTTP 协议头含有哪些重要的部分,HTTP 状态码
  • 网络 url 输入到输出怎么做?
  • 性能优化为什么要减少 HTTP 访问次数?
  • Http 请求的过程与原理
  • https(对是 https)有几次握手和挥手?https 的原理。
  • http 有几次挥手和握手?TLS 的中文名?TLS 在哪一网络层?
  • TCP 连接的特点,TCP 连接如何保证安全可靠的?
  • 为什么 TCP 连接需要三次握手,两次不可以吗,为什么
  • 为什么 tcp 要三次握手四次挥手?
  • tcp 的三次握手和四次挥手画图(当场画写 ack 和 seq 的值)?
  • tcp 与 udp 的区别
  • get 和 post 的区别?什么情况下用到?
  • http2 与 http1 的区别?
  • websocket
  • 什么是 tcp 流,什么是 http 流
  • babel 是如何将 es6 代码编译成 es5 的
  • http2 的持久连接和管线化
  • 域名解析时是 tcp 还是 udp
  • 域名发散和域名收敛
  • Post 一个 file 的时候 file 放在哪的?
  • HTTP Response 的 Header 里面都有些啥?

# 浏览器相关

  • 跨域,为什么 JS 会对跨域做出限制
  • 前端安全:xss,csrf...
  • 浏览器怎么加载页面的?script 脚本阻塞有什么解决方法?defer 和 async 的区别?
  • 浏览器强缓存和协商缓存
  • 浏览器的全局变量有哪些
  • 浏览器同一时间能够从一个域名下载多少资源
  • 按需加载,不同页面的元素判断标准
  • web 存储、cookies、localstroge 等的使用和区别
  • 浏览器的内核
  • 如何实现缓存机制?(从 200 缓存,到 cache 到 etag 再到)
  • 说一下 200 和 304 的理解和区别
  • 什么是预加载、懒加载
  • 一个 XMLHttpRequest 实例有多少种状态?
  • dns 解析原理,输入网址后如何查找服务器
  • 服务器如何知道你?
  • 浏览器渲染过程
  • ie 的某些兼容性问题
  • session
  • 拖拽实现
  • 拆解 url 的各部分

# 工程化

  • 对 webpack,gulp,grunt 等有没有了解?对比。
  • webpack 的入口文件怎么配置,多个入口怎么分割。
  • webpack 的 loader 和 plugins 的区别
  • gulp 的具体使用。
  • 前端工程化的理解、如何自己实现一个文件打包,比如一个 JS 文件里同时又 ES5 和 ES6 写的代码,如何编译兼容他们

# 模块化

  • 对 AMD,CMD,CommonJS 有没有了解?
  • 为什么要模块化?不用的时候和用 RequireJs 的时候代码大概怎么写?
  • 说说有哪些模块化的库,有了解过模块化的发展的历史吗?
  • 分别说说同步和异步模块化的应用场景,说下 AMD 异步模块化实现的原理?
  • 如何将项目里面的所有的 require 的模块语法换成 import 的 ES6 的语法?
  • 使用模块化加载时,模块加载的顺序是怎样的,如果不知道,根据已有的知识,你觉得顺序应该是怎么样的?

# 框架

  • 使用过哪些框架?
  • zepto 和 jquery 是什么关系,有什么联系么?
  • jquery 源码如何实现选择器的,为什么$取得的对象要设计成数组的形式,这样设计的目的是什么
  • jquery 如何绑定事件,有几种类型和区别
  • 什么是 MVVM,MVC,MVP
  • Vue 和 Angular 的双向数据绑定原理
  • Vue,Angular 组件间通信以及路由原理
  • react 和 vue 的生命周期
  • react 和 vue 的虚拟 dom 以及 diff 算法
  • vue 的 observer,watcher,compile
  • react 和 angular 分别用在什么样的业务吗?性能方面和 MVC 层面上的区别
  • jQuery 对象和 JS 的 Element 有什么区别
  • jQuery 对象是怎么实现的
  • jQuery 除了它封装了一些方法外,还有什么值得我们去学习和使用的?
  • jQuery 的$(‘xxx’)做了什么事情
  • 介绍一下 bootstrap 的栅格系统是如何实现的

# Nodejs

  • 对 nodejs 有没有了解
  • Express 和 koa 有什么关系,有什么区别?
  • nodejs 适合做什么样的业务?
  • nodejs 与 php,java 有什么区别
  • Nodejs 中的 Stream 和 Buffer 有什么区别?
  • node 的异步问题是如何解决的?
  • node 是如何实现高并发的?
  • 说一下 Nodejs 的 event loop 的原理

# 数据结构

  • 基本数据结构:(数组、队列、链表、堆、二叉树、哈希表等等)
  • 8 种排序算法,原理,以及适用场景和复杂度
  • 说出越多越好的费波拉切数列的实现方法?

# 性能优化

  • cdn 的用法是什么?什么时候用到?
  • 浏览器的页面优化?
  • 如何优化 DOM 操作的性能
  • 单页面应用有什么 SEO 方案?
  • 单页面应用首屏显示比较慢,原因是什么?有什么解决方案?

# 其他

  • 正则表达式
  • 前端渲染和后端渲染的优缺点
  • 数据库的四大特性,什么是原子性,表的关系
  • 你觉得前端体系应该是怎样的?
  • 一个静态资源要上线,里面有各种资源依赖,你如何平稳上线
  • 如果要你去实现一个前端模板引擎,你会怎么做
  • 知道流媒体查询吗?
  • SEO
  • mysql 和 mongoDB 有什么区别?
  • restful 的 method 解释
  • 数据库知识、操作系统知识
  • click 在 ios 上有 300ms 延迟,原因及如何解决
  • 移动端的适配,rem+媒体查询/meta 头设置
  • 移动端的手势和事件;
  • unicode,utf8,gbk 编码的了解,乱码的解决

# 三面、四面常问的开放性问题

  • 你都看过什么书?最近在看什么书?
  • 用过什么框架?有没有看过什么框架的代码?
  • 有没有学过设计模式?
  • 说一说观察者模式吧!能不能写出来?
  • 你最大的优点是什么?那你最大的缺点呢?
  • 你大学期间做过最疯狂的事情是什么?
  • 你除了写博客还有什么输出?
  • 现在你的领导给你了一份工作,要求你一个星期完成,但你看了需求以后估计需要 3 周才能完成,你该怎么办?
  • 平时关注的前端技术
  • 如何规划自己的职业生涯
  • 项目过程中,有遇到什么问题吗?怎么解决的?
  • 最近在研究哪方面的东西?
  • 请介绍一项你最热爱、最擅长的专业领域,并且介绍的学习规划。
  • 请介绍你参与的印象最深刻的一个项目,为什么?并且介绍你在项目中的角色和发挥的作用。

# HR 面

  • 你为什么要学习前端?
  • 你平时的是怎么学习前端的?有什么输出?
  • 你觉得自己最好的项目是什么?
  • 身边比较佩服的人有什么值得你学习的?你为什么没有跟他们一样?
  • 同事的什么问题会让你接受不了
  • 压力最大的事情是什么?
  • 和同学做过的最好的项目?
  • 身边的朋友通常对你的评价是什么
  • 喜欢什么样的工作氛围
  • 如何看待加班
  • 有没有对象
  • 意向城市
  • 其他的 offer
  • 为什么要录取你?
  • 大学里花费时间最多的三件事情
  • 周末都会干什么?
  • 未来职业规划

# 建议

  1. 面试的时候不要表现出自己想创业。敲黑板。
  2. 从来没有看过源码的话,建议从 jQuery,zepto 这之类的源码入手,后期可以了解 Vue,React 常见的功能的源码思路和实现。
  3. 项目经验描述的时候不用太太太详细,拣重点的讲。(因为我就一直说一直说,最后面试官评价插不上话评价减分。)

# 最后

我接近两个月的校招里,这里的很多知识点都是从别人的博客、面经一篇一篇的抠下来的,这是前人给后人铺好的路。前端的知识点其实说多也不多,只是太杂,所以我没有整理的特别详细。我之所以以这样的形式分享而不是以面经的形式,主要是有需要的同学们能够“拿去即用”,也是整理一下我原来的笔记。

呀,身边的人都好强,继续学习。[抱拳]