HTML 部分
CSS 部分
JavaScript 部分
其他问题
优质网站推荐
前言

本文总结了一些优质的前端面试题(多数源于网络),初学者阅后也要用心钻研其中的原理,重要知识需要系统学习,透彻学习,形成自己的知识链。万不可投机取巧,只求面试过关是错误的!

面试有几点需注意:(来源程劭非老师 github:@wintercn)

面试题目: 根据你的等级和职位变化,入门级到专家级:范围↑、深度↑、方向↑。

题目类型: 技术视野、项目细节、理论知识题,算法题,开放性题,案例题。

进行追问: 可以确保问到你开始不懂或面试官开始不懂为止,这样可以大大延展题目的区分度和深度,知道你的实际能力。因为这种关联知识是长时期的学习,绝对不是临时记得住的。

回答问题再棒,面试官(可能是你的直接领导面试),会考虑我要不要这个人做我的同事?所以态度很重要。(感觉更像是相亲)

资深的工程师能把absolute和relative弄混,这样的人不要也罢,因为团队需要的你这个人具有可以依靠的才能(靠谱)。

前端开发面试知识点大纲:

HTML&CSS:
对Web标准的理解、浏览器内核差异、兼容性、hack、CSS基本功:布局、盒子模型、
选择器优先级及使用、HTML5、CSS3、移动端适应 

JavaScript:  
数据类型、面向对象、继承、闭包、插件、作用域、跨域、原型链、模块化、自定义事件、
内存泄漏、事件机制、异步装载回调、模板引擎、Nodejs、JSON、ajax等。

其他:
HTTP、安全、正则、优化、重构、响应式、移动端、团队协作、可维护、SEO、UED、架构、职业生涯 
作为一名前端工程师,无论工作年头长短都应该必须掌握的知识点:

此条由 王子墨 发表在 前端随笔

1、DOM结构——两个节点之间可能存在哪些关系以及如何在节点之间任意移动。

document.documentElement     返回文档的根节点<html> 
document.body     <body> 
document.activeElement 返回当前文档中被击活的标签节点(ie) 
event.fromElement        返回鼠标移出的源节点(ie) 
event.toElement       返回鼠标移入的源节点(ie) 
event.srcElement     返回激活事件的源节点(ie) 
event.target         返回激活事件的源节点(firefox) 
当前对象为node 
返回父节点:node.parentNode, node.parendElement, 
返回所有子节点:node.childNodes(包含文本节点及标签节点),node.children 
返回第一个子节点:node.firstChild 
返回最后一个子节点: node.lastChild 
返回同属上一个子节点:node.nextSibling 
返回同属下一个子节点:node.previousSibling 
parentNode和parentElement功能一样,childNodes和children功能一样。但是parentNode和
childNodes是符合W3C标准的,可以说比较通用。而另外两个只是IE支持,不是标准,Firefox就不支持 
,所以大家只要记得有parentElement和children就行了 
2、DOM操作——怎样添加、移除、移动、复制、创建和查找节点。

(1)创建新节点
    createDocumentFragment()    //创建一个DOM片段
    createElement()   //创建一个具体的元素
    createTextNode()   //创建一个文本节点
(2)添加、移除、替换、插入
    appendChild()
    removeChild()
    replaceChild()
    insertBefore()
(3)查找
    getElementsByTagName()    //通过标签名称
    getElementsByName()    //通过元素的Name属性的值
    getElementById()    //通过元素Id,唯一性
3、事件——怎样使用事件以及IE和DOM事件模型之间存在哪些主要差别。

