献给前端求职路上的你们(上)

10,662 阅读18分钟
原文链接: www.jianshu.com

在放大镜中寻找你

前言

我是一名前端开发,从2016年6月毕业到如今步入工作,期间也面试了一些公司,参考过一些面试文档,学习了一些面试宝典,掌握了一些面试、笔试技巧和经验,所以就总结了一些优质的前端面试题以及面试要点,初学者阅后也要用心钻研其中的原理,重要知识需要系统学习,透彻学习,才能形成自己的知识链,以不变应万变,万不可投机取巧,只求面试过关哦!

面试注意点

  1. 面试题目: 根据你的等级和职位变化,入门级到专家级:范围↑、深度↑、方向↑、新技术↑。
  2. 题目类型: 技术视野、项目细节、理论知识题,算法题,开放性题,案例题。
  3. 进行追问: 可以确保问到你开始不懂或面试官开始不懂为止,这样可以大大延展题目的区分度和深度,知道你的实际能力。因为这种关联知识是长时间的学习,绝对不是临时抱佛脚得来的。
  4. 言语态度:回答问题再棒,面试官(可能是你的直接领导面试),会考虑我要不要这个人做我的同事?做我的员工?所以态度很重要。(感觉更像是相亲)
  5. 硬知识才能:资深的工程师能把absolute和relative弄混,这样的人不要也罢,因为团队需要的你这个人具有可以依靠的才能(靠谱)。

前端开发面试知识点大纲

1、HTML&CSS

  • html:超级文本标记语言(HyperText Markup Language)
  • css:层叠样式表(Cascading Style Sheets)
    对Web标准的理解、浏览器内核差异、兼容性、hack、CSS基本功:布局、盒子模型、浮动和定位、选择器优先级及使用、HTML5、CSS3、移动端适应

2、JavaScript

  • ECMAScript标准规范,描述这门语言的实现细节和标准。
  • 基础部分
    数据类型、运算符、结构语句、面向对象、函数、正则表达式。
  • 应用部分
    window对象、document对象、继承、闭包、插件、作用域、跨域、原型链、模块化、自定义事件、内存泄漏、事件机制、异步装载回调、模板引擎、Nodejs、JSON、ajax等

3、jQuery·
对象的结构、jQuery的方法挂在哪里、插件制作、jQuery的常用方法、选择器、jQuery的事件用法

4、其他

HTTP、安全、正则、优化、重构、响应式、移动端、团队协作、后台相关、编辑器和自动化工具、新技术、前端自动化、可维护、SEO、UED、架构、职业生涯等

必备知识点

作为一名前端工程师,无论工作年头长短都应该必须掌握的知识点

  1. DOM结构 —— 两个节点之间可能存在哪些关系以及如何在节点之间任意移动。
  2. DOM操作 ——如何添加、移除、移动、复制、创建和查找节点等。
  3. 事件 —— 如何使用事件,以及IE和标准DOM事件模型之间存在的差别,以及常用的事件委托。
  4. XMLHttpRequest —— 这是什么、怎样完整地执行一次GET请求、怎样检测错误。
  5. 严格模式与混杂模式 —— 如何触发这两种模式,区分它们有何意义。
  6. 盒模型 —— 外边距、内边距和边框之间的关系,及IE8以下版本的浏览器中的盒模型
  7. 块级元素与行内元素 —— 怎么用CSS控制它们、以及如何合理的使用它们
  8. 浮动元素——怎么使用它们、它们有什么问题以及怎么解决这些问题。
  9. HTML与XHTML——二者有什么区别,你觉得应该使用哪一个并说出理由。
  10. JSON —— 作用、用途、设计结构。

备注
根据自己需要选择性阅读,面试题是对理论知识的总结,让自己学会应该如何表达。资料答案不够正确和全面,欢迎补充答案、题目;最好是现在网上没有的。格式不断修改更新中。

HTML

WEB标准以及W3C标准是什么?

标签闭合、标签小写、不乱嵌套、使用外链css和js、结构行为表现的分离。

