前端面试题总结(持续更新)

接下来要参与大大小小的暑期实习笔试和面试。在这篇博客里我将总结一些常见的面试题。其中有一部分是我去年暑假找实习的时候总结的。现在看来,不免有些幼稚。慢慢完善吧!

JavaScript

Q:JS中的闭包

A:闭包从本身在函数式编程中的概念来说,说的是在定义函数时的两部分-函数体和函数的context,也就是函数定义时的上下文。里面保存着作用域中的变量,函数的定义和赋值。

而我们平时说的闭包,其实是创建对于这个上下文的引用,从而在外部作用域中通过这个引用来访问这个上下文。

所以从概念上来说,你声明了一个函数,就声明了一个闭包。

然后从实际的使用来说,当你通过某种代码对在外部作用域中保存了对当前闭包的引用时,我们说你就“创建”了一个闭包,其实是“创建”了一个闭包的引用。我们通常用IIFE来达到这一效果,以至于有人认为IIFE就是“闭包”,这其实是不正确的认识。

这就是闭包的实质,至于如何去使用闭包,那就五花八门了。你可以用来保存被外部作用域访问的临时变量,也可以用来封装函数,也可以用来做访问权限控制(类似Java中的私有变量)。


Q:JS模块化

A:

  • 为什么我们需要JS模块化
  • JS模块化的发展过程(从function,IIFE到Commonjs)
  • JS模块化的几种方案介绍(Commonjs,AMD,ES6 Module)

Q:JS中使用new关键字构造对象实例的过程
A:

MyObject.construct = function() {
    var o = {}, Constructor = MyObject;
    o.__proto__ = Constructor.prototype;
    // FF 支持用户引用内部属性 [[Prototype]]

    Constructor.apply(o, arguments);
    return o;
};

Q:JS性能优化
A: to be done

CSS

Q:CSS position的不同取值以及差异?

A:取值:static(默认),relative,absolute,fixed。差异,relative:相对于其自身进行定位,不脱离文档流。absolute:相对于父元素链上的第一个已定位元素,如果不存在则相对于body。脱离文档流。fixed,相对于浏览器窗口进行定位,脱离文档流。static:正常的文档流定位。


Q:CSS 盒模型

A:

  • W3C 默认content-box,ie5-、ie6 Quirks mode border-box
  • content-box:csswidth = content width
  • border-box: csswidth = content width + padding +border

Q:CSS选择器

A:元素,类,id,属性,伪类,伪元素。···


Q:CSS hack

A:选择器hack(-webkit-,-moz-),属性hack,IE条件注释

HTML

Q:web语义化

A:
html5新标签:<header><footer><nav><aside>
Microformat:标准化的css类名,方便搜索引擎对页面内容进行索引。


Q:Doctype

A:通过检查doctype决定使用兼容模式还是标准模式对文档进行渲染。html中为<!doctype html>

数据结构与算法

前端性能

Q:页面加载速度优化?

A:

  • 从http请求上来说,减少http请求数(合并css,js,sprite图,或者使用阿里的一个请求多个文件技术),但是合并请求不利于浏览器缓存。适当的请求数可以充分利用并发连接(瀑布图)并利用好缓存。减小文件的大小(压缩css,js,图片)。CDN加速等。
  • 从浏览器渲染的角度来说,把js放在</body>之前,在DOM加载完成后加载js。CSS动画用transform而不是js和绝对定位。
  • 服务器端,充分利用缓存。使用hash更新文件。Gzip压缩。
  • 性能检测工具。WebPagetest。Chrome DevTools。

网络

Q:HTTP GET POST的不同?

A:

  • GET是把参数加到URL中,在URL中可以看到。POST将表单内容放置在HTTP request body中。
  • 在RESTful的api设计中,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

Q:HTTP状态码

A:200 ok,304 not modified,404 not found,403 forbidden,500 internal server error, 503 Service Unavailable等。

安全

Q:Web安全

A:XSS,CSRF,SQL注入等。具体可以看一些前端安全相关的书,初步了解。有实战最佳。

浏览器

Q:描述在浏览器中输入url到网页加载完成的过程