(1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发。
IE 5.5: div -> body -> document
IE 6.0: div -> body -> html -> document
Mozilla 1.0: div -> body -> html -> document -> window
(2)捕获型事件(event capturing):事件从最不精确的对象(document 对象)开始触发,
然后到最精确(也可以在窗口级别捕获事件,不过必须由开发人员特别指定)。
(3)DOM事件流:同时支持两种事件模型:捕获型事件和冒泡型事件,
但是,捕获型事件先发生。两种事件流会触及DOM中的所有对象,从document对象开始,也在document对象结束。
DOM事件模型最独特的性质是,文本节点也触发事件(在IE中不会)。
4、XMLHttpRequest——这是什么、怎样完整地执行一次GET请求、怎样检测错误。

XMLHttpRequest 对象提供了在网页加载后与服务器进行通信的方法。

<script type="text/javascript">
    varxmlhttp;
    functionloadXMLDoc(url){
        xmlhttp=null;
        if(window.XMLHttpRequest){    //code for all new browsers
            xmlhttp=newXMLHttpRequest();
        }elseif(window.ActiveXObject){    //code for IE5 and IE6
            xmlhttp=newActiveXObject("Microsoft.XMLHTTP");
        }
        if(xmlhttp!=null){
            xmlhttp.onreadystatechange=state_Change;
               xmlhttp.open("GET",url,true);
            xmlhttp.send(null);
        }else{
            alert("Your browser does not support XMLHTTP.");
        }
}

functionstate_Change(){
    if(xmlhttp.readyState==4){    //4 = "loaded"
        if(xmlhttp.status==200){    //200 = OK
            //...our code here...
        }else{
            alert("Problem retrieving XML data");
        }
    }
}
</script>
5、严格模式与混杂模式——如何触发这两种模式,区分它们有何意义。

在标准模式中,浏览器根据规范呈现页面;
在混杂模式中,页面以一种比较宽松的向后兼容的方式显示。
浏览器根据DOCTYPE是否存在以及使用的哪种DTD来选择要使用的呈现方法。
如果XHTML文档包含形式完整的DOCTYPE,那么它一般以标准模式呈现。
对于HTML 4.01文档,包含严格DTD的DOCTYPE常常导致页面以标准模式呈现。
包含过渡DTD和URI的DOCTYPE也导致页面以标准模式呈现,但是有过
渡DTD而没有URI会导致页面以混杂模式呈现。DOCTYPE不存在或形式不正确会导致HTML和XHTML文档以混杂模式呈现。
6、盒模型——外边距、内边距和边框之间的关系,IE 8以下版本的浏览器中的盒模型有什么不同。

一个元素盒模型的层次从内到外分别为:内边距、边框和外边距
IE8以下浏览器的盒模型中定义的元素的宽高不包括内边距和边框。(这句回答有争议,期待能有人解答原因QQ1662484899)

延伸:
盒子模型分为两类:W3C标准盒子模型和IE盒子模型 (微软确实不喜欢服从他家的标准)
    这两者的关键差别就在于:
W3C盒子模型——属性高(height)和属性宽(width)这两个值不包含 填充(padding)和边框(border)
    IE盒子模型——属性高(height)和属性宽(width)这两个值包含 填充(padding)和边框(border)
    我们在编写页面代码的时候应该尽量使用标准的W3C盒子模型(需要在页面中声明DOCTYPE类型),
    这样可以避免多个浏览器对同一页面的不兼容。
因为如果不声明DOCTYPE类型,IE会将盒子模型解释为IE盒子模型,FireFox等会将其解释为W3C盒子模型;
而如果在页面中声明了DOCTYPE模型,所有的浏览器都会把盒子模型解释为W3C盒子模型。
7、块级元素与行内元素——怎么用CSS控制它们、它们怎样影响周围的元素以及你觉得应该如何定义它们的样式。

块级元素,用CSS中的display:inline;属性则变为行内元素
行内元素,用CSS中的display:block;属性则变为块级元素
影响:周围元素显示在同一行或换行显示,根据具体情况调整样式
8、浮动元素——怎么使用它们、它们有什么问题以及怎么解决这些问题。

需要浮动的元素可使用CSS中float属性来定义元素的浮动位置,left:往左浮动,right:往右浮动
浮动元素引起的问题:
(1)父元素的高度无法被撑开,影响与父元素同级的元素
(2)与浮动元素同级的非浮动元素会跟随其后
(3)若非第一个元素浮动,则该元素之前的元素也需要浮动,否则会影响页面显示的结构
解决方法:
使用CSS中的clear:both;属性来清除元素的浮动可解决2、3问题,
对于问题1,添加如下样式,给父元素添加clearfix样式:
.clearfix:after{content: ".";display: block;height: 0;clear: both;visibility: hidden;}
.clearfix{display: inline-block;}  /* for IE/Mac */
9、HTML与XHTML——二者有什么区别,你觉得应该使用哪一个并说出理由。

主要区别:
XHTML 元素必须被正确地嵌套
XHTML 元素必须被关闭,空标签也必须被关闭,如 <br> 必须写成 <br />
XHTML 标签名必须用小写字母
XHTML 文档必须拥有根元素
XHTML 文档要求给所有属性赋一个值
XHTML 要求所有的属性必须用引号""括起来
XHTML 文档需要把所有 < 、>、& 等特殊符号用编码表示
XHTML 文档不要在注释内容中使“--”
XHTML 图片必须有说明文字
XHTML 文档中用id属性代替name属性
10、JSON——它是什么、为什么应该使用它、到底该怎么使用它,说出实现细节来。

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
易于人阅读和编写。同时也易于机器解析和生成。
JSON建构于两种结构:
“名称/值”对的集合(A collection of name/value 
pairs)。
不同的语言中,它被理解为对象(object),纪录(record),结构(struct),
字典(dictionary),哈希表
(hash table),有键列表(keyed list),或者关联数组 (associative array)。 
值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
备注:

根据自己需要选择性阅读,面试题是对理论知识的总结,让自己学会应该如何表达。

资料答案不够正确和全面,欢迎补充答案、题目;最好是现在网上没有的。

格式不断修改更新中。

HTML

Doctype作用? 严格模式与混杂模式如何区分?它们有何意义?

(1)、<!DOCTYPE> 声明位于文档中的最前面,处于 <html> 标签之前。告知浏览器的解析器,
用什么文档类型 规范来解析这个文档。 

(2)、严格模式的排版和 JS 运作模式是  以该浏览器支持的最高标准运行。

(3)、在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点无法工作。

(4)、DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。
行内元素有哪些?块级元素有哪些? 空(void)元素有那些?

(1)CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,
  比如div默认display属性值为“block”,成为“块级”元素;
  span默认display属性值为“inline”,是“行内”元素。  

(2)行内元素有:a b span img input select strong(强调的语气) 
块级元素有:div ul ol li dl dt dd h1 h2 h3 h4…p  

(3)知名的空元素: 
<br> <hr> <img> <input> <link> <meta> 
鲜为人知的是: 
<area> <base> <col> <command> <embed> <keygen> <param> <source> <track> <wbr>
请问css中的区块 inline inline-block block 三者有什么区别呢?

这样先讲内联元素和块级元素:
内联元素是不可以控制宽和高、margin等;并且在同一行显示,不换行。
块级元素时可以控制宽和高、margin等,并且会换行。

inline:使用此属性后,元素会被显示为内联元素,元素则不会换行。
block:使用此属性后,元素会被现实为块级元素,元素会进行换行。
inline-block:是使元素以块级元素的形式呈现在行内。
意思就是说,让这个元素显示在同一行不换行,但是又可以控制高度和宽度,这相当于内联元素的增强。

要注意的是IE6 不支持inline-block
link 和@import 的区别是?

(1)link属于XHTML标签,而@import是CSS提供的;

(2)页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载;

(3)import只在IE5以上才能识别,而link是XHTML标签,无兼容问题;

(4)link方式的样式的权重 高于@import的权重. 
浏览器的内核分别是什么?

* IE浏览器的内核Trident、Mozilla的Gecko、
* Chrome的Blink(WebKit的分支)、Opera内核原为Presto,现为Blink;
常见兼容性问题?

* png24位的图片在iE6浏览器上出现背景,解决方案是做成PNG8.

* 浏览器默认的margin和padding不同。解决方案是加一个全局的*{margin:0;padding:0;}来统一。

* IE6双边距bug:块属性标签float后,又有横行的margin情况下,在ie6显示margin比设置的大。 

浮动ie产生的双倍距离 #box{ float:left; width:10px; margin:0 0 0 100px;} 

这种情况之下IE会产生20px的距离,解决方案是在float的标签样式控制中
加入 ——_display:inline;将其转化为行内属性。(_这个符号只有ie6会识别)

渐进识别的方式,从总体中逐渐排除局部。 

首先,巧妙的使用“\9”这一标记,将IE游览器从所有情况中分离出来。 
接着,再次使用“+”将IE8和IE7、IE6分离开来,这样IE8已经独立识别。

css
.bb{
background-color:#f1ee18;/*所有识别*/
.background-color:#00deff\9; /*IE6、7、8识别*/
+background-color:#a200ff;/*IE6、7识别*/
_background-color:#1e0bd1;/*IE6识别*/ 


*  IE下,可以使用获取常规属性的方法来获取自定义属性,
也可以使用getAttribute()获取自定义属性;
Firefox下,只能使用getAttribute()获取自定义属性. 
解决方法:统一通过getAttribute()获取自定义属性.

* IE下,even对象有x,y属性,但是没有pageX,pageY属性; 
Firefox下,event对象有pageX,pageY属性,但是没有x,y属性.

* 解决方法:(条件注释)缺点是在IE浏览器下可能会增加额外的HTTP请求数。

* Chrome 中文界面下默认会将小于 12px 的文本强制按照 12px 显示, 
可通过加入 CSS 属性 -webkit-text-size-adjust: none; 解决.

超链接访问过后hover样式就不出现了 被点击访问过的超链接样式不在具有hover和active了解决方法是改变CSS属性的排列顺序:
L-V-H-A :  a:link {} a:visited {} a:hover {} a:active {}
html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?

* HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加。

* 绘画 canvas  
用于媒介回放的 video 和 audio 元素 
本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;
sessionStorage 的数据在浏览器关闭后自动删除

语意化更好的内容元素,比如 article、footer、header、nav、section 
表单控件,calendar、date、time、email、url、search  
新的技术webworker, websockt, Geolocation

* 移除的元素

纯表现的元素:basefont,big,center,font, s,strike,tt,u;

对可用性产生负面影响的元素:frame,frameset,noframes;

支持HTML5新标签:

* IE8/IE7/IE6支持通过document.createElement方法产生的标签,
  可以利用这一特性让这些浏览器支持HTML5新标签,

浏览器支持新标签后,还需要添加标签默认的样式:

* 当然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架
   <!--[if lt IE 9]> 
   <script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script> 
   <![endif]--> 
如何区分: DOCTYPE声明\新增的结构元素\功能元素
语义化的理解?

用正确的标签做正确的事情!
html语义化就是让页面的内容结构化,便于对浏览器、搜索引擎解析;
在没有样式CCS情况下也以一种文档格式显示,并且是容易阅读的。
搜索引擎的爬虫依赖于标记来确定上下文和各个关键字的权重,利于 SEO。
使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解。
HTML5的离线储存?

localStorage    长期存储数据,浏览器关闭后数据不丢失;
sessionStorage  数据在浏览器关闭后自动删除。
(写)描述一段语义的html代码吧。

(HTML5中新增加的很多标签(如:<article>、<nav>、<header>和<footer>等)
就是基于语义化设计原则)  
< div id="header"> 
< h1>标题< /h1> 
< h2>专注Web前端技术< /h2> 
< /div>
iframe有那些缺点?

*iframe会阻塞主页面的Onload事件;

*iframe和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载。
使用iframe之前需要考虑这两个缺点。如果需要使用iframe,最好是通过javascript
动态给iframe添加src属性值,这样可以可以绕开以上两个问题。
请描述一下 cookies,sessionStorage 和 localStorage 的区别?

cookie在浏览器和服务器间来回传递。 sessionStorage和localStorage不会
sessionStorage和localStorage的存储空间更大;
sessionStorage和localStorage有更多丰富易用的接口;
sessionStorage和localStorage各自独立的存储空间;