xhtml和html有什么区别?
  • 一个是功能上的差别
    主要是XHTML可兼容各大浏览器、手机以及PDA,并且浏览器也能快速正确地编译网页。
  • 另外是书写习惯的差别。
    XHTML 元素必须被正确地嵌套,闭合,区分大小写,文档必须拥有根元素
Doctype作用? 严格模式与混杂模式如何区分?它们有何意义?
  • <!DOCTYPE> 声明位于文档中的最前面,处于 <html> 标签之前。告知浏览器的解析器, 用什么文档类型 规范来解析这个文档
  • 严格模式的排版和 JS 运作模式是 以该浏览器支持的最高标准运行。
  • 在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点无法工作。 DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。
行内元素有哪些?块级元素有哪些? 空(void)元素有那些?行内元素和块级元素有什么区别?
  • CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值, 比如div默认display属性值为“block”,成为“块级”元素; span默认display属性值为“inline”,是“行内”元素。
  • 行内元素有:a b span img input select strong(强调的语气)
  • 块级元素有:div ul ol li dl dt dd h1 h2 h3 h4…p
  • 知名的空元素:` <br> <hr> <img> <input> <link> <meta>
  • 鲜为人知的是:<area> <base> <col> <command> <embed> <keygen> <param> <source> <track> <wbr>
  • 行内元素不可以设置宽高,不独占一行;
  • 块级元素可以设置宽高,独占一行。
link 和@import 的区别是?
  • link属于XHTML标签,而@import是CSS提供的;
  • 页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载;
  • import只在IE5以上才能识别,而link是XHTML标签,无兼容问题;
  • link方式的样式的权重 高于@import的权重。
浏览器的内核分别是什么?
  • IE浏览器的内核Trident、Mozilla的Gecko、Chrome的Blink(WebKit的分支)、Opera内核原为Presto,现为Blink。
常见兼容性问题?
  • png24位的图片在iE6浏览器上出现背景,解决方案是做成PNG8。
  • 浏览器默认的margin和padding不同。解决方案是加一个全局的*{margin:0;padding:0;}来统一,,但是全局效率很低,一般是如下这样解决:
    body,ul,li,ol,dl,dt,dd,form,input,h1,h2,h3,h4,h5,h6,p{
    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 的子集,主要是关于图像,位置,存储,多任务、画布、强后台相关技术等功能的增加。他的新的定义为:一套新的javascriptAPI和若干小的对html结构的改动
  • 绘画 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框架
语义化的理解?
  • 用正确的标签做正确的事情!
  • 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各自独立的存储空间;
如何实现浏览器内多个标签页之间的通信? (阿里)

调用localstorge、cookies等本地存储方式

webSocket如何兼容低浏览器?(阿里)

Adobe Flash Socket 、 ActiveX HTMLFile (IE) 、 基于 multipart 编码发送 XHR 、 基于长轮询的 XHR

CSS

介绍一下CSS的盒子模型?

(1)有两种, IE 盒子模型、标准 W3C 盒子模型;IE的content部分包含了 border 和 pading;
(2)盒模型: 内容(content)、填充(padding)、边界(margin)、 边框(border).

CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算? CSS3新增伪类有那些?

1.id选择器( # myid)
2.类选择器(.myclassname)
3.标签选择器(div, h1, p)
4.相邻选择器(h1 + p)
5.子选择器(ul > li)
6.后代选择器(li a)
7.通配符选择器( * )
8.属性选择器(a[rel = “external”])
9.伪类选择器(a: hover, li: nth – child)

  • 可继承的样式: font-size font-family color ul li dl dd dt;
  • 不可继承的样式:border padding margin width height ;
    优先级为:
    !important > id > class > tag
    important 比 内联优先级高
  • 优先级就近原则,同权重情况下样式定义最近者为准;
  • 载入样式以最后载入的定位为准;
CSS3新增伪类举例
  • p:first-of-type 选择属于其父元素的首个 <p> 元素的每个 <p>元素。
  • p:last-of-type 选择属于其父元素的最后<p> 元素的每个 <p>元素。
  • p:only-of-type 选择属于其父元素唯一的<p> 元素的每个 <p> 元素。
  • p:only-child 选择属于其父元素的唯一子元素的每个 <p>元素。
  • p:nth-child(2) 选择属于其父元素的第二个子元素的每个 <p> 元素。
  • :enabled :disabled 控制表单控件的禁用状态。
  • :checked 单选框或复选框被选中。

    如何居中div?
    // 给div设置一个宽度,然后添加margin:0 auto属性
    div{
      width:200px;
      margin:0 auto;
    }
前端页面由哪三层构成,分别是什么?作用是什么?

结构层 Html 表示层 CSS 行为层 js

清除浮动的几种方式,各自的优缺点

1.使用空标签清除浮动clear:both(缺点,增加无意义的标签,让人感觉很不爽)
2.使用overflow:auto(使用zoom:1用于兼容IE,缺点:内部宽高超过父级div时,会出现滚动条)
3.是用afert伪元素清除浮动(IE8以上和非IE浏览器才支持,目前:大型网站都有使用,如:腾迅,网易,新浪等等)

如何居中一个浮动元素?

1.确定容器的宽高 宽500 高 300 的层
2.设置层的外边距

 .div { 
  Width:500px ; 
 height:300px;//高度可以不设
  Margin: -150px 0 0 -250px;
  position:relative;相对定位
  background-color:pink;//方便看效果
  left:50%;
  top:50%;
}
列出display的值,说明他们的作用。
  • block 象块类型元素一样显示。
  • none 缺省值。象行内元素类型一样显示。
  • inline-block 象行内元素一样显示,但其内容象块类型元素一样显示。
  • list-item 象块类型元素一样显示,并添加样式列表标记。
position的值, relative和absolute定位原点是?
  • *absolute:生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。
  • *fixed:生成绝对定位的元素,相对于浏览器窗口进行定位。
  • *relative:生成相对定位的元素,相对于其正常位置进行定位。
  • static 默认值。没有定位,元素出现在正常的流中
    • (忽略 top, bottom, left, right z-index 声明)。
    • inherit 规定从父元素继承 position 属性的值。
CSS3有哪些新特性?

CSS3实现圆角(border-radius:8px),阴影(box-shadow:10px),
对文字加特效(text-shadow、),线性渐变(gradient),旋转(transform)
transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);//旋转,缩放,定位,倾斜
增加了更多的CSS选择器 多背景 rgba

为什么要初始化CSS样式?
  • 因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异。
  • 当然,初始化样式会对SEO有一定的影响,但鱼和熊掌不可兼得,但力求影响最小的情况下初始化。
    最简单的初始化方法就是: {padding: 0; margin: 0;} (不建议)
    淘宝的样式初始化:
body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend, button, input, textarea, th, td { margin:0; padding:0; }
body, button, input, select, textarea { font:12px/1.5tahoma, arial, \5b8b\4f53; }
h1, h2, h3, h4, h5, h6{ font-size:100%; }
address, cite, dfn, em, var { font-style:normal; }
code, kbd, pre, samp { font-family:couriernew, courier, monospace; }
small{ font-size:12px; }
ul, ol { list-style:none; }
a { text-decoration:none; }
a:hover { text-decoration:underline; }
sup { vertical-align:text-top; }
sub{ vertical-align:text-bottom; }
legend { color:#000; }
fieldset, img { border:0; }
button, input, select, textarea { font-size:100%; }
table { border-collapse:collapse; border-spacing:0; }
absolute的containing block计算方式跟正常流有什么不同?
position跟display、margin collapse、overflow、float这些特性相互叠加后会怎么样?

他们之间优先级的关系

综上所述,1、可以把它看作是一个类似优先级的机制, "position:absolute" 和 "position:fixed" 优先级最高,有它存在的时候,浮动不起作用,'display' 的值也需要调整; 2、元素的 'float' 特性的值不是 "none" 的时候或者它是根元素的时候,调整 'display' 的值; 3、非根元素,并且非浮动元素,并且非绝对定位的元素,'display' 特性值同设置值。

这从另一个侧面说明了一个问题:浮动或绝对定位的元素,只能是块元素或表格。

对BFC规范的理解?

(W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关 系和相互作用。)

使用 CSS 预处理器吗?喜欢那个?

SASS、LESS

如果需要手动写动画,你认为最小时间间隔是多久,为什么?(阿里)

多数显示器默认频率是60Hz,即1秒刷新60次,所以理论上最小间隔为1/60*1000ms = 16.7ms

display:inline-block 什么时候会显示间隙?(携程)

移除空格、使用margin负值、使用font-size:0、letter-spacing、word-spacing

JavaScript

eval是做什么的?

它的功能是把对应的字符串解析成JS代码并运行; 应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)。

null,undefined 的区别?

目前,null和undefined基本是同义的,只有一些细微的差别。
null表示"没有对象",即该处不应该有值。典型用法是:
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。

Object.getPrototypeOf(Object.prototype)
// null

undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。

var i;
i // undefined

function f(x){console.log(x)}
f() // undefined

var  o = new Object();
o.p // undefined

var x = f();
x // undefined
写一个通用的事件侦听器函数
    // event(事件)工具集,来源:github.com/markyun
  markyun.Event = {
      // 页面加载完成后
      readyEvent : function(fn) {
          if (fn==null) {
              fn=document;
          }
          var oldonload = window.onload;
          if (typeof window.onload != 'function') {
              window.onload = fn;
          } else {
              window.onload = function() {
                  oldonload();
                  fn();
              };
          }
      },
      // 视能力分别使用dom0||dom2||IE方式 来绑定事件
      // 参数: 操作的元素,事件名称 ,事件处理程序
      addEvent : function(element, type, handler) {
          if (element.addEventListener) {
              //事件类型、需要执行的函数、是否捕捉
              element.addEventListener(type, handler, false);
          } else if (element.attachEvent) {
              element.attachEvent('on' + type, function() {
                  handler.call(element);
              });
          } else {
              element['on' + type] = handler;
          }
      },
      // 移除事件
      removeEvent : function(element, type, handler) {
          if (element.removeEnentListener) {
              element.removeEnentListener(type, handler, false);
          } else if (element.datachEvent) {
              element.detachEvent('on' + type, handler);
          } else {
              element['on' + type] = null;
          }
      }, 
      // 阻止事件 (主要是事件冒泡,因为IE不支持事件捕获)
      stopPropagation : function(ev) {
          if (ev.stopPropagation) {
              ev.stopPropagation();
          } else {
              ev.cancelBubble = true;
          }
      },
      // 取消事件的默认行为
      preventDefault : function(event) {
          if (event.preventDefault) {
              event.preventDefault();
          } else {
              event.returnValue = false;
          }
      },
      // 获取事件目标
      getTarget : function(event) {
          return event.target || event.srcElement;
      },
      // 获取event对象的引用,取到事件的所有信息,确保随时能使用event;
      getEvent : function(e) {
          var ev = e || window.event;
          if (!ev) {
              var c = this.getEvent.caller;
              while (c) {
                  ev = c.arguments[0];
                  if (ev && Event == ev.constructor) {
                      break;
                  }
                  c = c.caller;
              }
          }
          return ev;
      }
  };
Node.js的适用场景?

高并发、聊天、实时消息推送

介绍js的基本数据类型

number,string,boolean,object,undefined

Javascript如何实现继承?

通过原型和构造器

[“1″, “2”, “3”].map(parseInt) 答案是多少?

[1, NaN, NaN] 因为 parseInt 需要两个参数 (val, radix),其中 radix 表示解析时用的基数。map 传了 3 个 (element, index, array),对应的 radix 不合法导致解析失败。

注明:今天先更新到这里,有一些问题没有给出答案提示,大家可以先自行思考一下,明天会继续更面试要点,期待你的到来!真心希望这些知识点可以帮到有需要的人。

~END~

我是渲染的一抹寂静(关注我)
追求自由 独立 简单 努力做一个热爱生活 珍惜生命的人
白天是个哼次哼次敲代码的程序猿,晚上是读书,健身,享受生活的自由者。
如果你喜欢我的文字和内容,关注我,一起加油 一起进步 不定期更文,我等你来哦!