A:

  • 浏览器查看缓存,如果有为过期的资源则直接返回该资源。
  • 若缓存没有所需的资源,浏览器解析url,组装一个http请求。
  • 浏览器获取主机ip地址,查询链从浏览器缓存,本机缓存,路由器缓存,到dns服务器缓存,进入dns查询链
  • 获得主机的ip地址后,与目标ip建立tcp连接,发送http请求
  • tcp/ip 7层模型
  • 服务器端处理,web服务器,web端处理程序,返回http response
  • 浏览器接收http reponse 并根据状态码不同做出不同的处理
  • 根据资源类型决定处理方式,如果是html文档,则构建DOM树,下载资源,构造CSS om树,执行js脚本。
  • DOM树:
    Tokenizing:根据HTML规范将字符流解析为标记
    Lexing:词法分析将标记转换为对象并定义属性和规则
    DOM construction:根据HTML标记关系将对象组成DOM树
  • CSS OM(object model)树:
    Tokenizing:字符流转换为标记流
    Node:根据标记创建节点
    CSSOM:节点创建CSSOM树
  • 根据DOM树和CSS om树构建渲染树 render object
    从DOM树的根节点遍历所有可见节点,不可见节点包括:1)script,meta这样本身不可见的标签。
    2)被css隐藏的节点,如display: none
    对每一个可见节点,找到恰当的CSSOM规则并应用
    发布可视节点的内容和计算样式
  • js解析
    浏览器创建Document对象并解析HTML,将解析到的元素和文本节点添加到文档中,此时document.readystate为loading
    此时HTML解析器遇到同步script时,将他们添加到文档中,然后执行行内或外部脚本。这些脚本会同步执行,并且在脚本下载和执行时解析器会暂停。
    浏览器在Document对象上触发DOMContentLoaded事件
    此时文档完全解析完成,浏览器可能还在等待如图片等内容加载,等这些内容完成载入并且所有异步脚本完成载入和执行,document.readState变为complete,window触发load事件
  • 页面显示
    (关于这个问题的浏览器渲染方面,看webkit技术内幕比较好,我觉得这本书也算是高阶前端必看的一本)

其他

Q:平时如何学习前端?

A:
答案因人而异

  • 技术书籍。英文为主,中文为辅。
  • 信息流-微博,推特等上面的技术博客和文章。
  • 学框架使用-看官方文档。
  • 学框架原理-看源码,仿照轮子。
  • 专题分析,写博客总结或者写demo总结。
  • 技术会议。

Q:Web无障碍?
A:to be done

智力题

Q:你让工人为你工作7天,给工人的回报是一根金条。金条平分成相连的7段
,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你如何给你
的工人付费?

A:把金条切成4份,2份和1份
第一天给工人一份金条
第二天给他两份的金条,把第一天的一份金条收回
第三天又把一份的金条给他
第四天把四份的金条给他,把一份和两份的金条收回
第五天又把一份的金条给他
第六天又给他两份的金条,收回一份的金条
第七天最后把一份的金条给他

Q:一群人开舞会,每人头上都戴着一顶帽子。帽子只有黑白两种,黑的至少
有一顶。每个人都能看到其他人帽子的颜色,却看不到自己的。主持人先让大家看
看别人头上戴的是什么帽子,然后关灯,如果有人认为自己戴的是黑帽子,就打自
己一个耳光。第一次关灯,没有声音。于是再开灯,大家再看一遍,关灯时仍然鸦
雀无声。一直到第三次关灯,才有劈劈啪啪打耳光的声音响起。问有多少人戴着黑
帽子?

或者这种变体:

一个村子里,有50户人家,每家都养了一条狗。现在,发现村子里面出现了n只疯狗,村里规定,谁要是发现了自己的狗是疯狗,就要将自己的狗枪毙。
但问题是,村子里面的人只能看出别人家的狗是不是疯狗,而不能看出自己的狗是不是疯的,如果看出别人家的狗是疯狗,也不能告诉别人。
于是大家开始观察,第一天晚上,没有枪声,第二天晚上,没有枪声,第三天晚上,枪声响起(具体几枪不清楚),问村子里有几只疯狗?
(1)必须确定是疯狗才能杀
(2)杀狗用猎枪,开枪杀狗人人都听的见,没聋子
(3)只能观察其他人家的狗是否得了疯狗病,不能观察自己的狗是否有疯狗病
(4)只能杀自己家的狗,别人家的狗你就是知道有疯狗病也不能杀
(5)任何观察到了其他人家的狗有疯狗病都不能告诉任何人
(6)每人每天去观察一遍其他人家的狗是否疯狗
现在现象是:第一天没有枪声,第二天没有枪声,第三天响起一片枪声

A:假如只有一个人戴黑帽子,那他看到所有人都戴白帽,在第一次关灯时就
应自打耳光,所以应该不止一个人戴黑帽子;如果有两顶黑帽子,第一次两人都只
看到对方头上的黑帽子,不敢确定自己的颜色,但到第二次关灯,这两人应该明白
,如果自己戴着白帽,那对方早在上一次就应打耳光了,因此自己戴的也是黑帽子
,于是也会有耳光声响起;可事实是第三次才响起了耳光声,说明全场不止两顶黑
帽,依此类推,应该是关了几次灯,有几顶黑帽。