前端面试问题答案汇总--基础版

转载于https://github.com/poetries/FE-Interview-Questions,by poetriesjavascript

第一部分:基础篇

1、HTML、HTTP、web综合问题

1 前端须要注意哪些SEO

  • 合理的titledescriptionkeywords:搜索对着三项的权重逐个减少,title值强调重点便可,重要关键词出现不要超过2次,并且要靠前,不一样页面title要有所不一样;description把页面内容高度归纳,长度合适,不可过度堆砌关键词,不一样页面description有所不一样;keywords列举出重要关键词便可
  • 语义化的HTML代码,符合W3C规范:语义化代码让搜索引擎容易理解网页
  • 重要内容HTML代码放在最前:搜索引擎抓取HTML顺序是从上到下,有的搜索引擎对抓取长度有限制,保证重要内容必定会被抓取
  • 重要内容不要用js输出:爬虫不会执行js获取内容
  • 少用iframe:搜索引擎不会抓取iframe中的内容
  • 非装饰性图片必须加alt
  • 提升网站速度:网站速度是搜索引擎排序的一个重要指标

<img>titlealt有什么区别

  • 一般当鼠标滑动到元素上的时候显示
  • alt<img>的特有属性,是图片内容的等价描述,用于图片没法加载时显示、读屏器阅读图片。可提图片高可访问性,除了纯装饰图片外都必须设置有意义的值,搜索引擎会重点分析。

3 HTTP的几种请求方法用途

  • GET方法css

    • 发送一个请求来取得服务器上的某一资源
  • POST方法html

    • URL指定的资源提交数据或附加新的数据
  • PUT方法前端

    • POST方法很像,也是想服务器提交数据。可是,它们之间有不一样。PUT指定了资源在服务器上的位置,而POST没有
  • HEAD方法vue

    • 只请求页面的首部
  • DELETE方法html5

    • 删除服务器上的某资源
  • OPTIONS方法java

    • 它用于获取当前URL所支持的方法。若是请求成功,会有一个Allow的头包含相似“GET,POST”这样的信息
  • TRACE方法node

    • TRACE方法被用于激发一个远程的,应用层的请求消息回路
  • CONNECT方法react

    • 把请求链接转换到透明的TCP/IP通道

4 从浏览器地址栏输入url到显示页面的步骤

基础版本jquery

  • 浏览器根据请求的URL交给DNS域名解析,找到真实IP,向服务器发起请求;
  • 服务器交给后台处理完成后返回数据,浏览器接收文件(HTML、JS、CSS、图象等);
  • 浏览器对加载到的资源(HTML、JS、CSS等)进行语法解析,创建相应的内部数据结构(如HTMLDOM);
  • 载入解析到的资源文件,渲染页面,完成。

详细版

  1. 在浏览器地址栏输入URL
  2. 浏览器查看缓存,若是请求资源在缓存中而且新鲜,跳转到转码步骤
    1. 若是资源未缓存,发起新请求
    2. 若是已缓存,检验是否足够新鲜,足够新鲜直接提供给客户端,不然与服务器进行验证。
    3. 检验新鲜一般有两个HTTP头进行控制ExpiresCache-Control
      • HTTP1.0提供Expires,值为一个绝对时间表示缓存新鲜日期
      • HTTP1.1增长了Cache-Control: max-age=,值为以秒为单位的最大新鲜时间
  3. 浏览器解析URL获取协议,主机,端口,path
  4. 浏览器组装一个HTTP(GET)请求报文
  5. 浏览器获取主机ip地址,过程以下:
    1. 浏览器缓存
    2. 本机缓存
    3. hosts文件
    4. 路由器缓存
    5. ISP DNS缓存
    6. DNS递归查询(可能存在负载均衡致使每次IP不同)
  6. 打开一个socket与目标IP地址,端口创建TCP连接,三次握手以下:
    1. 客户端发送一个TCP的SYN=1,Seq=X的包到服务器端口
    2. 服务器发回SYN=1, ACK=X+1, Seq=Y的响应包
    3. 客户端发送ACK=Y+1, Seq=Z
  7. TCP连接创建后发送HTTP请求
  8. 服务器接受请求并解析,将请求转发到服务程序,如虚拟主机使用HTTP Host头部判断请求的服务程序
  9. 服务器检查HTTP请求头是否包含缓存验证信息若是验证缓存新鲜,返回304等对应状态码
  10. 处理程序读取完整请求并准备HTTP响应,可能须要查询数据库等操做
  11. 服务器将响应报文经过TCP链接发送回浏览器
  12. 浏览器接收HTTP响应,而后根据状况选择关闭TCP链接或者保留重用,关闭TCP链接的四次握手以下:
    1. 主动方发送Fin=1, Ack=Z, Seq= X报文
    2. 被动方发送ACK=X+1, Seq=Z报文
    3. 被动方发送Fin=1, ACK=X, Seq=Y报文
    4. 主动方发送ACK=Y, Seq=X报文
  13. 浏览器检查响应状态吗:是否为1XX,3XX, 4XX, 5XX,这些状况处理与2XX不一样
  14. 若是资源可缓存,进行缓存
  15. 对响应进行解码(例如gzip压缩)
  16. 根据资源类型决定如何处理(假设资源为HTML文档)
  17. 解析HTML文档,构件DOM树,下载资源,构造CSSOM树,执行js脚本,这些操做没有严格的前后顺序,如下分别解释
  18. 构建DOM树:
    1. Tokenizing:根据HTML规范将字符流解析为标记
    2. Lexing:词法分析将标记转换为对象并定义属性和规则
    3. DOM construction:根据HTML标记关系将对象组成DOM树
  19. 解析过程当中遇到图片、样式表、js文件,启动下载
  20. 构建CSSOM树:
    1. Tokenizing:字符流转换为标记流
    2. Node:根据标记建立节点
    3. CSSOM:节点建立CSSOM树
  21. 根据DOM树和CSSOM树构建渲染树:
    1. 从DOM树的根节点遍历全部可见节点,不可见节点包括:1)script,meta这样自己不可见的标签。2)被css隐藏的节点,如display: none
    2. 对每个可见节点,找到恰当的CSSOM规则并应用
    3. 发布可视节点的内容和计算样式
  22. js解析以下:
    1. 浏览器建立Document对象并解析HTML,将解析到的元素和文本节点添加到文档中,此时document.readystate为loading
    2. HTML解析器遇到没有async和defer的script时,将他们添加到文档中,而后执行行内或外部脚本。这些脚本会同步执行,而且在脚本下载和执行时解析器会暂停。这样就能够用document.write()把文本插入到输入流中。同步脚本常常简单定义函数和注册事件处理程序,他们能够遍历和操做script和他们以前的文档内容
    3. 当解析器遇到设置了async属性的script时,开始下载脚本并继续解析文档。脚本会在它下载完成后尽快执行,可是解析器不会停下来等它下载。异步脚本禁止使用document.write(),它们能够访问本身script和以前的文档元素
    4. 当文档完成解析,document.readState变成interactive
    5. 全部defer脚本会按照在文档出现的顺序执行,延迟脚本能访问完整文档树,禁止使用document.write()
    6. 浏览器在Document对象上触发DOMContentLoaded事件
    7. 此时文档彻底解析完成,浏览器可能还在等待如图片等内容加载,等这些内容完成载入而且全部异步脚本完成载入和执行,document.readState变为complete,window触发load事件
  23. 显示页面(HTML解析过程当中会逐步显示页面)

详细简版

  1. 从浏览器接收url到开启网络请求线程(这一部分能够展开浏览器的机制以及进程与线程之间的关系)

  2. 开启网络线程到发出一个完整的http请求(这一部分涉及到dns查询,tcp/ip请求,五层因特网协议栈等知识)

  3. 从服务器接收到请求到对应后台接收到请求(这一部分可能涉及到负载均衡,安全拦截以及后台内部的处理等等)

  4. 后台和前台的http交互(这一部分包括http头部、响应码、报文结构、cookie等知识,能够提下静态资源的cookie优化,以及编码解码,如gzip压缩等)

  5. 单独拎出来的缓存问题,http的缓存(这部分包括http缓存头部,etagcatch-control等)

  6. 浏览器接收到http数据包后的解析流程(解析html-词法分析而后解析成dom树、解析css生成css规则树、合并成render树,而后layoutpainting渲染、复合图层的合成、GPU绘制、外链资源的处理、loadeddomcontentloaded等)

  7. CSS的可视化格式模型(元素的渲染规则,如包含块,控制框,BFCIFC等概念)

  8. JS引擎解析过程(JS的解释阶段,预处理阶段,执行阶段生成执行上下文,VO,做用域链、回收机制等等)

  9. 其它(能够拓展不一样的知识模块,如跨域,web安全,hybrid模式等等内容)

5 如何进行网站性能优化

  • content方面

    • 减小HTTP请求:合并文件、CSS精灵、inline Image
    • 减小DNS查询:DNS缓存、将资源分布到恰当数量的主机名
    • 减小DOM元素数量
  • Server方面

    • 使用CDN
    • 配置ETag
    • 对组件使用Gzip压缩
  • Cookie方面

    • 减少cookie大小
  • css方面

    • 将样式表放到页面顶部
    • 不使用CSS表达式
    • 使用<link>不使用@import
  • Javascript方面

    • 将脚本放到页面底部
    • javascriptcss从外部引入
    • 压缩javascriptcss
    • 删除不须要的脚本
    • 减小DOM访问
  • 图片方面

    • 优化图片:根据实际颜色须要选择色深、压缩
    • 优化css精灵
    • 不要在HTML中拉伸图片

6 HTTP状态码及其含义

  • 1XX:信息状态码
    • 100 Continue 继续,通常在发送post请求时,已发送了http header以后服务端将返回此信息,表示确认,以后发送具体参数信息
  • 2XX:成功状态码
    • 200 OK 正常返回信息
    • 201 Created 请求成功而且服务器建立了新的资源
    • 202 Accepted 服务器已接受请求,但还没有处理
  • 3XX:重定向
    • 301 Moved Permanently 请求的网页已永久移动到新位置。
    • 302 Found 临时性重定向。
    • 303 See Other 临时性重定向,且老是使用 GET 请求新的 URI
    • 304 Not Modified 自从上次请求后,请求的网页未修改过。
  • 4XX:客户端错误
    • 400 Bad Request 服务器没法理解请求的格式,客户端不该当尝试再次使用相同的内容发起请求。
    • 401 Unauthorized 请求未受权。
    • 403 Forbidden 禁止访问。
    • 404 Not Found 找不到如何与 URI 相匹配的资源。
  • 5XX: 服务器错误
    • 500 Internal Server Error 最多见的服务器端错误。
    • 503 Service Unavailable 服务器端暂时没法处理请求(多是过载或维护)。

7 语义化的理解

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

8 介绍一下你对浏览器内核的理解?

  • 主要分红两部分:渲染引擎(layout engineerRendering Engine)和JS引擎

  • 渲染引擎:负责取得网页的内容(HTMLXML、图像等等)、整理讯息(例如加入CSS等),以及计算网页的显示方式,而后会输出至显示器或打印机。浏览器的内核的不一样对于网页的语法解释会有不一样,因此渲染的效果也不相同。全部网页浏览器、电子邮件客户端以及其它须要编辑、显示网络内容的应用程序都须要内核

  • JS引擎则:解析和执行javascript来实现网页的动态效果

  • 最开始渲染引擎和JS引擎并无区分的很明确,后来JS引擎愈来愈独立,内核就倾向于只指渲染引擎

9 html5有哪些新特性、移除了那些元素?

  • HTML5 如今已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增长

    • 绘画 canvas
    • 用于媒介回放的 video 和 audio 元素
    • 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失
    • sessionStorage 的数据在浏览器关闭后自动删除
    • 语意化更好的内容元素,好比articlefooterheadernavsection
    • 表单控件,calendardatetimeemailurlsearch
    • 新的技术webworkerwebsocketGeolocation
  • 移除的元素:

    • 纯表现的元素:basefontbigcenterfontsstrike,tt,u`
    • 对可用性产生负面影响的元素:frameframesetnoframes
  • 支持HTML5新标签:

    • IE8/IE7/IE6支持经过document.createElement方法产生的标签
    • 能够利用这一特性让这些浏览器支持HTML5新标签
    • 浏览器支持新标签后,还须要添加标签默认的样式
  • 固然也能够直接使用成熟的框架、好比html5shim

10 HTML5的离线储存怎么使用,工做原理能不能解释一下?

  • 在用户没有与因特网链接时,能够正常访问站点或应用,在用户与因特网链接时,更新用户机器上的缓存文件

  • 原理:HTML5的离线存储是基于一个新建的.appcache文件的缓存机制(不是存储技术),经过这个文件上的解析清单离线存储资源,这些资源就会像cookie同样被存储了下来。以后当网络在处于离线状态下时,浏览器会经过被离线存储的数据进行页面展现

  • 如何使用:

    • 页面头部像下面同样加入一个manifest的属性;
    • cache.manifest文件的编写离线存储的资源
    • 在离线状态时,操做window.applicationCache进行需求实现
CACHE MANIFEST
#v0.11
CACHE:
js/app.js
css/style.css
NETWORK:
resourse/logo.png
FALLBACK:
/ /offline.html

 

11 浏览器是怎么对HTML5的离线储存资源进行管理和加载的呢

  • 在线的状况下,浏览器发现html头部有manifest属性,它会请求manifest文件,若是是第一次访问app,那么浏览器就会根据manifest文件的内容下载相应的资源而且进行离线存储。若是已经访问过app而且资源已经离线存储了,那么浏览器就会使用离线的资源加载页面,而后浏览器会对比新的manifest文件与旧的manifest文件,若是文件没有发生改变,就不作任何操做,若是文件改变了,那么就会从新下载文件中的资源并进行离线存储。

  • 离线的状况下,浏览器就直接使用离线存储的资源。

12 请描述一下 cookiessessionStorage 和 localStorage 的区别?

  • cookie是网站为了标示用户身份而储存在用户本地终端(Client Side)上的数据(一般通过加密)

  • cookie数据始终在同源的http请求中携带(即便不须要),记会在浏览器和服务器间来回传递

  • sessionStoragelocalStorage不会自动把数据发给服务器,仅在本地保存

  • 存储大小:

    • cookie数据大小不能超过4k
    • sessionStoragelocalStorage虽然也有存储大小的限制,但比cookie大得多,能够达到5M或更大
  • 有期时间:

    • localStorage 存储持久数据,浏览器关闭后数据不丢失除非主动删除数据
    • sessionStorage 数据在当前浏览器窗口关闭后自动删除
    • cookie 设置的cookie过时时间以前一直有效,即便窗口或浏览器关闭

13 iframe有那些缺点?

  • iframe会阻塞主页面的Onload事件
  • 搜索引擎的检索程序没法解读这种页面,不利于SEO
  • iframe和主页面共享链接池,而浏览器对相同域的链接有限制,因此会影响页面的并行加载
  • 使用iframe以前须要考虑这两个缺点。若是须要使用iframe,最好是经过javascript动态给iframe添加src属性值,这样能够绕开以上两个问题

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

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

15 xhtml和html有什么区别?

  • 一个是功能上的差异

    • 主要是XHTML可兼容各大浏览器、手机以及PDA,而且浏览器也能快速正确地编译网页
  • 另外是书写习惯的差异

    • XHTML 元素必须被正确地嵌套,闭合,区分大小写,文档必须拥有根元素

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

  • 页面被加载的时,link会同时被加载,而@imort页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载
    import只在IE5以上才能识别,而linkXHTML标签,无兼容问题
    link方式的样式的权重 高于@import的权重
  • <!DOCTYPE> 声明位于文档中的最前面,处于 <html> 标签以前。告知浏览器的解析器, 用什么文档类型 规范来解析这个文档
  • 严格模式的排版和 JS 运做模式是 以该浏览器支持的最高标准运行
  • 在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点没法工做。 DOCTYPE不存在或格式不正确会致使文档以混杂模式呈现

17 行内元素有哪些?块级元素有哪些? 空(void)元素有那些?行内元素和块级元素有什么区别?

  • 行内元素有: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>
  • 行内元素不能够设置宽高,不独占一行
  • 块级元素能够设置宽高,独占一行

18 HTML全局属性(global attribute)有哪些

  • class:为元素设置类标识
  • data-*: 为元素增长自定义属性
  • draggable: 设置元素是否可拖拽
  • id: 元素id,文档内惟一
  • lang: 元素内容的的语言
  • style: 行内css样式
  • title: 元素相关的建议信息

19 Canvas和SVG有什么区别?

  • svg绘制出来的每个图形的元素都是独立的DOM节点,可以方便的绑定事件或用来修改。canvas输出的是一整幅画布
  • svg输出的图形是矢量图形,后期能够修改参数来自由放大缩小,不会是真和锯齿。而canvas输出标量画布,就像一张图片同样,放大会失真或者锯齿

20 HTML5 为何只须要写

  • HTML5 不基于 SGML,所以不须要对DTD进行引用,可是须要doctype来规范浏览器的行为
  • HTML4.01基于SGML,因此须要对DTD进行引用,才能告知浏览器文档所使用的文档类型

21 如何在页面上实现一个圆形的可点击区域?

  • svg
  • border-radius
  • js实现 须要求一个点在不在圆上简单算法、获取鼠标坐标等等

22 网页验证码是干吗的,是为了解决什么安全问题

  • 区分用户是计算机仍是人的公共全自动程序。能够防止恶意破解密码、刷票、论坛灌水
  • 有效防止黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录尝试

23 viewport

<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
    // width    设置viewport宽度,为一个正整数,或字符串‘device-width’
    // device-width  设备宽度
    // height   设置viewport高度,通常设置了宽度,会自动解析出高度,能够不用设置
    // initial-scale    默认缩放比例(初始缩放比例),为一个数字,能够带小数
    // minimum-scale    容许用户最小缩放比例,为一个数字,能够带小数
    // maximum-scale    容许用户最大缩放比例,为一个数字,能够带小数
    // user-scalable    是否容许手动缩放
  • 延伸提问
    • 怎样处理 移动端 1px 被 渲染成 2px问题

局部处理

  • mate标签中的 viewport属性 ,initial-scale 设置为 1
  • rem按照设计稿标准走,外加利用transfrome 的scale(0.5) 缩小一倍便可;

全局处理

  • mate标签中的 viewport属性 ,initial-scale 设置为 0.5
  • rem 按照设计稿标准走便可

24 渲染优化

  • 禁止使用iframe(阻塞父文档onload事件)

    • iframe会阻塞主页面的Onload事件
    • 搜索引擎的检索程序没法解读这种页面,不利于SEO
    • iframe和主页面共享链接池,而浏览器对相同域的链接有限制,因此会影响页面的并行加载
    • 使用iframe以前须要考虑这两个缺点。若是须要使用iframe,最好是经过javascript
    • 动态给iframe添加src属性值,这样能够绕开以上两个问题
  • 禁止使用gif图片实现loading效果(下降CPU消耗,提高渲染性能)

  • 使用CSS3代码代替JS动画(尽量避免重绘重排以及回流)

  • 对于一些小图标,能够使用base64位编码,以减小网络请求。但不建议大图使用,比较耗费CPU

    • 小图标优点在于
      • 减小HTTP请求
      • 避免文件跨域
      • 修改及时生效
  • 页面头部的<style></style> <script</script> 会阻塞页面;(由于 Renderer进程中 JS线程和渲染线程是互斥的)

  • 页面中空的 href 和 src 会阻塞页面其余资源的加载 (阻塞下载进程)

  • 网页GzipCDN托管,data缓存 ,图片服务器

  • 前端模板 JS+数据,减小因为HTML标签致使的带宽浪费,前端用变量保存AJAX请求结果,每次操做本地变量,不用请求,减小请求次数

  • innerHTML代替DOM操做,减小DOM操做次数,优化javascript性能

  • 当须要设置的样式不少时设置className而不是直接操做style

  • 少用全局变量、缓存DOM节点查找的结果。减小IO读取操做

  • 图片预加载,将样式表放在顶部,将脚本放在底部 加上时间戳

  • 对普通的网站有一个统一的思路,就是尽可能向前端优化、减小数据库操做、减小磁盘IO

25 meta viewport相关

<!DOCTYPE html>  <!--H5标准声明,使用 HTML5 doctype,不区分大小写-->
<head lang=”en”> <!--标准的 lang 属性写法-->
<meta charset=’utf-8′>    <!--声明文档使用的字符编码-->
<meta http-equiv=”X-UA-Compatible” content=”IE=edge,chrome=1″/>   <!--优先使用 IE 最新版本和 Chrome-->
<meta name=”description” content=”不超过150个字符”/>       <!--页面描述-->
<meta name=”keywords” content=””/>     <!-- 页面关键词-->
<meta name=”author” content=”name, email@gmail.com”/>    <!--网页做者-->
<meta name=”robots” content=”index,follow”/>      <!--搜索引擎抓取-->
<meta name=”viewport” content=”initial-scale=1, maximum-scale=3, minimum-scale=1, user-scalable=no”> <!--为移动设备添加 viewport-->
<meta name=”apple-mobile-web-app-title” content=”标题”> <!--iOS 设备 begin-->
<meta name=”apple-mobile-web-app-capable” content=”yes”/>  <!--添加到主屏后的标题(iOS 6 新增)
是否启用 WebApp 全屏模式,删除苹果默认的工具栏和菜单栏-->
<meta name=”apple-itunes-app” content=”app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL”>
<!--添加智能 App 广告条 Smart App Banner(iOS 6+ Safari)-->
<meta name=”apple-mobile-web-app-status-bar-style” content=”black”/>
<meta name=”format-detection” content=”telphone=no, email=no”/>  <!--设置苹果工具栏颜色-->
<meta name=”renderer” content=”webkit”> <!-- 启用360浏览器的极速模式(webkit)-->
<meta http-equiv=”X-UA-Compatible” content=”IE=edge”>     <!--避免IE使用兼容模式-->
<meta http-equiv=”Cache-Control” content=”no-siteapp” />    <!--不让百度转码-->
<meta name=”HandheldFriendly” content=”true”>     <!--针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,好比黑莓-->
<meta name=”MobileOptimized” content=”320″>   <!--微软的老式浏览器-->
<meta name=”screen-orientation” content=”portrait”>   <!--uc强制竖屏-->
<meta name=”x5-orientation” content=”portrait”>    <!--QQ强制竖屏-->
<meta name=”full-screen” content=”yes”>              <!--UC强制全屏-->
<meta name=”x5-fullscreen” content=”true”>       <!--QQ强制全屏-->
<meta name=”browsermode” content=”application”>   <!--UC应用模式-->
<meta name=”x5-page-mode” content=”app”>   <!-- QQ应用模式-->
<meta name=”msapplication-tap-highlight” content=”no”>    <!--windows phone 点击无高光
设置页面不缓存-->
<meta http-equiv=”pragma” content=”no-cache”>
<meta http-equiv=”cache-control” content=”no-cache”>
<meta http-equiv=”expires” content=”0″>

 

26 你作的页面在哪些流览器测试过?这些浏览器的内核分别是什么?

  • IEtrident内核
  • Firefoxgecko内核
  • Safari:webkit内核
  • Opera:之前是presto内核,Opera现已改用Google - ChromeBlink内核
  • Chrome:Blink(基于webkit,Google与Opera Software共同开发)

27 div+css的布局较table布局有什么优势?

  • 改版的时候更方便 只要改css文件。
  • 页面加载速度更快、结构化清晰、页面显示简洁。
  • 表现与结构相分离。
  • 易于优化(seo)搜索引擎更友好,排名更容易靠前。

28 a:img的alt与title有何异同?b:strong与em的异同?

  • alt(alt text):为不能显示图像、窗体或applets的用户代理(UA),alt属性用来指定替换文字。替换文字的语言由lang属性指定。(在IE浏览器下会在没有title时把alt当成 tool tip显示)

  • title(tool tip):该属性为设置该属性的元素提供建议性的信息

  • strong:粗体强调标签,强调,表示内容的重要性

  • em:斜体强调标签,更强烈强调,表示内容的强调点

29 你能描述一下渐进加强和优雅降级之间的不一样吗

  • 渐进加强:针对低版本浏览器进行构建页面,保证最基本的功能,而后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
  • 优雅降级:一开始就构建完整的功能,而后再针对低版本浏览器进行兼容。

区别:优雅降级是从复杂的现状开始,并试图减小用户体验的供给,而渐进加强则是从一个很是基础的,可以起做用的版本开始,并不断扩充,以适应将来环境的须要。降级(功能衰减)意味着往回看;而渐进加强则意味着朝前看,同时保证其根基处于安全地带

30 为何利用多个域名来存储网站资源会更有效?

  • CDN缓存更方便
  • 突破浏览器并发限制
  • 节约cookie带宽
  • 节约主域名的链接数,优化页面响应速度
  • 防止没必要要的安全问题

31 简述一下src与href的区别

  • src用于替换当前元素,href用于在当前文档和引用资源之间确立联系。
  • srcsource的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求src资源时会将其指向的资源下载并应用到文档内,例如js脚本,img图片和frame等元素

<script src ="js.js"></script> 当浏览器解析到该元素时,会暂停其余资源的下载和处理,直到将该资源加载、编译、执行完毕,图片和框架等元素也如此,相似于将所指向资源嵌入当前标签内。这也是为何将js脚本放在底部而不是头部

  • hrefHypertext Reference的缩写,指向网络资源所在位置,创建和当前元素(锚点)或当前文档(连接)之间的连接,若是咱们在文档中添加
  • <link href="common.css" rel="stylesheet"/>那么浏览器会识别该文档为css文件,就会并行下载资源而且不会中止对当前文档的处理。这也是为何建议使用link方式来加载css,而不是使用@import方式

32 知道的网页制做会用到的图片格式有哪些?

  • png-8png-24jpeggifsvg

可是上面的那些都不是面试官想要的最后答案。面试官但愿听到是Webp,Apng。(是否有关注新技术,新鲜事物)

  • Webp:WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式。图片压缩体积大约只有JPEG2/3,并能节省大量的服务器带宽资源和数据空间。Facebook Ebay等知名网站已经开始测试并使用WebP格式。
  • 在质量相同的状况下,WebP格式图像的体积要比JPEG格式图像小40%
  • Apng:全称是“Animated Portable Network Graphics”, 是PNG的位图动画扩展,能够实现png格式的动态图片效果。04年诞生,但一直得不到各大浏览器厂商的支持,直到日前获得 iOS safari 8的支持,有望代替GIF成为下一代动态图标准

33 在css/js代码上线以后开发人员常常会优化性能,从用户刷新网页开始,一次js请求通常状况下有哪些地方会有缓存处理?

dns缓存,cdn缓存,浏览器缓存,服务器缓存

33 一个页面上有大量的图片(大型电商网站),加载很慢,你有哪些方法优化这些图片的加载,给用户更好的体验。

  • 图片懒加载,在页面上的未可视区域能够添加一个滚动条事件,判断图片位置与浏览器顶端的距离与页面的距离,若是前者小于后者,优先加载。
  • 若是为幻灯片、相册等,能够使用图片预加载技术,将当前展现图片的前一张和后一张优先下载。
  • 若是图片为css图片,能够使用CSSspriteSVGspriteIconfontBase64等技术。
  • 若是图片过大,能够使用特殊编码的图片,加载时会先加载一张压缩的特别厉害的缩略图,以提升用户体验。
  • 若是图片展现区域小于图片的真实大小,则因在服务器端根据业务须要先行进行图片压缩,图片压缩后大小与展现一致。

34 常见排序算法的时间复杂度,空间复杂度

35 web开发中会话跟踪的方法有哪些

  • cookie
  • session
  • url重写
  • 隐藏input
  • ip地址

36 HTTP request报文结构是怎样的

  1. 首行是Request-Line包括:请求方法,请求URI,协议版本,CRLF
  2. 首行以后是若干行请求头,包括general-header,request-header或者entity-header,每一个一行以CRLF结束
  3. 请求头和消息实体之间有一个CRLF分隔
  4. 根据实际请求须要可能包含一个消息实体
    一个请求报文例子以下:
GET /Protocols/rfc2616/rfc2616-sec5.html HTTP/1.1
Host: www.w3.org
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Referer: https://www.google.com.hk/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Cookie: authorstyle=yes
If-None-Match: "2cc8-3e3073913b100"
If-Modified-Since: Wed, 01 Sep 2004 13:24:52 GMT

name=qiu&age=25

 

37 HTTP response报文结构是怎样的

  • 首行是状态行包括:HTTP版本,状态码,状态描述,后面跟一个CRLF
  • 首行以后是若干行响应头,包括:通用头部,响应头部,实体头部
  • 响应头部和响应实体之间用一个CRLF空行分隔
  • 最后是一个可能的消息实体
    响应报文例子以下:
HTTP/1.1 200 OK
Date: Tue, 08 Jul 2014 05:28:43 GMT
Server: Apache/2
Last-Modified: Wed, 01 Sep 2004 13:24:52 GMT
ETag: "40d7-3e3073913b100"
Accept-Ranges: bytes
Content-Length: 16599
Cache-Control: max-age=21600
Expires: Tue, 08 Jul 2014 11:28:43 GMT
P3P: policyref="http://www.w3.org/2001/05/P3P/p3p.xml"
Content-Type: text/html; charset=iso-8859-1

{"name": "qiu", "age": 25}

 

2、CSS部分

1 css sprite是什么,有什么优缺点

  • 概念:将多个小图片拼接到一个图片中。经过background-position和元素尺寸调节须要显示的背景图案。

  • 优势:

    • 减小HTTP请求数,极大地提升页面加载速度
    • 增长图片信息重复度,提升压缩比,减小图片大小
    • 更换风格方便,只需在一张或几张图片上修改颜色或样式便可实现
  • 缺点:

    • 图片合并麻烦
    • 维护麻烦,修改一个图片可能须要重新布局整个图片,样式

display: none;visibility: hidden;的区别

  • 联系:它们都能让元素不可见

  • 区别:

    • display:none;会让元素彻底从渲染树中消失,渲染的时候不占据任何空间;visibility: hidden;不会让元素从渲染树消失,渲染师元素继续占据空间,只是内容不可见
    • display: none;是非继承属性,子孙节点消失因为元素从渲染树消失形成,经过修改子孙节点属性没法显示;visibility: hidden;是继承属性,子孙节点消失因为继承了hidden,经过设置visibility: visible;可让子孙节点显式
    • 修改常规流中元素的display一般会形成文档重排。修改visibility属性只会形成本元素的重绘。
    • 读屏器不会读取display: none;元素内容;会读取visibility: hidden;元素内容

link@import的区别

  1. linkHTML方式, @import是CSS方式
  2. link最大限度支持并行下载,@import过多嵌套致使串行下载,出现FOUC
  3. link能够经过rel="alternate stylesheet"指定候选样式
  4. 浏览器对link支持早于@import,能够使用@import对老浏览器隐藏样式
  5. @import必须在样式规则以前,能够在css文件中引用其余文件
  6. 整体来讲:link优于@import

4 什么是FOUC?如何避免

  • Flash Of Unstyled Content:用户定义样式表加载以前浏览器使用默认样式显示文档,用户样式加载渲染以后再重新显示文档,形成页面闪烁。
  • 解决方法:把样式表放到文档的head

5 如何建立块级格式化上下文(block formatting context),BFC有什么用

  • 建立规则:

    • 根元素
    • 浮动元素(float不是none
    • 绝对定位元素(position取值为absolutefixed
    • display取值为inline-block,table-celltable-caption,flexinline-flex之一的元素
    • overflow不是visible的元素
  • 做用:

    • 能够包含浮动元素
    • 不被浮动元素覆盖
    • 阻止父子元素的margin折叠

6 display,float,position的关系

  • 若是displaynone,那么positionfloat都不起做用,这种状况下元素不产生框
  • 不然,若是position值为absolute或者fixed,框就是绝对定位的,float的计算值为nonedisplay根据下面的表格进行调整。
  • 不然,若是float不是none,框是浮动的,display根据下表进行调整
  • 不然,若是元素是根元素,display根据下表进行调整
  • 其余状况下display的值为指定值
  • 总结起来:绝对定位、浮动、根元素都须要调整display

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

  • 父级div定义height
  • 结尾处加空div标签clear:both
  • 父级div定义伪类:afterzoom
  • 父级div定义overflow:hidden
  • 父级div也浮动,须要定义宽度
  • 结尾处加br标签clear:both
  • 比较好的是第3种方式,好多网站都这么用

8 为何要初始化CSS样式?

  • 由于浏览器的兼容问题,不一样浏览器对有些标签的默认值是不一样的,若是没对CSS初始化每每会出现浏览器之间的页面显示差别。
  • 固然,初始化样式会对SEO有必定的影响,但鱼和熊掌不可兼得,但力求影响最小的状况下初始化

9 css3有哪些新特性

  • 新增各类css选择器
  • 圆角 border-radius
  • 多列布局
  • 阴影和反射
  • 文字特效text-shadow
  • 线性渐变
  • 旋转transform

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> 元素。
  • :after 在元素以前添加内容,也能够用来作清除浮动。
  • :before 在元素以后添加内容
  • :enabled
  • :disabled 控制表单控件的禁用状态。
  • :checked 单选框或复选框被选中

10 display有哪些值?说明他们的做用

  • block 象块类型元素同样显示。
  • none 缺省值。象行内元素类型同样显示。
  • inline-block 象行内元素同样显示,但其内容象块类型元素同样显示。
  • list-item 象块类型元素同样显示,并添加样式列表标记。
  • table 此元素会做为块级表格来显示
  • inherit 规定应该从父元素继承 display 属性的值

11 介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不一样的?

  • 有两种, IE盒子模型、W3C盒子模型;
  • 盒模型: 内容(content)、填充(padding)、边界(margin)、 边框(border);
  • 区 别: IE的content部分把 border 和 padding计算了进去;

12 CSS优先级算法如何计算?

  • 优先级就近原则,同权重状况下样式定义最近者为准
  • 载入样式以最后载入的定位为准
  • 优先级为: !important > id > class > tag important 比 内联优先级高

13 对BFC规范的理解?

  • 它决定了元素如何对其内容进行定位,以及与其余元素的关系和相互做用

14 谈谈浮动和清除浮动

  • 浮动的框能够向左或向右移动,直到他的外边缘碰到包含框或另外一个浮动框的边框为止。因为浮动框不在文档的普通流中,因此文档的普通流的块框表现得就像浮动框不存在同样。浮动的块框会漂浮在文档普通流的块框上

15 position的值, relative和absolute定位原点是

  • absolute:生成绝对定位的元素,相对于 static 定位之外的第一个父元素进行定位
  • fixed:生成绝对定位的元素,相对于浏览器窗口进行定位
  • relative:生成相对定位的元素,相对于其正常位置进行定位
  • static 默认值。没有定位,元素出如今正常的流中
  • inherit 规定从父元素继承 position 属性的值

16 display:inline-block 何时不会显示间隙?(携程)

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

17 PNG,GIF,JPG的区别及如何选

  • GIF

    • 8位像素,256
    • 无损压缩
    • 支持简单动画
    • 支持boolean透明
    • 适合简单动画
  • JPEG

    • 颜色限于256
    • 有损压缩
    • 可控制压缩质量
    • 不支持透明
    • 适合照片
  • PNG

    • PNG8truecolor PNG
    • PNG8相似GIF颜色上限为256,文件小,支持alpha透明度,无动画
    • 适合图标、背景、按钮

18 行内元素float:left后是否变为块级元素?

  • 浮动后,行内元素不会成为块状元素,可是能够设置宽高。行内元素要想变成块状元素,占一行,直接设置display:block;。但若是元素设置了浮动后再设置display:block;那就不会占一行。

19 在网页中的应该使用奇数仍是偶数的字体?为何呢?

  • 偶数字号相对更容易和 web 设计的其余部分构成比例关系

20 ::before 和 :after中双冒号和单冒号 有什么区别?解释一下这2个伪元素的做用

  • 单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪元素
  • 用于区分伪类和伪元素

21 若是须要手动写动画,你认为最小时间间隔是多久,为何?(阿里)

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

22 CSS合并方法

  • 避免使用@import引入多个css文件,能够使用CSS工具将CSS合并为一个CSS文件,例如使用Sass\Compass

23 CSS不一样选择器的权重(CSS层叠的规则)

  • !important规则最重要,大于其它规则
  • 行内样式规则,加1000
  • 对于选择器中给定的各个ID属性值,加100
  • 对于选择器中给定的各个类属性、属性选择器或者伪类选择器,加10
  • 对于选择其中给定的各个元素标签选择器,加1
  • 若是权值同样,则按照样式规则的前后顺序来应用,顺序靠后的覆盖靠前的规则

24 列出你所知道能够改变页面布局的属性

  • positiondisplayfloatwidthheight、marginpaddingtopleftright、`

25 CSS在性能优化方面的实践

  • css压缩与合并、Gzip压缩
  • css文件放在head里、不要用@import
  • 尽可能用缩写、避免用滤镜、合理使用选择器

26 CSS3动画(简单动画的实现,如旋转等)

  • 依靠CSS3中提出的三个属性:transitiontransformanimation
  • transition:定义了元素在变化过程当中是怎么样的,包含transition-propertytransition-durationtransition-timing-functiontransition-delay
  • transform:定义元素的变化结果,包含rotatescaleskewtranslate
  • animation:动画定义了动做的每一帧(@keyframes)有什么效果,包括animation-nameanimation-durationanimation-timing-functionanimation-delayanimation-iteration-countanimation-direction

27 base64的原理及优缺点

  • 优势能够加密,减小了http请求
  • 缺点是须要消耗CPU进行编解码

28 几种常见的CSS布局

流体布局

.left {
        float: left;
        width: 100px;
        height: 200px;
        background: red;
    }
    .right {
        float: right;
        width: 200px;
        height: 200px;
        background: blue;
    }
    .main {
        margin-left: 120px;
        margin-right: 220px;
        height: 200px;
        background: green;
    }
<div class="container">
    <div class="left"></div>
    <div class="right"></div>
    <div class="main"></div>
</div>

 

圣杯布局

.container {
            margin-left: 120px;
            margin-right: 220px;
        }
        .main {
            float: left;
            width: 100%;
            height:300px;
            background: green;
        }
        .left {
            position: relative;
            left: -120px;
            float: left;
            height: 300px;
            width: 100px;
            margin-left: -100%;
            background: red;
        }
        .right {
            position: relative;
            right: -220px;
            float: right;
            height: 300px;
            width: 200px;
            margin-left: -200px;
            background: blue;
        }
<div class="container">
    <div class="main"></div>
    <div class="left"></div>
    <div class="right"></div>
</div>

 

双飞翼布局

.content {
            float: left;
            width: 100%;
        }
        .main {
            height: 200px;
            margin-left: 110px;
            margin-right: 220px;
            background: green;
        }
        .main::after {
            content: '';
            display: block;
            font-size:0;
            height: 0;
            zoom: 1;
            clear: both;
        }
        .left {
            float:left;
            height: 200px;
            width: 100px;
            margin-left: -100%;
            background: red;
        }
        .right {
            float: right;
            height: 200px;
            width: 200px;
            margin-left: -200px;
            background: blue;
        }
<div class="content">
    <div class="main"></div>
</div>
<div class="left"></div>
<div class="right"></div>

 

29 stylus/sass/less区别

  • 均具备“变量”、“混合”、“嵌套”、“继承”、“颜色混合”五大基本特性
  • ScssLESS语法较为严谨,LESS要求必定要使用大括号“{}”,ScssStylus能够经过缩进表示层次与嵌套关系
  • Scss无全局变量的概念,LESSStylus有相似于其它语言的做用域概念
  • Sass是基于Ruby语言的,而LESSStylus能够基于NodeJS NPM下载相应库后进行编译;

30 postcss的做用

  • 能够直观的理解为:它就是一个平台。为何说它是一个平台呢?由于咱们直接用它,感受不能干什么事情,可是若是让一些插件在它上面跑,那么将会很强大
  • PostCSS 提供了一个解析器,它可以将 CSS 解析成抽象语法树
  • 经过在 PostCSS 这个平台上,咱们可以开发一些插件,来处理咱们的CSS,好比热门的:autoprefixer
  • postcss能够对sass处理事后的css再处理 最多见的就是autoprefixer

31 css样式(选择器)的优先级

  • 计算权重肯定
  • !important
  • 内联样式
  • 后写的优先级高

32 自定义字体的使用场景

  • 宣传/品牌/banner等固定文案
  • 字体图标

33 如何美化CheckBox

  • label(for) 和id
  • 隐藏原生的 input
  • :checked + label

34 伪类和伪元素的区别

  • 伪类表状态
  • 伪元素是真的有元素
  • 前者单冒号,后者双冒号

35 base64的使用

  • 用于减小 HTTP 请求
  • 适用于小图片
  • base64的体积约为原图的4/3

36 自适应布局

思路:

  • 左侧浮动或者绝对定位,而后右侧margin撑开
  • 使用div包含,而后靠负margin造成bfc
  • 使用flex

37 请用Css写一个简单的幻灯片效果页面

知道是要用css3。使用animation动画实现一个简单的幻灯片效果

/**css**/
.ani{
  width:480px;
  height:320px;
  margin:50px auto;
  overflow: hidden;
  box-shadow:0 0 5px rgba(0,0,0,1);
  background-size: cover;
  background-position: center;
  -webkit-animation-name: "loops";
  -webkit-animation-duration: 20s;
  -webkit-animation-iteration-count: infinite;
}
@-webkit-keyframes "loops" {
    0% {
        background:url(http://d.hiphotos.baidu.com/image/w%3D400/sign=c01e6adca964034f0fcdc3069fc27980/e824b899a9014c08e5e38ca4087b02087af4f4d3.jpg) no-repeat;             
    }
    25% {
        background:url(http://b.hiphotos.baidu.com/image/w%3D400/sign=edee1572e9f81a4c2632edc9e72b6029/30adcbef76094b364d72bceba1cc7cd98c109dd0.jpg) no-repeat;
    }
    50% {
        background:url(http://b.hiphotos.baidu.com/image/w%3D400/sign=937dace2552c11dfded1be2353266255/d8f9d72a6059252d258e7605369b033b5bb5b912.jpg) no-repeat;
    }
    75% {
        background:url(http://g.hiphotos.baidu.com/image/w%3D400/sign=7d37500b8544ebf86d71653fe9f9d736/0df431adcbef76095d61f0972cdda3cc7cd99e4b.jpg) no-repeat;
    }
    100% {
        background:url(http://c.hiphotos.baidu.com/image/w%3D400/sign=cfb239ceb0fb43161a1f7b7a10a54642/3b87e950352ac65ce2e73f76f9f2b21192138ad1.jpg) no-repeat;
    }
}

 

38 什么是外边距重叠?重叠的结果是什么?

外边距重叠就是margin-collapse

  • 在CSS当中,相邻的两个盒子(多是兄弟关系也多是祖先关系)的外边距能够结合成一个单独的外边距。这种合并外边距的方式被称为折叠,而且于是所结合成的外边距称为折叠外边距。

折叠结果遵循下列计算规则:

  • 两个相邻的外边距都是正数时,折叠结果是它们二者之间较大的值。
  • 两个相邻的外边距都是负数时,折叠结果是二者绝对值的较大值。
  • 两个外边距一正一负时,折叠结果是二者的相加的和。

39 rgba()和opacity的透明效果有什么不一样?

  • rgba()opacity都能实现透明效果,但最大的不一样是opacity做用于元素,以及元素内的全部内容的透明度,
  • rgba()只做用于元素的颜色或其背景色。(设置rgba透明的元素的子元素不会继承透明效果!)

40 css中可让文字在垂直和水平方向上重叠的两个属性是什么?

  • 垂直方向:line-height
  • 水平方向:letter-spacing

41 如何垂直居中一个浮动元素?

/**方法一:已知元素的高宽**/

#div1{
  background-color:#6699FF;
  width:200px;
  height:200px;

  position: absolute;        //父元素须要相对定位
  top: 50%;
  left: 50%;
  margin-top:-100px ;   //二分之一的height,width
  margin-left: -100px;
}
/**方法二:**/

#div1{
  width: 200px;
  height: 200px;
  background-color: #6699FF;

  margin:auto;
  position: absolute;        //父元素须要相对定位
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
}
如何垂直居中一个<img>?(用更简便的方法。)

#container     /**<img>的容器设置以下**/
{
    display:table-cell;
    text-align:center;
    vertical-align:middle;
}
 

42 px和em的区别

  • pxem都是长度单位,区别是,px的值是固定的,指定是多少就是多少,计算比较容易。em得值不是固定的,而且em会继承父级元素的字体大小。
  • 浏览器的默认字体高都是16px。因此未经调整的浏览器都符合: 1em=16px。那么12px=0.75em10px=0.625em

43 Sass、LESS是什么?你们为何要使用他们?

  • 他们是CSS预处理器。他是CSS上的一种抽象层。他们是一种特殊的语法/语言编译成CSS
  • 例如Less是一种动态样式语言. 将CSS赋予了动态语言的特性,如变量,继承,运算, 函数. LESS 既能够在客户端上运行 (支持IE 6+WebkitFirefox),也可一在服务端运行 (借助 Node.js)

为何要使用它们?

  • 结构清晰,便于扩展。
  • 能够方便地屏蔽浏览器私有语法差别。这个不用多说,封装对- 浏览器语法差别的重复处理,减小无心义的机械劳动。
  • 能够轻松实现多重继承。
  • 彻底兼容 CSS 代码,能够方便地应用到老项目中。LESS 只- 是在 CSS 语法上作了扩展,因此老的 CSS 代码也能够与 LESS 代码一同编译

44 知道css有个content属性吗?有什么做用?有什么应用?

css的content属性专门应用在 before/after伪元素上,用于来插入生成内容。最多见的应用是利用伪类清除浮动。

/**一种常见利用伪类清除浮动的代码**/
 .clearfix:after {
    content:".";       //这里利用到了content属性
    display:block;
    height:0;
    visibility:hidden;
    clear:both; }

.clearfix {
    *zoom:1;
}

 

45 水平居中的方法

  • 元素为行内元素,设置父元素text-align:center
  • 若是元素宽度固定,能够设置左右marginauto;
  • 若是元素为绝对定位,设置父元素positionrelative,元素设left:0;right:0;margin:auto;
  • 使用flex-box布局,指定justify-content属性为center
  • display设置为tabel-ceil

46 垂直居中的方法

  • 将显示方式设置为表格,display:table-cell,同时设置vertial-align:middle
  • 使用flex布局,设置为align-item:center
  • 绝对定位中设置bottom:0,top:0,并设置margin:auto
  • 绝对定位中固定高度时设置top:50%,margin-top值为高度一半的负值
  • 文本垂直居中设置line-heightheight

47 如何使用CSS实现硬件加速?

硬件加速是指经过建立独立的复合图层,让GPU来渲染这个图层,从而提升性能,

  • 通常触发硬件加速的CSS属性有transformopacityfilter,为了不2D动画在
    开始和结束的时候的repaint操做,通常使用tranform:translateZ(0)

48 重绘和回流(重排)是什么,如何避免?

  • DOM的变化影响到了元素的几何属性(宽高),浏览器从新计算元素的几何属性,其余元素的几何
  • 属性和位置也会受到影响,浏览器须要从新构造渲染树,这个过程称为重排,浏览器将受到影响的部分
  • 从新绘制到屏幕上的过程称为重绘。引发重排的缘由有
    • 添加或者删除可见的DOM元素,
    • 元素位置、尺寸、内容改变,
    • 浏览器页面初始化,
    • 浏览器窗口尺寸改变,重排必定重绘,重绘不必定重排,

减小重绘和重排的方法:

  • 不在布局信息改变时作DOM查询
  • 使用cssText或者className一次性改变属性
  • 使用fragment
  • 对于屡次重排的元素,如动画,使用绝对定位脱离文档流,让他的改变不影响到其余元素

49 说一说css3的animation

  • css3的animation是css3新增的动画属性,这个css3动画的每一帧是经过@keyframes来声明的,keyframes声明了动画的名称,经过fromto或者是百分比来定义
  • 每一帧动画元素的状态,经过animation-name来引用这个动画,同时css3动画也能够定义动画运行的时长、动画开始时间、动画播放方向、动画循环次数、动画播放的方式,
  • 这些相关的动画子属性有:animation-name定义动画名、animation-duration定义动画播放的时长、animation-delay定义动画延迟播放的时间、animation-direction定义
    动画的播放方向、animation-iteration-count定义播放次数、animation-fill-mode定义动画播放以后的状态、animation-play-state定义播放状态,如暂停运行等、animation-timing-function
  • 定义播放的方式,如恒速播放、艰涩播放等。

50 左边宽度固定,右边自适应

左侧固定宽度,右侧自适应宽度的两列布局实现

html结构

<div class="outer">
    <div class="left">固定宽度</div>
    <div class="right">自适应宽度</div>
</div>

在外层div(类名为outer)的div中,有两个子div,类名分别为leftright,其中left为固定宽度,而right为自适应宽度

方法1:左侧div设置成浮动:float: left,右侧div宽度会自拉升适应

.outer {
    width: 100%;
    height: 500px;
    background-color: yellow;
}
.left {
    width: 200px;
    height: 200px;
    background-color: red;
    float: left;
}
.right {
    height: 200px;
    background-color: blue;
}

 

方法2:对右侧:div进行绝对定位,而后再设置right=0,便可以实现宽度自适应

绝对定位元素的第一个高级特性就是其具备自动伸缩的功能,当咱们将 width设置为 auto 的时候(或者不设置,默认为 auto ),绝对定位元素会根据其 left 和 right 自动伸缩其大小

.outer {
    width: 100%;
    height: 500px;
    background-color: yellow;
    position: relative;
}
.left {
    width: 200px;
    height: 200px;
    background-color: red;
}
.right {
    height: 200px;
    background-color: blue;
    position: absolute;
    left: 200px;
    top:0;          
    right: 0;
}

 

方法3:将左侧div进行绝对定位,而后右侧div设置margin-left: 200px

.outer {
    width: 100%;
    height: 500px;
    background-color: yellow;
    position: relative;
}
.left {
    width: 200px;
    height: 200px;
    background-color: red;
    position: absolute;
}
.right {
    height: 200px;
    background-color: blue;
    margin-left: 200px;
}

 

方法4:使用flex布局

.outer {
    width: 100%;
    height: 500px;
    background-color: yellow;
    display: flex;
    flex-direction: row;
}
.left {
    width: 200px;
    height: 200px;
    background-color: red;
}
.right {
    height: 200px;
    background-color: blue;
    flex: 1;
}

 

3、JavaScript

1 闭包

  • 闭包就是可以读取其余函数内部变量的函数

  • 闭包是指有权访问另外一个函数做用域中变量的函数,建立闭包的最多见的方式就是在一个函数内建立另外一个函数,经过另外一个函数访问这个函数的局部变量,利用闭包能够突破做用链域

  • 闭包的特性:

    • 函数内再嵌套函数
    • 内部函数能够引用外层的参数和变量
    • 参数和变量不会被垃圾回收机制回收

说说你对闭包的理解

  • 使用闭包主要是为了设计私有的方法和变量。闭包的优势是能够避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易形成内存泄露。在js中,函数即闭包,只有函数才会产生做用域的概念

  • 闭包 的最大用处有两个,一个是能够读取函数内部的变量,另外一个就是让这些变量始终保持在内存中

  • 闭包的另外一个用处,是封装对象的私有属性和私有方法

  • 好处:可以实现封装和缓存等;

  • 坏处:就是消耗内存、不正当使用会形成内存溢出的问题

使用闭包的注意点

  • 因为闭包会使得函数中的变量都被保存在内存中,内存消耗很大,因此不能滥用闭包,不然会形成网页的性能问题,在IE中可能致使内存泄露
  • 解决方法是,在退出函数以前,将不使用的局部变量所有删除

2 说说你对做用域链的理解

  • 做用域链的做用是保证执行环境里有权访问的变量和函数是有序的,做用域链的变量只能向上访问,变量访问到window对象即被终止,做用域链向下访问变量是不被容许的
  • 简单的说,做用域就是变量与函数的可访问范围,即做用域控制着变量与函数的可见性和生命周期

3 JavaScript原型,原型链 ? 有什么特色?

  • 每一个对象都会在其内部初始化一个属性,就是prototype(原型),当咱们访问一个对象的属性时

  • 若是这个对象内部不存在这个属性,那么他就会去prototype里找这个属性,这个prototype又会有本身的prototype,因而就这样一直找下去,也就是咱们平时所说的原型链的概念

  • 关系:instance.constructor.prototype = instance.__proto__

  • 特色:

    • JavaScript对象是经过引用来传递的,咱们建立的每一个新对象实体中并无一份属于本身的原型副本。当咱们修改原型时,与之相关的对象也会继承这一改变
  • 当咱们须要一个属性的时,Javascript引擎会先看当前对象中是否有这个属性, 若是没有的

  • 就会查找他的Prototype对象是否有这个属性,如此递推下去,一直检索到 Object 内建对象

4 请解释什么是事件代理

  • 事件代理(Event Delegation),又称之为事件委托。是 JavaScript 中经常使用绑定事件的经常使用技巧。顾名思义,“事件代理”便是把本来须要绑定的事件委托给父元素,让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好处是能够提升性能
  • 能够大量节省内存占用,减小事件注册,好比在table上代理全部tdclick事件就很是棒
  • 能够实现当新增子对象时无需再次对其绑定

5 Javascript如何实现继承?

  • 构造继承

  • 原型继承

  • 实例继承

  • 拷贝继承

  • 原型prototype机制或applycall方法去实现较简单,建议使用构造函数与原型混合方式

 function Parent(){
        this.name = 'wang';
    }

    function Child(){
        this.age = 28;
    }
    Child.prototype = new Parent();//继承了Parent,经过原型

    var demo = new Child();
    alert(demo.age);
    alert(demo.name);//获得被继承的属性
  }

 

6 谈谈This对象的理解

  • this老是指向函数的直接调用者(而非间接调用者)
  • 若是有new关键字,this指向new出来的那个对象
  • 在事件中,this指向触发这个事件的对象,特殊的是,IE中的attachEvent中的this老是指向全局对象Window

7 事件模型

W3C中定义事件的发生经历三个阶段:捕获阶段(capturing)、目标阶段(targetin)、冒泡阶段(bubbling

  • 冒泡型事件:当你使用事件冒泡时,子级元素先触发,父级元素后触发
  • 捕获型事件:当你使用事件捕获时,父级元素先触发,子级元素后触发
  • DOM事件流:同时支持两种事件模型:捕获型事件和冒泡型事件
  • 阻止冒泡:在W3c中,使用stopPropagation()方法;在IE下设置cancelBubble = true
  • 阻止捕获:阻止事件的默认行为,例如click - <a>后的跳转。在W3c中,使用preventDefault()方法,在IE下设置window.event.returnValue = false

8 new操做符具体干了什么呢?

  • 建立一个空对象,而且 this 变量引用该对象,同时还继承了该函数的原型
  • 属性和方法被加入到 this 引用的对象中
  • 新建立的对象由 this 所引用,而且最后隐式的返回 this

9 Ajax原理

  • Ajax的原理简单来讲是在用户和服务器之间加了—个中间层(AJAX引擎),经过XmlHttpRequest对象来向服务器发异步请求,从服务器得到数据,而后用javascript来操做DOM而更新页面。使用户操做与服务器响应异步化。这其中最关键的一步就是从服务器得到请求数据
  • Ajax的过程只涉及JavaScriptXMLHttpRequestDOMXMLHttpRequestajax的核心机制
 // 1. 建立链接
    var xhr = null;
    xhr = new XMLHttpRequest()
    // 2. 链接服务器
    xhr.open('get', url, true)
    // 3. 发送请求
    xhr.send(null);
    // 4. 接受请求
    xhr.onreadystatechange = function(){
        if(xhr.readyState == 4){
            if(xhr.status == 200){
                success(xhr.responseText);
            } else { // fail
                fail && fail(xhr.status);
            }
        }
    }

 

ajax 有那些优缺点?

  • 优势:
    • 经过异步模式,提高了用户体验.
    • 优化了浏览器和服务器之间的传输,减小没必要要的数据往返,减小了带宽占用.
    • Ajax在客户端运行,承担了一部分原本由服务器承担的工做,减小了大用户量下的服务器负载。
    • Ajax能够实现动态不刷新(局部刷新)
  • 缺点:
    • 安全问题 AJAX暴露了与服务器交互的细节。
    • 对搜索引擎的支持比较弱。
    • 不容易调试。

10 如何解决跨域问题?

首先了解下浏览器的同源策略 同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,若是缺乏了同源策略,浏览器很容易受到XSSCSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即使两个不一样的域名指向同一个ip地址,也非同源

那么怎样解决跨域问题的呢?

  • 经过jsonp跨域
var script = document.createElement('script');
script.type = 'text/javascript';

// 传参并指定回调执行函数为onBack
script.src = 'http://www.....:8080/login?user=admin&callback=onBack';
document.head.appendChild(script);

// 回调执行函数
function onBack(res) {
    alert(JSON.stringify(res));
}

 

  • document.domain + iframe跨域

此方案仅限主域相同,子域不一样的跨域应用场景

1.)父窗口:(http://www.domain.com/a.html)

<iframe id="iframe" src="http://child.domain.com/b.html"></iframe>
<script>
    document.domain = 'domain.com';
    var user = 'admin';
</script>

 

2.)子窗口:(http://child.domain.com/b.html)

document.domain = 'domain.com';
// 获取父窗口中变量
alert('get js data from parent ---> ' + window.parent.user);
  • nginx代理跨域
  • nodejs中间件代理跨域
  • 后端在头部信息里面设置安全域名

11 模块化开发怎么作?

  • 当即执行函数,不暴露私有成员
var module1 = (function(){
    var _count = 0;
    var m1 = function(){
      //...
    };
    var m2 = function(){
      //...
    };
    return {
      m1 : m1,
      m2 : m2
    };
  })();

 

12 异步加载JS的方式有哪些?

  • defer,只支持IE
  • async
  • 建立script,插入到DOM中,加载完毕后callBack

13 那些操做会形成内存泄漏?

  • 内存泄漏指任何对象在您再也不拥有或须要它以后仍然存在
  • setTimeout 的第一个参数使用字符串而非函数的话,会引起内存泄漏
  • 闭包使用不当

14 XML和JSON的区别?

  • 数据体积方面

    • JSON相对于XML来说,数据的体积小,传递的速度更快些。
  • 数据交互方面

    • JSONJavaScript的交互更加方便,更容易解析处理,更好的数据交互
  • 数据描述方面

    • JSON对数据的描述性比XML较差
  • 传输速度方面

    • JSON的速度要远远快于XML

15 谈谈你对webpack的见解

  • WebPack 是一个模块打包工具,你能够使用WebPack管理你的模块依赖,并编绎输出模块们所需的静态文件。它可以很好地管理、打包Web开发中所用到的HTMLJavascriptCSS以及各类静态文件(图片、字体等),让开发过程更加高效。对于不一样类型的资源,webpack有对应的模块加载器。webpack模块打包器会分析模块间的依赖关系,最后 生成了优化且合并后的静态资源

16 说说你对AMD和Commonjs的理解

  • CommonJS是服务器端模块的规范,Node.js采用了这个规范。CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操做。AMD规范则是非同步加载模块,容许指定回调函数
  • AMD推荐的风格经过返回一个对象作为模块对象,CommonJS的风格经过对module.exportsexports的属性赋值来达到暴露模块对象的目的

17 常见web安全及防御原理

  • sql注入原理

    • 就是经过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
  • 总的来讲有如下几点

    • 永远不要信任用户的输入,要对用户的输入进行校验,能够经过正则表达式,或限制长度,对单引号和双"-"进行转换等
    • 永远不要使用动态拼装SQL,能够使用参数化的SQL或者直接使用存储过程进行数据查询存取
    • 永远不要使用管理员权限的数据库链接,为每一个应用使用单独的权限有限的数据库链接
    • 不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息

XSS原理及防范

  • Xss(cross-site scripting)攻击指的是攻击者往Web页面里插入恶意html标签或者javascript代码。好比:攻击者在论坛中放一个看似安全的连接,骗取用户点击后,窃取cookie中的用户私密信息;或者攻击者在论坛中加一个恶意表单,当用户提交表单的时候,却把信息传送到攻击者的服务器中,而不是用户本来觉得的信任站点

XSS防范方法

  • 首先代码里对用户输入的地方和变量都须要仔细检查长度和对”<”,”>”,”;”,”’”等字符作过滤;其次任何内容写到页面以前都必须加以encode,避免不当心把html tag 弄出来。这一个层面作好,至少能够堵住超过一半的XSS 攻击

XSS与CSRF有什么区别吗?

  • XSS是获取信息,不须要提早知道其余用户页面的代码和数据包。CSRF是代替用户完成指定的动做,须要知道其余用户页面的代码和数据包。要完成一次CSRF攻击,受害者必须依次完成两个步骤

  • 登陆受信任网站A,并在本地生成Cookie

  • 在不登出A的状况下,访问危险网站B

CSRF的防护

  • 服务端的CSRF方式方法不少样,但总的思想都是一致的,就是在客户端页面增长伪随机数
  • 经过验证码的方法

18 用过哪些设计模式?

  • 工厂模式:

    • 工厂模式解决了重复实例化的问题,但还有一个问题,那就是识别问题,由于根本没法
    • 主要好处就是能够消除对象间的耦合,经过使用工程方法而不是new关键字
  • 构造函数模式

    • 使用构造函数的方法,即解决了重复实例化的问题,又解决了对象识别的问题,该模式与工厂模式的不一样之处在于
    • 直接将属性和方法赋值给 this对象;

19 为何要有同源限制?

  • 同源策略指的是:协议,域名,端口相同,同源策略是一种安全协议
  • 举例说明:好比一个黑客程序,他利用Iframe把真正的银行登陆页面嵌到他的页面上,当你使用真实的用户名,密码登陆时,他的页面就能够经过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。

20 offsetWidth/offsetHeight,clientWidth/clientHeight与scrollWidth/scrollHeight的区别

  • offsetWidth/offsetHeight返回值包含content + padding + border,效果与e.getBoundingClientRect()相同
  • clientWidth/clientHeight返回值只包含content + padding,若是有滚动条,也不包含滚动条
  • scrollWidth/scrollHeight返回值包含content + padding + 溢出内容的尺寸

21 javascript有哪些方法定义对象

  • 对象字面量: var obj = {};
  • 构造函数: var obj = new Object();
  • Object.create(): var obj = Object.create(Object.prototype);

22 常见兼容性问题?

  • png24位的图片在iE6浏览器上出现背景,解决方案是作成PNG8
  • 浏览器默认的marginpadding不一样。解决方案是加一个全局的*{margin:0;padding:0;}来统一,,可是全局效率很低,通常是以下这样解决:
body,ul,li,ol,dl,dt,dd,form,input,h1,h2,h3,h4,h5,h6,p{
margin:0;
padding:0;
}
  • IE下,event对象有x,y属性,可是没有pageX,pageY属性
  • Firefox下,event对象有pageX,pageY属性,可是没有x,y属性.

23 说说你对promise的了解

  • 依照 Promise/A+ 的定义,Promise 有四种状态:

    • pending: 初始状态, 非 fulfilled 或 rejected.

    • fulfilled: 成功的操做.

    • rejected: 失败的操做.

    • settled: Promise已被fulfilledrejected,且不是pending

  • 另外, fulfilled与 rejected一块儿合称 settled

  • Promise 对象用来进行延迟(deferred) 和异步(asynchronous) 计算

Promise 的构造函数

  • 构造一个 Promise,最基本的用法以下:
var promise = new Promise(function(resolve, reject) {

        if (...) {  // succeed

            resolve(result);

        } else {   // fails

            reject(Error(errMessage));

        }
    });

 

  • Promise 实例拥有 then 方法(具备 then 方法的对象,一般被称为thenable)。它的使用方法以下:
promise.then(onFulfilled, onRejected)

 

  • 接收两个函数做为参数,一个在 fulfilled 的时候被调用,一个在rejected的时候被调用,接收参数就是 futureonFulfilled 对应resolveonRejected对应 reject

24 你以为jQuery源码有哪些写的好的地方

  • jquery源码封装在一个匿名函数的自执行环境中,有助于防止变量的全局污染,而后经过传入window对象参数,能够使window对象做为局部变量使用,好处是当jquery中访问window对象的时候,就不用将做用域链退回到顶层做用域了,从而能够更快的访问window对象。一样,传入undefined参数,能够缩短查找undefined时的做用域链
  • jquery将一些原型属性和方法封装在了jquery.prototype中,为了缩短名称,又赋值给了jquery.fn,这是很形象的写法
  • 有一些数组或对象的方法常常能使用到,jQuery将其保存为局部变量以提升访问速度
  • jquery实现的链式调用能够节约代码,所返回的都是同一个对象,能够提升代码效率

25 vue、react、angular

  • Vue.js
    一个用于建立 web 交互界面的库,是一个精简的 MVVM。它经过双向数据绑定把 View 层和 Model 层链接了起来。实际的 DOM 封装和输出格式都被抽象为了Directives 和 Filters

  • AngularJS
    是一个比较完善的前端MVVM框架,包含模板,数据双向绑定,路由,模块化,服务,依赖注入等全部功能,模板功能强大丰富,自带了丰富的 Angular指令

  • react
    React 仅仅是 VIEW 层是facebook公司。推出的一个用于构建UI的一个库,可以实现服务器端的渲染。用了virtual dom,因此性能很好。

26 Node的应用场景

  • 特色:

    • 一、它是一个Javascript运行环境
    • 二、依赖于Chrome V8引擎进行代码解释
    • 三、事件驱动
    • 四、非阻塞I/O
    • 五、单进程,单线程
  • 优势:

    • 高并发(最重要的优势)
  • 缺点:

    • 一、只支持单核CPU,不能充分利用CPU
    • 二、可靠性低,一旦代码某个环节崩溃,整个系统都崩溃

27 谈谈你对AMD、CMD的理解

  • CommonJS是服务器端模块的规范,Node.js采用了这个规范。CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操做。AMD规范则是非同步加载模块,容许指定回调函数

  • AMD推荐的风格经过返回一个对象作为模块对象,CommonJS的风格经过对module.exportsexports的属性赋值来达到暴露模块对象的目的

es6模块 commonjs amd cmd

  • CommonJS 的规范中,每一个 JavaScript 文件就是一个独立的模块上下文(module context),在这个上下文中默认建立的属性都是私有的。也就是说,在一个文件定义的变量(还包括函数和类),都是私有的,对其余文件是不可见的。
  • CommonJS是同步加载模块,在浏览器中会出现堵塞状况,因此不适用
  • AMD 异步,须要定义回调define方式
  • es6 一个模块就是一个独立的文件,该文件内部的全部变量,外部没法获取。若是你但愿外部可以读取模块内部的某个变量,就必须使用export关键字输出该变量
    es6还能够导出类、方法,自动适用严格模式

28 那些操做会形成内存泄漏

  • 内存泄漏指任何对象在您再也不拥有或须要它以后仍然存在
  • setTimeout 的第一个参数使用字符串而非函数的话,会引起内存泄漏
  • 闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)

29 web开发中会话跟踪的方法有哪些

  • cookie
  • session
  • url重写
  • 隐藏input
  • ip地址

30 介绍js的基本数据类型

  • UndefinedNullBooleanNumberString

31 介绍js有哪些内置对象

  • Object 是 JavaScript 中全部对象的父对象
  • 数据封装类对象:ObjectArrayBooleanNumber 和 String
  • 其余对象:FunctionArgumentsMathDateRegExpError

32 说几条写JavaScript的基本规范

  • 不要在同一行声明多个变量
  • 请使用===/!==来比较true/false或者数值
  • 使用对象字面量替代new Array这种形式
  • 不要使用全局函数
  • Switch语句必须带有default分支
  • If语句必须使用大括号
  • for-in循环中的变量 应该使用var关键字明确限定做用域,从而避免做用域污

33 JavaScript有几种类型的值

  • 栈:原始数据类型(UndefinedNullBooleanNumber、String
  • 堆:引用数据类型(对象、数组和函数)
  • 两种类型的区别是:存储位置不一样;
  • 原始数据类型直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,因此放入栈中存储;
  • 引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定,若是存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其
  • 在栈中的地址,取得地址后从堆中得到实体

34 javascript建立对象的几种方式

javascript建立对象简单的说,无非就是使用内置对象或各类自定义对象,固然还能够用JSON;但写法有不少种,也能混合使用

  • 对象字面量的方式
person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};
  • function来模拟无参的构造函数
function Person(){}
    var person=new Person();//定义一个function,若是使用new"实例化",该function能够看做是一个Class
        person.name="Mark";
        person.age="25";
        person.work=function(){
        alert(person.name+" hello...");
    }
person.work();

 

  • function来模拟参构造函数来实现(用this关键字定义构造的上下文属性)
function Pet(name,age,hobby){
       this.name=name;//this做用域:当前对象
       this.age=age;
       this.hobby=hobby;
       this.eat=function(){
          alert("我叫"+this.name+",我喜欢"+this.hobby+",是个程序员");
       }
    }
    var maidou =new Pet("麦兜",25,"coding");//实例化、建立对象
    maidou.eat();//调用eat方法

 

  • 用工厂方式来建立(内置对象)
var wcDog =new Object();
     wcDog.name="旺财";
     wcDog.age=3;
     wcDog.work=function(){
       alert("我是"+wcDog.name+",汪汪汪......");
     }
     wcDog.work();

 

  • 用原型方式来建立
function Dog(){

     }
     Dog.prototype.name="旺财";
     Dog.prototype.eat=function(){
     alert(this.name+"是个吃货");
     }
     var wangcai =new Dog();
     wangcai.eat();

 

  • 用混合方式来建立
 function Car(name,price){
      this.name=name;
      this.price=price;
    }
     Car.prototype.sell=function(){
       alert("我是"+this.name+",我如今卖"+this.price+"万元");
      }
    var camry =new Car("凯美瑞",27);
    camry.sell();

 

35 eval是作什么的

  • 它的功能是把对应的字符串解析成JS代码并运行
  • 应该避免使用eval,不安全,很是耗性能(2次,一次解析成js语句,一次执行)
  • JSON字符串转换为JSON对象的时候能够用eval,var obj =eval('('+ str +')')

36 null,undefined 的区别

  • undefined 表示不存在这个值。

  • undefined :是一个表示"无"的原始值或者说表示"缺乏值",就是此处应该有一个值,可是尚未定义。当尝试读取时会返回 undefined

  • 例如变量被声明了,但没有赋值时,就等于undefined

  • null 表示一个对象被定义了,值为“空值”

  • null : 是一个对象(空对象, 没有任何属性和方法)

  • 例如做为函数的参数,表示该函数的参数不是对象;

  • 在验证null时,必定要使用 === ,由于 ==没法分别null 和 undefined

37 ["1", "2", "3"].map(parseInt) 答案是多少

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

38 javascript 代码中的"use strict";是什么意思

  • use strict是一种ECMAscript 5 添加的(严格)运行模式,这种模式使得 Javascript 在更严格的条件下运行,使JS编码更加规范化的模式,消除Javascript语法的一些不合理、不严谨之处,减小一些怪异行为

39 JSON 的了解

  • JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式

  • 它是基于JavaScript的一个子集。数据格式简单, 易于读写, 占用带宽小

  • JSON字符串转换为JSON对象:

var obj =eval('('+ str +')');
var obj = str.parseJSON();
var obj = JSON.parse(str);
  • JSON对象转换为JSON字符串:
var last=obj.toJSONString();
var last=JSON.stringify(obj);

40 js延迟加载的方式有哪些

  • deferasync、动态建立DOM方式(用得最多)、按需异步载入js

41 同步和异步的区别

  • 同步:浏览器访问服务器请求,用户看获得页面刷新,从新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操做
  • 异步:浏览器访问服务器请求,用户正常操做,浏览器后端进行请求。等请求完,页面不刷新,新内容也会出现,用户看到新内容

42 渐进加强和优雅降级

  • 渐进加强 :针对低版本浏览器进行构建页面,保证最基本的功能,而后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
  • 优雅降级 :一开始就构建完整的功能,而后再针对低版本浏览器进行兼容

43 defer和async

  • defer并行加载js文件,会按照页面上script标签的顺序执行
  • async并行加载js文件,下载完成当即执行,不会按照页面上script标签的顺序执行

44 说说严格模式的限制

  • 变量必须声明后再使用
  • 函数的参数不能有同名属性,不然报错
  • 不能使用with语句
  • 禁止this指向全局对象

45 attribute和property的区别是什么

  • attributedom元素在文档中做为html标签拥有的属性;
  • property就是dom元素在js中做为对象拥有的属性。
  • 对于html的标准属性来讲,attributeproperty是同步的,是会自动更新的
  • 可是对于自定义的属性来讲,他们是不一样步的

46 谈谈你对ES6的理解

  • 新增模板字符串(为JavaScript提供了简单的字符串插值功能)
  • 箭头函数
  • for-of(用来遍历数据—例如数组中的值。)
  • arguments对象可被不定参数和默认参数完美代替。
  • ES6将promise对象归入规范,提供了原生的Promise对象。
  • 增长了letconst命令,用来声明变量。
  • 增长了块级做用域。
  • let命令实际上就增长了块级做用域。
  • 还有就是引入module模块的概念

47 ECMAScript6 怎么写class么

  • 这个语法糖可让有OOP基础的人更快上手js,至少是一个官方的实现了
  • 但对熟悉js的人来讲,这个东西没啥大影响;一个Object.creat()搞定继承,比class简洁清晰的多

48 什么是面向对象编程及面向过程编程,它们的异同和优缺点

  • 面向过程就是分析出解决问题所须要的步骤,而后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就能够了
  • 面向对象是把构成问题事务分解成各个对象,创建对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为
  • 面向对象是以功能来划分问题,而不是步骤

49 面向对象编程思想

  • 基本思想是使用对象,类,继承,封装等基本概念来进行程序设计
  • 优势
    • 易维护
      • 采用面向对象思想设计的结构,可读性高,因为继承的存在,即便改变需求,那么维护也只是在局部模块,因此维护起来是很是方便和较低成本的
    • 易扩展
    • 开发工做的重用性、继承性高,下降重复工做量。
    • 缩短了开发周期

50 对web标准、可用性、可访问性的理解

  • 可用性(Usability):产品是否容易上手,用户可否完成任务,效率如何,以及这过程当中用户的主观感觉可好,是从用户的角度来看产品的质量。可用性好意味着产品质量高,是企业的核心竞争力
  • 可访问性(Accessibility):Web内容对于残障用户的可阅读和可理解性
  • 可维护性(Maintainability):通常包含两个层次,一是当系统出现问题时,快速定位并解决问题的成本,成本低则可维护性好。二是代码是否容易被人理解,是否容易修改和加强功能。

51 如何经过JS判断一个数组

  • instanceof方法
    • instanceof 运算符是用来测试一个对象是否在其原型链原型构造函数的属性
var arr = [];
arr instanceof Array; // true

 

  • constructor方法
    • constructor属性返回对建立此对象的数组函数的引用,就是返回对象相对应的构造函数
var arr = [];
arr.constructor == Array; //true

 

  • 最简单的方法
    • 这种写法,是 jQuery 正在使用的
Object.prototype.toString.call(value) == '[object Array]'
// 利用这个方法,能够写一个返回数据类型的方法
var isType = function (obj) {
     return Object.prototype.toString.call(obj).slice(8,-1);
}

 

  • ES5新增方法isArray()
var a = new Array(123);
var b = new Date();
console.log(Array.isArray(a)); //true
console.log(Array.isArray(b)); //false

 

52 谈一谈let与var的区别

  • let命令不存在变量提高,若是在let前使用,会致使报错
  • 若是块区中存在letconst命令,就会造成封闭做用域
  • 不容许重复声明,所以,不能在函数内部从新声明参数

53 map与forEach的区别

  • forEach方法,是最基本的方法,就是遍历与循环,默认有3个传参:分别是遍历的数组内容item、数组索引index、和当前遍历数组Array
  • map方法,基本用法与forEach一致,可是不一样的,它会返回一个新的数组,因此在callback须要有return值,若是没有,会返回undefined

54 谈一谈你理解的函数式编程

  • 简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论
  • 它具备如下特性:闭包和高阶函数、惰性计算、递归、函数是"第一等公民"、只用"表达式"

55 谈一谈箭头函数与普通函数的区别?

  • 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象
  • 不能够看成构造函数,也就是说,不能够使用new命令,不然会抛出一个错误
  • 不能够使用arguments对象,该对象在函数体内不存在。若是要用,能够用Rest参数代替
  • 不能够使用yield命令,所以箭头函数不能用做Generator函数

56 谈一谈函数中this的指向

  • this的指向在函数定义的时候是肯定不了的,只有函数执行的时候才能肯定this到底指向谁,实际上this的最终指向的是那个调用它的对象

  • 《javascript语言精髓》中大概归纳了4种调用方式:

  • 方法调用模式

  • 函数调用模式

  • 构造器调用模式

graph LR
A-->B
  • apply/call调用模式

57 异步编程的实现方式

  • 回调函数

    • 优势:简单、容易理解
    • 缺点:不利于维护,代码耦合高
  • 事件监听(采用时间驱动模式,取决于某个事件是否发生):

    • 优势:容易理解,能够绑定多个事件,每一个事件能够指定多个回调函数
    • 缺点:事件驱动型,流程不够清晰
  • 发布/订阅(观察者模式)

    • 相似于事件监听,可是能够经过‘消息中心’,了解如今有多少发布者,多少订阅者
  • Promise对象

    • 优势:能够利用then方法,进行链式写法;能够书写错误时的回调函数;
    • 缺点:编写和理解,相对比较难
  • Generator函数

    • 优势:函数体内外的数据交换、错误处理机制
    • 缺点:流程管理不方便
  • async函数

    • 优势:内置执行器、更好的语义、更广的适用性、返回的是Promise、结构清晰。
    • 缺点:错误处理机制

58 对原生Javascript了解程度

  • 数据类型、运算、对象、Function、继承、闭包、做用域、原型链、事件、RegExpJSONAjaxDOMBOM、内存泄漏、跨域、异步装载、模板引擎、前端MVC、路由、模块化、CanvasECMAScript

59 Js动画与CSS动画区别及相应实现

  • CSS3的动画的优势
    • 在性能上会稍微好一些,浏览器会对CSS3的动画作一些优化
    • 代码相对简单
  • 缺点
    • 在动画控制上不够灵活
    • 兼容性很差
  • JavaScript的动画正好弥补了这两个缺点,控制能力很强,能够单帧的控制、变换,同时写得好彻底能够兼容IE6,而且功能强大。对于一些复杂控制的动画,使用javascript会比较靠谱。而在实现一些小的交互动效的时候,就多考虑考虑CSS

60 JS 数组和对象的遍历方式,以及几种方式的比较

一般咱们会用循环的方式来遍历数组。可是循环是 致使js 性能问题的缘由之一。通常咱们会采用下几种方式来进行数组的遍历

  • for in循环

  • for循环

  • forEach

    • 这里的 forEach回调中两个参数分别为 valueindex
    • forEach 没法遍历对象
    • IE不支持该方法;Firefox 和 chrome 支持
    • forEach 没法使用 breakcontinue 跳出循环,且使用 return 是跳过本次循环
  • 这两种方法应该很是常见且使用很频繁。但实际上,这两种方法都存在性能问题

  • 在方式一中,for-in须要分析出array的每一个属性,这个操做性能开销很大。用在 key 已知的数组上是很是不划算的。因此尽可能不要用for-in,除非你不清楚要处理哪些属性,例如 JSON对象这样的状况

  • 在方式2中,循环每进行一次,就要检查一下数组长度。读取属性(数组长度)要比读局部变量慢,尤为是当 array 里存放的都是 DOM 元素,由于每次读取都会扫描一遍页面上的选择器相关元素,速度会大大下降

61 gulp是什么

  • gulp是前端开发过程当中一种基于流的代码构建工具,是自动化项目的构建利器;它不只能对网站资源进行优化,并且在开发过程当中不少重复的任务可以使用正确的工具自动完成
  • Gulp的核心概念:流
  • 流,简单来讲就是创建在面向对象基础上的一种抽象的处理数据的工具。在流中,定义了一些处理数据的基本操做,如读取数据,写入数据等,程序员是对流进行全部操做的,而不用关心流的另外一头数据的真正流向
  • gulp正是经过流和代码优于配置的策略来尽可能简化任务编写的工做
  • Gulp的特色:
    • 易于使用:经过代码优于配置的策略,gulp 让简单的任务简单,复杂的任务可管理
    • 构建快速 利用 Node.js 流的威力,你能够快速构建项目并减小频繁的 IO 操做
    • 易于学习 经过最少的 API,掌握 gulp 绝不费力,构建工做尽在掌握:如同一系列流管道

62 说一下Vue的双向绑定数据的原理

  • vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,经过Object.defineProperty()来劫持各个属性的settergetter,在数据变更时发布消息给订阅者,触发相应的监听回调

63 事件的各个阶段

  • 1:捕获阶段 ---> 2:目标阶段 ---> 3:冒泡阶段
  • document ---> target目标 ----> document
  • 由此,addEventListener的第三个参数设置为truefalse的区别已经很是清晰了
    • true表示该元素在事件的“捕获阶段”(由外往内传递时)响应事件
    • false表示该元素在事件的“冒泡阶段”(由内向外传递时)响应事件

64 let var const

let

  • 容许你声明一个做用域被限制在块级中的变量、语句或者表达式
  • let绑定不受变量提高的约束,这意味着let声明不会被提高到当前
  • 该变量处于从块开始到初始化处理的“暂存死区”

var

  • 声明变量的做用域限制在其声明位置的上下文中,而非声明变量老是全局的
  • 因为变量声明(以及其余声明)老是在任意代码执行以前处理的,因此在代码中的任意位置声明变量老是等效于在代码开头声明

const

  • 声明建立一个值的只读引用 (即指针)
  • 基本数据当值发生改变时,那么其对应的指针也将发生改变,故形成 const申明基本数据类型时
  • 再将其值改变时,将会形成报错, 例如 const a = 3 ; a = 5时 将会报错
  • 可是若是是复合类型时,若是只改变复合类型的其中某个Value项时, 将仍是正常使用

65 快速的让一个数组乱序

var arr = [1,2,3,4,5,6,7,8,9,10];
arr.sort(function(){
    return Math.random() - 0.5;
})
console.log(arr);

 

66 如何渲染几万条数据并不卡住界面

这道题考察了如何在不卡住页面的状况下渲染数据,也就是说不能一次性将几万条都渲染出来,而应该一次渲染部分 DOM,那么就能够经过 requestAnimationFrame 来每 16 ms 刷新一次

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <ul>控件</ul>
  <script>
    setTimeout(() => {
      // 插入十万条数据
      const total = 100000
      // 一次插入 20 条,若是以为性能很差就减小
      const once = 20
      // 渲染数据总共须要几回
      const loopCount = total / once
      let countOfRender = 0
      let ul = document.querySelector("ul");
      function add() {
        // 优化性能,插入不会形成回流
        const fragment = document.createDocumentFragment();
        for (let i = 0; i < once; i++) {
          const li = document.createElement("li");
          li.innerText = Math.floor(Math.random() * total);
          fragment.appendChild(li);
        }
        ul.appendChild(fragment);
        countOfRender += 1;
        loop();
      }
      function loop() {
        if (countOfRender < loopCount) {
          window.requestAnimationFrame(add);
        }
      }
      loop();
    }, 0);
  </script>
</body>
</html>

 

67 但愿获取到页面中全部的checkbox怎么作?

不使用第三方框架

 var domList = document.getElementsByTagName(‘input’)
 var checkBoxList = [];
 var len = domList.length;  //缓存到局部变量
 while (len--) {  //使用while的效率会比for循环更高
   if (domList[len].type == ‘checkbox’) {
       checkBoxList.push(domList[len]);
   }
 }

 

68 怎样添加、移除、移动、复制、建立和查找节点

建立新节点

createDocumentFragment()    //建立一个DOM片断 createElement() //建立一个具体的元素 createTextNode() //建立一个文本节点

添加、移除、替换、插入

appendChild()      //添加 removeChild() //移除 replaceChild() //替换 insertBefore() //插入

查找

getElementsByTagName()    //经过标签名称 getElementsByName() //经过元素的Name属性的值 getElementById() //经过元素Id,惟一性

69 正则表达式

正则表达式构造函数var reg=new RegExp(“xxx”)与正则表达字面量var reg=//有什么不一样?匹配邮箱的正则表达式?

  • 当使用RegExp()构造函数的时候,不只须要转义引号(即\”表示”),而且还须要双反斜杠(即\\表示一个\)。使用正则表达字面量的效率更高

邮箱的正则匹配:

var regMail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/;

 

70 Javascript中callee和caller的做用?

  • caller是返回一个对函数的引用,该函数调用了当前函数;
  • callee是返回正在被执行的function函数,也就是所指定的function对象的正文

那么问题来了?若是一对兔子每个月生一对兔子;一对新生兔,从第二个月起就开始生兔子;假定每对兔子都是一雌一雄,试问一对兔子,第n个月能繁殖成多少对兔子?(使用callee完成)

var result=[];
  function fn(n){  //典型的斐波那契数列
     if(n==1){
          return 1;
     }else if(n==2){
             return 1;
     }else{
          if(result[n]){
                  return result[n];
         }else{
                 //argument.callee()表示fn()
                 result[n]=arguments.callee(n-1)+arguments.callee(n-2);
                 return result[n];
         }
    }
 }

 

71 window.onload和$(document).ready

原生JSwindow.onloadJquery$(document).ready(function(){})有什么不一样?如何用原生JS实现Jq的ready方法?

  • window.onload()方法是必须等到页面内包括图片的全部元素加载完毕后才能执行。
  • $(document).ready()DOM结构绘制完毕后就执行,没必要等到加载完毕
function ready(fn){
      if(document.addEventListener) {        //标准浏览器
          document.addEventListener('DOMContentLoaded', function() {
              //注销事件, 避免反复触发
              document.removeEventListener('DOMContentLoaded',arguments.callee, false);
              fn();            //执行函数
          }, false);
      }else if(document.attachEvent) {        //IE
          document.attachEvent('onreadystatechange', function() {
             if(document.readyState == 'complete') {
                 document.detachEvent('onreadystatechange', arguments.callee);
                 fn();        //函数执行
             }
         });
     }
 };

 

72 addEventListener()和attachEvent()的区别

  • addEventListener()是符合W3C规范的标准方法; attachEvent()是IE低版本的非标准方法
  • addEventListener()支持事件冒泡和事件捕获; - 而attachEvent()只支持事件冒泡
  • addEventListener()的第一个参数中,事件类型不须要添加onattachEvent()须要添加'on'
  • 若是为同一个元素绑定多个事件, addEventListener()会按照事件绑定的顺序依次执行, attachEvent()会按照事件绑定的顺序倒序执行

73 获取页面全部的checkbox

var resultArr= [];
var input = document.querySelectorAll('input');
for( var i = 0; i < input.length; i++ ) {
    if( input[i].type == 'checkbox' ) {
        resultArr.push( input[i] );
    }
}
//resultArr即中获取到了页面中的全部checkbox

 

74 数组去重方法总结(六种方法)

方法一

  • 双层循环,外层循环元素,内层循环时比较值
  • 若是有相同的值则跳过,不相同则push进数组
Array.prototype.distinct = function(){
 var arr = this,
  result = [],
  i,
  j,
  len = arr.length;
 for(i = 0; i < len; i++){
  for(j = i + 1; j < len; j++){
   if(arr[i] === arr[j]){
    j = ++i;
   }
  }
  result.push(arr[i]);
 }
 return result;
}
var arra = [1,2,3,4,4,1,1,2,1,1,1];
arra.distinct();    //返回[3,4,2,1]

 

方法二:利用splice直接在原数组进行操做

  • 双层循环,外层循环元素,内层循环时比较值
  • 值相同时,则删去这个值
  • 注意点:删除元素以后,须要将数组的长度也减1.
Array.prototype.distinct = function (){
 var arr = this,
  i,
  j,
  len = arr.length;
 for(i = 0; i < len; i++){
  for(j = i + 1; j < len; j++){
   if(arr[i] == arr[j]){
    arr.splice(j,1);
    len--;
    j--;
   }
  }
 }
 return arr;
};
var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,];
var b = a.distinct();
console.log(b.toString()); //1,2,3,4,5,6,56

 

  • 优势:简单易懂
  • 缺点:占用内存高,速度慢

方法三:利用对象的属性不能相同的特色进行去重

Array.prototype.distinct = function (){
 var arr = this,
  i,
  obj = {},
  result = [],
  len = arr.length;
 for(i = 0; i< arr.length; i++){
  if(!obj[arr[i]]){ //若是能查找到,证实数组元素重复了
   obj[arr[i]] = 1;
   result.push(arr[i]);
  }
 }
 return result;
};
var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,];
var b = a.distinct();
console.log(b.toString()); //1,2,3,4,5,6,56

 

方法四:数组递归去重

  • 运用递归的思想
  • 先排序,而后从最后开始比较,遇到相同,则删除
Array.prototype.distinct = function (){
 var arr = this,
  len = arr.length;
 arr.sort(function(a,b){  //对数组进行排序才能方便比较
  return a - b;
 })
 function loop(index){
  if(index >= 1){
   if(arr[index] === arr[index-1]){
    arr.splice(index,1);
   }
   loop(index - 1); //递归loop函数进行去重
  }
 }
 loop(len-1);
 return arr;
};
var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,56,45,56];
var b = a.distinct();
console.log(b.toString());  //1,2,3,4,5,6,45,56

 

方法五:利用indexOf以及forEach

Array.prototype.distinct = function (){
 var arr = this,
  result = [],
  len = arr.length;
 arr.forEach(function(v, i ,arr){  //这里利用map,filter方法也能够实现
  var bool = arr.indexOf(v,i+1);  //从传入参数的下一个索引值开始寻找是否存在重复
  if(bool === -1){
   result.push(v);
  }
 })
 return result;
};
var a = [1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,2,3,3,2,2,1,23,1,23,2,3,2,3,2,3];
var b = a.distinct();
console.log(b.toString()); //1,23,2,3

 

方法六:利用ES6的set

  • Set数据结构,它相似于数组,其成员的值都是惟一的。
  • 利用Array.fromSet结构转换成数组
function dedupe(array){
 return Array.from(new Set(array));
}
dedupe([1,1,2,3]) //[1,2,3]

 

拓展运算符(...)内部使用for...of循环

let arr = [1,2,3,3];
let resultarr = [...new Set(arr)];
console.log(resultarr); //[1,2,3]

 

75 (设计题)想实现一个对页面某个节点的拖曳?如何作?(使用原生JS)

  • 给须要拖拽的节点绑定mousedownmousemovemouseup事件
  • mousedown事件触发后,开始拖拽
  • mousemove时,须要经过event.clientXclientY获取拖拽位置,并实时更新位置
  • mouseup时,拖拽结束
  • 须要注意浏览器边界的状况

76 Javascript全局函数和全局变量

全局变量

  • Infinity 表明正的无穷大的数值。
  • NaN 指示某个值是否是数字值。
  • undefined 指示未定义的值。

全局函数

  • decodeURI() 解码某个编码的 URI
  • decodeURIComponent() 解码一个编码的 URI 组件。
  • `encodeURI() 把字符串编码为 URI。
  • encodeURIComponent() 把字符串编码为 URI 组件。
  • escape() 对字符串进行编码。
  • eval() 计算 JavaScript 字符串,并把它做为脚本代码来执行。
  • isFinite() 检查某个值是否为有穷大的数。
  • isNaN() 检查某个值是不是数字。
  • Number() 把对象的值转换为数字。
  • parseFloat() 解析一个字符串并返回一个浮点数。
  • parseInt() 解析一个字符串并返回一个整数。
  • String() 把对象的值转换为字符串。
  • unescape() 对由escape() 编码的字符串进行解码

77 使用js实现一个持续的动画效果

定时器思路

var e = document.getElementById('e') var flag = true; var left = 0; setInterval(() => { left == 0 ? flag = true : left == 100 ? flag = false : '' flag ? e.style.left = ` ${left++}px` : e.style.left = ` ${left--}px` }, 1000 / 60) 

requestAnimationFrame

//兼容性处理 window.requestAnimFrame = (function(){ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback){ window.setTimeout(callback, 1000 / 60); }; })(); var e = document.getElementById("e"); var flag = true; var left = 0; function render() { left == 0 ? flag = true : left == 100 ? flag = false : ''; flag ? e.style.left = ` ${left++}px` : e.style.left = ` ${left--}px`; } (function animloop() { render(); requestAnimFrame(animloop); })(); 

使用css实现一个持续的动画效果

animation:mymove 5s infinite;
@keyframes mymove { from {top:0px;} to {top:200px;} }
  • animation-name
    规定须要绑定到选择器的 keyframe名称。
  • animation-duration
    规定完成动画所花费的时间,以秒或毫秒计。
  • animation-timing-function
    规定动画的速度曲线。
  • animation-delay
    规定在动画开始以前的延迟。
  • animation-iteration-count
    规定动画应该播放的次数。
  • animation-direction 规定是否应该轮流反向播放动画

78 封装一个函数,参数是定时器的时间,.then执行回调函数

function sleep (time) { return new Promise((resolve) => setTimeout(resolve, time)); }

79 怎么判断两个对象相等?

obj={
    a:1, b:2 } obj2={ a:1, b:2 } obj3={ a:1, b:'2' }

能够转换为字符串来判断

JSON.stringify(obj)==JSON.stringify(obj2);//true JSON.stringify(obj)==JSON.stringify(obj3);//false

80 项目作过哪些性能优化?

  • 减小 HTTP` 请求数
  • 减小 DNS 查询
  • 使用 CDN
  • 避免重定向
  • 图片懒加载
  • 减小 DOM 元素数量
  • 减小DOM 操做
  • 使用外部 JavaScript 和 CSS
  • 压缩 JavaScript 、 CSS 、字体、图片等
  • 优化 CSS Sprite
  • 使用 iconfont
  • 字体裁剪
  • 多域名分发划份内容到不一样域名
  • 尽可能减小 iframe 使用
  • 避免图片 src 为空
  • 把样式表放在link 中
  • 把脚本放在页面底部

81 浏览器缓存

浏览器缓存分为强缓存和协商缓存。当客户端请求某个资源时,获取缓存的流程以下

  • 先根据这个资源的一些 http header 判断它是否命中强缓存,若是命中,则直接从本地获取缓存资源,不会发请求到服务器;
  • 当强缓存没有命中时,客户端会发送请求到服务器,服务器经过另外一些request header验证这个资源是否命中协商缓存,称为http再验证,若是命中,服务器将请求返回,但不返回资源,而是告诉客户端直接从缓存中获取,客户端收到返回后就会从缓存中获取资源;
  • 强缓存和协商缓存共同之处在于,若是命中缓存,服务器都不会返回资源;
    区别是,强缓存不对发送请求到服务器,但协商缓存会。
  • 当协商缓存也没命中时,服务器就会将资源发送回客户端。
  • 当 ctrl+f5 强制刷新网页时,直接从服务器加载,跳过强缓存和协商缓存;
  • 当 f5刷新网页时,跳过强缓存,可是会检查协商缓存;

强缓存

  • Expires(该字段是 http1.0 时的规范,值为一个绝对时间的 GMT 格式的时间字符串,表明缓存资源的过时时间)
  • Cache-Control:max-age(该字段是 http1.1的规范,强缓存利用其 max-age 值来判断缓存资源的最大生命周期,它的值单位为秒)

协商缓存

  • Last-Modified(值为资源最后更新时间,随服务器response返回)
  • If-Modified-Since(经过比较两个时间来判断资源在两次请求期间是否有过修改,若是没有修改,则命中协商缓存)
  • ETag(表示资源内容的惟一标识,随服务器response返回)
  • If-None-Match(服务器经过比较请求头部的If-None-Match与当前资源的ETag是否一致来判断资源是否在两次请求之间有过修改,若是没有修改,则命中协商缓存)

82 WebSocket

因为 http 存在一个明显的弊端(消息只能有客户端推送到服务器端,而服务器端不能主动推送到客户端),致使若是服务器若是有连续的变化,这时只能使用轮询,而轮询效率太低,并不适合。因而 WebSocket被发明出来

相比与 http 具备如下有点

  • 支持双向通讯,实时性更强;
  • 能够发送文本,也能够二进制文件;
  • 协议标识符是 ws,加密后是 wss ;
  • 较少的控制开销。链接建立后,ws客户端、服务端进行数据交换时,协议控制的数据包头部较小。在不包含头部的状况下,服务端到客户端的包头只有2~10字节(取决于数据包长度),客户端到服务端的的话,须要加上额外的4字节的掩码。而HTTP协议每次通讯都须要携带完整的头部;
  • 支持扩展。ws协议定义了扩展,用户能够扩展协议,或者实现自定义的子协议。(好比支持自定义压缩算法等)
  • 无跨域问题。

实现比较简单,服务端库如 socket.iows,能够很好的帮助咱们入门。而客户端也只须要参照 api实现便可

83 尽量多的说出你对 Electron 的理解

最最重要的一点,electron 其实是一个套了 Chrome 的 node程序

因此应该是从两个方面说开来

  • Chrome (无各类兼容性问题);
  • NodeNode 能作的它也能作)

84 深浅拷贝

浅拷贝

  • Object.assign
  • 或者展开运算符

深拷贝

  • 能够经过 JSON.parse(JSON.stringify(object)) 来解决
let a = { age: 1, jobs: { first: 'FE' } } let b = JSON.parse(JSON.stringify(a)) a.jobs.first = 'native' console.log(b.jobs.first) // FE

该方法也是有局限性的

  • 会忽略 undefined
  • 不能序列化函数
  • 不能解决循环引用的对象

85 防抖/节流

防抖

在滚动事件中须要作个复杂计算或者实现一个按钮的防二次点击操做。能够经过函数防抖动来实现

// 使用 underscore 的源码来解释防抖动 /**  * underscore 防抖函数,返回函数连续调用时,空闲时间必须大于或等于 wait,func 才会执行  *  * @param {function} func 回调函数  * @param {number} wait 表示时间窗口的间隔  * @param {boolean} immediate 设置为ture时,是否当即调用函数  * @return {function} 返回客户调用函数  */ _.debounce = function(func, wait, immediate) { var timeout, args, context, timestamp, result; var later = function() { // 如今和上一次时间戳比较 var last = _.now() - timestamp; // 若是当前间隔时间少于设定时间且大于0就从新设置定时器 if (last < wait && last >= 0) { timeout = setTimeout(later, wait - last); } else { // 不然的话就是时间到了执行回调函数 timeout = null; if (!immediate) { result = func.apply(context, args); if (!timeout) context = args = null; } } }; return function() { context = this; args = arguments; // 得到时间戳 timestamp = _.now(); // 若是定时器不存在且当即执行函数 var callNow = immediate && !timeout; // 若是定时器不存在就建立一个 if (!timeout) timeout = setTimeout(later, wait); if (callNow) { // 若是须要当即执行函数的话 经过 apply 执行 result = func.apply(context, args); context = args = null; } return result; }; };

总体函数实现

对于按钮防点击来讲的实现

  • 开始一个定时器,只要我定时器还在,无论你怎么点击都不会执行回调函数。一旦定时器结束并设置为 null,就能够再次点击了
  • 对于延时执行函数来讲的实现:每次调用防抖动函数都会判断本次调用和以前的时间间隔,若是小于须要的时间间隔,就会从新建立一个定时器,而且定时器的延时为设定时间减去以前的时间间隔。一旦时间到了,就会执行相应的回调函数

节流

防抖动和节流本质是不同的。防抖动是将屡次执行变为最后一次执行,节流是将屡次执行变成每隔一段时间执行

/**
 * underscore 节流函数,返回函数连续调用时,func 执行频率限定为 次 / wait  *  * @param {function} func 回调函数  * @param {number} wait 表示时间窗口的间隔  * @param {object} options 若是想忽略开始函数的的调用,传入{leading: false}。  * 若是想忽略结尾函数的调用,传入{trailing: false}  * 二者不能共存,不然函数不能执行  * @return {function} 返回客户调用函数  */ _.throttle = function(func, wait, options) { var context, args, result; var timeout = null; // 以前的时间戳 var previous = 0; // 若是 options 没传则设为空对象 if (!options) options = {}; // 定时器回调函数 var later = function() { // 若是设置了 leading,就将 previous 设为 0 // 用于下面函数的第一个 if 判断 previous = options.leading === false ? 0 : _.now(); // 置空一是为了防止内存泄漏,二是为了下面的定时器判断 timeout = null; result = func.apply(context, args); if (!timeout) context = args = null; }; return function() { // 得到当前时间戳 var now = _.now(); // 首次进入前者确定为 true // 若是须要第一次不执行函数 // 就将上次时间戳设为当前的 // 这样在接下来计算 remaining 的值时会大于0 if (!previous && options.leading === false) previous = now; // 计算剩余时间 var remaining = wait - (now - previous); context = this; args = arguments; // 若是当前调用已经大于上次调用时间 + wait // 或者用户手动调了时间 // 若是设置了 trailing,只会进入这个条件 // 若是没有设置 leading,那么第一次会进入这个条件 // 还有一点,你可能会以为开启了定时器那么应该不会进入这个 if 条件了 // 其实仍是会进入的,由于定时器的延时 // 并非准确的时间,极可能你设置了2秒 // 可是他须要2.2秒才触发,这时候就会进入这个条件 if (remaining <= 0 || remaining > wait) { // 若是存在定时器就清理掉不然会调用二次回调 if (timeout) { clearTimeout(timeout); timeout = null; } previous = now; result = func.apply(context, args); if (!timeout) context = args = null; } else if (!timeout && options.trailing !== false) { // 判断是否设置了定时器和 trailing // 没有的话就开启一个定时器 // 而且不能不能同时设置 leading 和 trailing timeout = setTimeout(later, remaining); } return result; }; };

86 谈谈变量提高?

当执行 JS 代码时,会生成执行环境,只要代码不是写在函数中的,就是在全局执行环境中,函数中的代码会产生函数执行环境,只此两种执行环境

  • 接下来让咱们看一个老生常谈的例子,var
b() // call b console.log(a) // undefined var a = 'Hello world' function b() { console.log('call b') }

::: tip 变量提高
这是由于函数和变量提高的缘由。一般提高的解释是说将声明的代码移动到了顶部,这其实没有什么错误,便于你们理解。可是更准确的解释应该是:在生成执行环境时,会有两个阶段。第一个阶段是建立的阶段,JS 解释器会找出须要提高的变量和函数,而且给他们提早在内存中开辟好空间,函数的话会将整个函数存入内存中,变量只声明而且赋值为 undefined,因此在第二个阶段,也就是代码执行阶段,咱们能够直接提早使用
:::

在提高的过程当中,相同的函数会覆盖上一个函数,而且函数优先于变量提高

b() // call b second function b() { console.log('call b fist') } function b() { console.log('call b second') } var b = 'Hello world'

复制代码var 会产生不少错误,因此在 ES6中引入了 letlet 不能在声明前使用,可是这并非常说的 let 不会提高,let 提高了,在第一阶段内存也已经为他开辟好了空间,可是由于这个声明的特性致使了并不能在声明前使用

4、jQuery

1 你以为jQuery或zepto源码有哪些写的好的地方

  • jquery源码封装在一个匿名函数的自执行环境中,有助于防止变量的全局污染,而后经过传入window对象参数,能够使window对象做为局部变量使用,好处是当jquery中访问window对象的时候,就不用将做用域链退回到顶层做用域了,从而能够更快的访问window对象。一样,传入undefined参数,能够缩短查找undefined时的做用域链
 (function( window, undefined ) { //用一个函数域包起来,就是所谓的沙箱 //在这里边var定义的变量,属于这个函数域内的局部变量,避免污染全局 //把当前沙箱须要的外部变量经过函数参数引入进来 //只要保证参数对内提供的接口的一致性,你还能够随意替换传进来的这个参数 window.jQuery = window.$ = jQuery; })( window );
  • jquery将一些原型属性和方法封装在了jquery.prototype中,为了缩短名称,又赋值给了jquery.fn,这是很形象的写法
  • 有一些数组或对象的方法常常能使用到,jQuery将其保存为局部变量以提升访问速度
  • jquery实现的链式调用能够节约代码,所返回的都是同一个对象,能够提升代码效率

2 jQuery 的实现原理

  • (function(window, undefined) {})(window);

  • jQuery 利用 JS 函数做用域的特性,采用当即调用表达式包裹了自身,解决命名空间和变量污染问题

  • window.jQuery = window.$ = jQuery;

  • 在闭包当中将 jQuery 和 $ 绑定到 window 上,从而将 jQuery 和 $ 暴露为全局变量

jQuery.fn 的 init 方法返回的 this 指的是什么对象

  • jQuery.fn 的 init 方法 返回的 this 就是 jQuery 对象
  • 用户使用 jQuery() 或 $() 便可初始化 jQuery 对象,不须要动态的去调用 init 方法

4 jQuery.extend 与 jQuery.fn.extend 的区别

  • $.fn.extend() 和 $.extend() 是 jQuery 为扩展插件提拱了两个方法
  • $.extend(object); // 为jQuery添加“静态方法”(工具方法)
$.extend({   min: function(a, b) { return a < b ? a : b; },   max: function(a, b) { return a > b ? a : b; } }); $.min(2,3); // 2 $.max(4,5); // 5
  • $.extend([true,] targetObject, object1[, object2]); // 对targt对象进行扩展
var settings = {validate:false, limit:5}; var options = {validate:true, name:"bar"}; $.extend(settings, options); // 注意:不支持第一个参数传 false // settings == {validate:true, limit:5, name:"bar"}
  • $.fn.extend(json); // 为jQuery添加“成员函数”(实例方法)
$.fn.extend({ alertValue: function() { $(this).click(function(){ alert($(this).val()); }); } }); $("#email").alertValue();

5 jQuery 的属性拷贝(extend)的实现原理是什么,如何实现深拷贝

  • 浅拷贝(只复制一份原始对象的引用)
    var newObject = $.extend({}, oldObject);

  • 深拷贝(对原始对象属性所引用的对象进行进行递归拷贝)
    var newObject = $.extend(true, {}, oldObject);

6 jQuery 的队列是如何实现的

  • jQuery 核心中有一组队列控制方法,由 queue()/dequeue()/clearQueue() 三个方法组成。
  • 主要应用于 animate()ajax,其余要按时间顺序执行的事件中
var func1 = function(){alert('事件1');} var func2 = function(){alert('事件2');} var func3 = function(){alert('事件3');} var func4 = function(){alert('事件4');} // 入栈队列事件 $('#box').queue("queue1", func1); // push func1 to queue1 $('#box').queue("queue1", func2); // push func2 to queue1 // 替换队列事件 $('#box').queue("queue1", []); // delete queue1 with empty array $('#box').queue("queue1", [func3, func4]); // replace queue1 // 获取队列事件(返回一个函数数组) $('#box').queue("queue1"); // [func3(), func4()] // 出栈队列事件并执行 $('#box').dequeue("queue1"); // return func3 and do func3 $('#box').dequeue("queue1"); // return func4 and do func4 // 清空整个队列 $('#box').clearQueue("queue1"); // delete queue1 with clearQueue

7 jQuery 中的 bind(), live(), delegate(), on()的区别

  • bind 直接绑定在目标元素上
  • live 经过冒泡传播事件,默认document上,支持动态数据
  • delegate 更精确的小范围使用事件代理,性能优于 live
  • on 是最新的1.9版本整合了以前的三种方式的新事件绑定机制

8 是否知道自定义事件

  • 事件即“发布/订阅”模式,自定义事件即“消息发布”,事件的监听即“订阅订阅”
  • JS 原生支持自定义事件,示例:
  document.createEvent(type); // 建立事件 event.initEvent(eventType, canBubble, prevent); // 初始化事件 target.addEventListener('dataavailable', handler, false); // 监听事件 target.dispatchEvent(e); // 触发事件
  • jQuery 里的fire 函数用于调用jQuery自定义事件列表中的事件

9 jQuery 经过哪一个方法和 Sizzle 选择器结合的

  • Sizzle 选择器采起 Right To Left 的匹配模式,先搜寻全部匹配标签,再判断它的父节点
  • jQuery 经过 $(selecter).find(selecter); 和 Sizzle 选择器结合

10 jQuery 中如何将数组转化为 JSON 字符串,而后再转化回来

// 经过原生 JSON.stringify/JSON.parse 扩展 jQuery 实现 $.array2json = function(array) { return JSON.stringify(array); } $.json2array = function(array) { // $.parseJSON(array); // 3.0 开始,已过期 return JSON.parse(array); } // 调用 var json = $.array2json(['a', 'b', 'c']); var array = $.json2array(json);

11 jQuery 一个对象能够同时绑定多个事件,这是如何实现的

  $("#btn").on("mouseover mouseout", func); $("#btn").on({ mouseover: func1, mouseout: func2, click: func3 });

12 针对 jQuery 的优化方法

  • 缓存频繁操做DOM对象
  • 尽可能使用id选择器代替class选择器
  • 老是从#id选择器来继承
  • 尽可能使用链式操做
  • 使用时间委托 on绑定事件
  • 采用jQuery的内部函数data()来存储数据
  • 使用最新版本的 jQuery

13 jQuery 的 slideUp 动画,当鼠标快速连续触发, 动画会滞后反复执行,该如何处理呢

  • 在触发元素上的事件设置为延迟处理:使用 JS 原生 setTimeout 方法
  • 在触发元素的事件时预先中止全部的动画,再执行相应的动画事件:$('.tab').stop().slideUp();

14 jQuery UI 如何自定义组件

  • 经过向 $.widget() 传递组件名称和一个原型对象来完成
  • $.widget("ns.widgetName", [baseWidget], widgetPrototype);

15 jQuery 与 jQuery UI、jQuery Mobile 区别

  • jQuery 是 JS 库,兼容各类PC浏览器,主要用做更方便地处理 DOM、事件、动画、AJAX

  • jQuery UI 是创建在 jQuery 库上的一组用户界面交互、特效、小部件及主题

  • jQuery Mobile 以 jQuery 为基础,用于建立“移动Web应用”的框架

16 jQuery 和 Zepto 的区别? 各自的使用场景

  • jQuery 主要目标是PC的网页中,兼容所有主流浏览器。在移动设备方面,单独推出 `jQuery Mobile
  • Zepto从一开始就定位移动设备,相对更轻量级。它的API 基本兼容jQuery`,但对PC浏览器兼容不理想

17 jQuery对象的特色

  • 只有 JQuery对象才能使用 JQuery 方法
  • JQuery 对象是一个数组对象

5、Bootstrap

1 什么是Bootstrap?以及为何要使用Bootstrap?

Bootstrap 是一个用于快速开发 Web应用程序和网站的前端框架。Bootstrap是基于 HTMLCSSJAVASCRIPT 的

  • Bootstrap具备移动设备优先、浏览器支持良好、容易上手、响应式设计等优势,因此Bootstrap被普遍应用

2 使用Bootstrap时,要声明的文档类型是什么?以及为何要这样声明?

  • 使用Bootstrap时,须要使用 HTML5 文档类型(Doctype)。<!DOCTYPE html>
  • 由于Bootstrap使用了一些 HTML5 元素和 CSS 属性,若是在 Bootstrap建立的网页开头不使用 HTML5的文档类型(Doctype),可能会面临一些浏览器显示不一致的问题,甚至可能面临一些特定情境下的不一致,以至于代码不能经过 W3C 标准的验证

3 什么是Bootstrap网格系统

Bootstrap 包含了一个响应式的、移动设备优先的、不固定的网格系统,能够随着设备或视口大小的增长而适当地扩展到 12 列。它包含了用于简单的布局选项的预约义类,也包含了用于生成更多语义布局的功能强大的混合类

  • 响应式网格系统随着屏幕或视口(viewport)尺寸的增长,系统会自动分为最多12列。

4 Bootstrap 网格系统(Grid System)的工做原理

  • (1)行必须放置在 .container class 内,以便得到适当的对齐(alignment)和内边距(padding)。
  • (2)使用行来建立列的水平组。
  • (3)内容应该放置在列内,且惟有列能够是行的直接子元素。
  • (4)预约义的网格类,好比 .row 和 .col-xs-4,可用于快速建立网格布局。LESS 混合类可用于更多语义布局。
  • (5)列经过内边距(padding)来建立列内容之间的间隙。该内边距是经过 .rows 上的外边距(margin)取负,表示第一列和最后一列的行偏移。
  • (6)网格系统是经过指定您想要横跨的十二个可用的列来建立的。例如,要建立三个相等的列,则使用三个 .col-xs-4

5 对于各种尺寸的设备,Bootstrap设置的class前缀分别是什么

  • 超小设备手机(<768px):.col-xs-
  • 小型设备平板电脑(>=768px):.col-sm-
  • 中型设备台式电脑(>=992px):.col-md-
  • 大型设备台式电脑(>=1200px):.col-lg-

6 Bootstrap 网格系统列与列之间的间隙宽度是多少

间隙宽度为30px(一个列的每边分别是15px

7 若是须要在一个标题的旁边建立副标题,能够怎样操做

在元素两旁添加<small>,或者添加.smallclass

8 用Bootstrap,如何设置文字的对齐方式?

  • class="text-center" 设置居中文本
  • class="text-right" 设置向右对齐文本
  • class="text-left" 设置向左对齐文本

9 Bootstrap如何设置响应式表格?

增长class="table-responsive"

10 使用Bootstrap建立垂直表单的基本步骤?

  • (1)向父<form>元素添加role="form"

  • (2)把标签和控件放在一个带有class="form-group"<div>中,这是获取最佳间距所必需的;

  • (3)向全部的文本元素<input><textarea><select>添加class="form-control"

11 使用Bootstrap建立水平表单的基本步骤?

  • (1)向父<form>元素添加class="form-horizontal"

  • (2)把标签和控件放在一个带有class="form-group"<div>中;

  • (3)向标签添加class="control-label"

12 使用Bootstrap如何建立表单控件的帮助文本?

增长class="help-block"span标签或p标签。

13 使用Bootstrap激活或禁用按钮要如何操做?

  • 激活按钮:给按钮增长.activeclass
  • 禁用按钮:给按钮增长disabled="disabled"的属性

14 Bootstrap有哪些关于的class?

  • (1).img-rounded 为图片添加圆角
  • (2).img-circle 将图片变为圆形
  • (3).img-thumbnail 缩略图功能
  • (4).img-responsive 图片响应式 (将很好地扩展到父元素)

15 Bootstrap中有关元素浮动及清除浮动的class?

  • (1)class="pull-left" 元素浮动到左边

  • (2)class="pull-right" 元素浮动到右边

  • (3)class="clearfix" 清除浮动

16 除了屏幕阅读器外,其余设备上隐藏元素的class?

`class="sr-only"``

17 Bootstrap如何制做下拉菜单?

  • (1)将下拉菜单包裹在class="dropdown"<div>中;
  • (2)在触发下拉菜单的按钮中添加:class="btn dropdown-toggle" id="dropdownMenu1" data-toggle="dropdown"
  • (3)在包裹下拉菜单的ul中添加:class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1"
  • (4)在下拉菜单的列表项中添加:role="presentation"。其中,下拉菜单的标题要添加class="dropdown-header",选项部分要添加tabindex="-1"

18 Bootstrap如何制做按钮组?以及水平按钮组和垂直按钮组的优先级?

  • (1)用class="btn-group"<div>去包裹按钮组;class="btn-group-vertical"可设置垂直按钮组。
  • (2)btn-group的优先级高于btn-group-vertical的优先级。

19 Bootstrap如何设置按钮的下拉菜单?

在一个 .btn-group 中放置按钮和下拉菜单便可。

20 Bootstrap中的输入框组如何制做?

  • (1)把前缀或者后缀元素放在一个带有class="input-group"中的<div>
  • (2)在该<div>内,在class="input-group-addon"<span>里面放置额外的内容;
  • (3)把<span>放在<input>元素的前面或后面。

21 Bootstrap中的导航都有哪些?

  • (1)导航元素:有class="nav nav-tabs"的标签页导航,还有class="nav nav-pills"的胶囊式标签页导航;
  • (2)导航栏:class="navbar navbar-default" role="navigation"
  • (3)面包屑导航:class="breadcrumb"

22 Bootstrap中设置分页的class?

  • 默认的分页:class="pagination"
  • 默认的翻页:class="pager"

23 Bootstrap中显示标签的class?

class="label"

24 Bootstrap中如何制做徽章?

<span class="badge">26</span>

25 Bootstrap中超大屏幕的做用是什么?

设置class="jumbotron"能够制做超大屏幕,该组件能够增长标题的大小并增长更多的外边距

6、webpack相关

1 打包体积 优化思路

  • 提取第三方库或经过引用外部文件的方式引入第三方库
  • 代码压缩插件UglifyJsPlugin
  • 服务器启用gzip压缩
  • 按需加载资源文件 require.ensure
  • 优化devtool中的source-map
  • 剥离css文件,单独打包
  • 去除没必要要插件,一般就是开发环境与生产环境用同一套配置文件致使

2 打包效率

  • 开发环境采用增量构建,启用热更新
  • 开发环境不作无心义的工做如提取css计算文件hash等
  • 配置devtool
  • 选择合适的loader
  • 个别loader开启cache 如babel-loader
  • 第三方库采用引入方式
  • 提取公共代码
  • 优化构建时的搜索路径 指明须要构建目录及不须要构建目录
  • 模块化引入须要的部分

3 Loader

编写一个loader

loader就是一个node模块,它输出了一个函数。当某种资源须要用这个loader转换时,这个函数会被调用。而且,这个函数能够经过提供给它的this上下文访问Loader API
reverse-txt-loader

// 定义 module.exports = function(src) { //src是原文件内容(abcde),下面对内容进行处理,这里是反转 var result = src.split('').reverse().join(''); //返回JavaScript源码,必须是String或者Buffer return `module.exports = '${result}'`; } //使用 { test: /\.txt$/, use: [ { './path/reverse-txt-loader' } ] },

7、编程题

1 写一个通用的事件侦听器函数

 // event(事件)工具集,来源:github.com/markyun markyun.Event = { // 视能力分别使用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.removeEventListener) { element.removeEventListener(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; }

2 如何判断一个对象是否为数组

function isArray(arg) { if (typeof arg === 'object') { return Object.prototype.toString.call(arg) === '[object Array]'; } return false; }

3 冒泡排序

  • 每次比较相邻的两个数,若是后一个比前一个小,换位置
var arr = [3, 1, 4, 6, 5, 7, 2]; function bubbleSort(arr) { for (var i = 0; i < arr.length - 1; i++) { for(var j = 0; j < arr.length - 1; j++) { if(arr[j + 1] < arr[j]) { var temp; temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } return arr; } console.log(bubbleSort(arr));

4 快速排序

  • 采用二分法,取出中间数,数组每次和中间数比较,小的放到左边,大的放到右边
var arr = [3, 1, 4, 6, 5, 7, 2]; function quickSort(arr) { if(arr.length == 0) { return []; // 返回空数组 } var cIndex = Math.floor(arr.length / 2); var c = arr.splice(cIndex, 1); var l = []; var r = []; for (var i = 0; i < arr.length; i++) { if(arr[i] < c) { l.push(arr[i]); } else { r.push(arr[i]); } } return quickSort(l).concat(c, quickSort(r)); } console.log(quickSort(arr));

5 编写一个方法 求一个字符串的字节长度

  • 假设:一个英文字符占用一个字节,一个中文字符占用两个字节
function GetBytes(str){ var len = str.length; var bytes = len; for(var i=0; i<len; i++){ if (str.charCodeAt(i) > 255) bytes++; } return bytes; } alert(GetBytes("你好,as")); 

6 bind的用法,以及如何实现bind的函数和须要注意的点

  • bind的做用与callapply相同,区别是callapply是当即调用函数,而bind是返回了一个函数,须要调用的时候再执行。
    一个简单的bind函数实现以下
Function.prototype.bind = function(ctx) { var fn = this; return function() { fn.apply(ctx, arguments); }; };

7 实现一个函数clone

能够对JavaScript中的5种主要的数据类型,包括NumberStringObjectArrayBoolean)进行值复

  • 考察点1:对于基本数据类型和引用数据类型在内存中存放的是值仍是指针这一区别是否清楚
  • 考察点2:是否知道如何判断一个变量是什么类型的
  • 考察点3:递归算法的设计
// 方法一:
  Object.prototype.clone = function(){
          var o = this.constructor === Array ? [] : {};
          for(var e in this){
                  o[e] = typeof this[e] === "object" ? this[e].clone() : this[e];
          }
          return o;
  }

 //方法二:
   /**
      * 克隆一个对象
      * @param Obj
      * @returns
      */
     function clone(Obj) {   
         var buf;   
         if (Obj instanceof Array) {   
             buf = [];                    //建立一个空的数组
             var i = Obj.length;   
             while (i--) {   
                 buf[i] = clone(Obj[i]);   
             }   
             return buf;    
         }else if (Obj instanceof Object){   
             buf = {};                   //建立一个空对象
             for (var k in Obj) {           //为这个对象添加新的属性
                 buf[k] = clone(Obj[k]);   
             }   
             return buf;   
         }else{                         //普通变量直接赋值
             return Obj;   
         }   
     }

8 下面这个ul,如何点击每一列的时候alert其index

�考察闭包

 <ul id=”test”> <li>这是第一条</li> <li>这是第二条</li> <li>这是第三条</li> </ul>
  // 方法一: var lis=document.getElementById('2223').getElementsByTagName('li'); for(var i=0;i<3;i++) { lis[i].index=i; lis[i].onclick=function(){ alert(this.index); } //方法二: var lis=document.getElementById('2223').getElementsByTagName('li'); for(var i=0;i<3;i++) { lis[i].index=i; lis[i].onclick=(function(a){ return function() { alert(a); } })(i); }

9 定义一个log方法,让它能够代理console.log的方法

可行的方法一:

 function log(msg) { console.log(msg); } log("hello world!") // hello world!

若是要传入多个参数呢?显然上面的方法不能知足要求,因此更好的方法是:

 function log(){ console.log.apply(console, arguments); };

10 输出今天的日期

YYYY-MM-DD的方式,好比今天是2014年9月26日,则输出2014-09-26

var d = new Date(); // 获取年,getFullYear()返回4位的数字 var year = d.getFullYear(); // 获取月,月份比较特殊,0是1月,11是12月 var month = d.getMonth() + 1; // 变成两位 month = month < 10 ? '0' + month : month; // 获取日 var day = d.getDate(); day = day < 10 ? '0' + day : day; alert(year + '-' + month + '-' + day);

11 用js实现随机选取10–100之间的10个数字,存入一个数组,并排序

var iArray = []; funtion getRandom(istart, iend){ var iChoice = istart - iend +1; return Math.floor(Math.random() * iChoice + istart; } for(var i=0; i<10; i++){ iArray.push(getRandom(10,100)); } iArray.sort();

12 写一段JS程序提取URL中的各个GET参数

有这样一个URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,请写一段JS程序提取URL中的各个GET参数(参数名和参数个数不肯定),将其按key-value形式返回到一个json结构中,如{a:’1′, b:’2′, c:”, d:’xxx’, e:undefined}

function serilizeUrl(url) { var result = {}; url = url.split("?")[1]; var map = url.split("&"); for(var i = 0, len = map.length; i < len; i++) { result[map[i].split("=")[0]] = map[i].split("=")[1]; } return result; }

13 写一个function,清除字符串先后的空格

使用自带接口trim(),考虑兼容性:

if (!String.prototype.trim) { String.prototype.trim = function() { return this.replace(/^\s+/, "").replace(/\s+$/,""); } } // test the function var str = " \t\n test string ".trim(); alert(str == "test string"); // alerts "true"

14 实现每隔一秒钟输出1,2,3...数字

for(var i=0;i<10;i++){ (function(j){ setTimeout(function(){ console.log(j+1) },j*1000) })(i) }

8、其余

1 负载均衡

多台服务器共同协做,不让其中某一台或几台超额工做,发挥服务器的最大做用

  • http重定向负载均衡:调度者根据策略选择服务器以302响应请求,缺点只有第一次有效果,后续操做维持在该服务器
    dns负载均衡:解析域名时,访问多个ip服务器中的一个(可监控性较弱)
  • 反向代理负载均衡:访问统一的服务器,由服务器进行调度访问实际的某个服务器,对统一的服务器要求大,性能受到 服务器群的数量

2 CDN

内容分发网络,基本思路是尽量避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。

3 内存泄漏

定义:程序中己动态分配的堆内存因为某种缘由程序未释放或没法释放引起的各类问题。

js中可能出现的内存泄漏状况

结果:变慢,崩溃,延迟大等,缘由:

  • 全局变量
  • dom清空时,还存在引用
  • ie中使用闭包
  • 定时器未清理
  • 子元素存在引发的内存泄露

避免策略

  • 减小没必要要的全局变量,或者生命周期较长的对象,及时对无用的数据进行垃圾回收;
  • 注意程序逻辑,避免“死循环”之类的 ;
  • 避免建立过多的对象 原则:不用了的东西要及时归还。
  • 减小层级过多的引用

4 babel原理

ES六、7代码输入 -> babylon进行解析 -> 获得AST(抽象语法树)-> plugin用babel-traverseAST树进行遍历转译 ->获得新的AST树->用babel-generator经过AST树生成ES5代码

5 js自定义事件

三要素: document.createEvent() event.initEvent() element.dispatchEvent()

// (en:自定义事件名称,fn:事件处理函数,addEvent:为DOM元素添加自定义事件,triggerEvent:触发自定义事件) window.onload = function(){ var demo = document.getElementById("demo"); demo.addEvent("test",function(){console.log("handler1")}); demo.addEvent("test",function(){console.log("handler2")}); demo.onclick = function(){ this.triggerEvent("test"); } } Element.prototype.addEvent = function(en,fn){ this.pools = this.pools || {}; if(en in this.pools){ this.pools[en].push(fn); }else{ this.pools[en] = []; this.pools[en].push(fn); } } Element.prototype.triggerEvent = function(en){ if(en in this.pools){ var fns = this.pools[en]; for(var i=0,il=fns.length;i<il;i++){ fns[i](); } }else{ return; } }

6 先后端路由差异

  • 后端每次路由请求都是从新访问服务器
  • 前端路由实际上只是JS根据URL来操做DOM元素,根据每一个页面须要的去服务端请求数据,返回数据后和模板进行组合

9、综合

1 谈谈你对重构的理解

  • 网站重构:在不改变外部行为的前提下,简化结构、添加可读性,而在网站前端保持一致的行为。也就是说是在不改变UI的状况下,对网站进行优化, 在扩展的同时保持一致的UI
  • 对于传统的网站来讲重构一般是:
    • 表格(table)布局改成DIV+CSS
    • 使网站前端兼容于现代浏览器(针对于不合规范的CSS、如对IE6有效的)
    • 对于移动平台的优化
    • 针对于SEO进行优化

2 什么样的前端代码是好的

  • 高复用低耦合,这样文件小,好维护,并且好扩展。

3 对前端工程师这个职位是怎么样理解的?它的前景会怎么样

  • 前端是最贴近用户的程序员,比后端、数据库、产品经理、运营、安全都近
    • 实现界面交互
    • 提高用户体验
    • 有了Node.js,前端能够实现服务端的一些事情
  • 前端是最贴近用户的程序员,前端的能力就是能让产品从 90分进化到 100 分,甚至更好,
  • 与团队成员,UI设计,产品经理的沟通;
  • 作好的页面结构,页面重构和用户体验;

4 你以为前端工程的价值体如今哪

  • 为简化用户使用提供技术支持(交互部分)
  • 为多个浏览器兼容性提供支持
  • 为提升用户浏览速度(浏览器性能)提供支持
  • 为跨平台或者其余基于webkit或其余渲染引擎的应用提供支持
  • 为展现数据提供支持(数据接口)

5 平时如何管理你的项目

  • 先期团队必须肯定好全局样式(globe.css),编码模式(utf-8) 等;
  • 编写习惯必须一致(例如都是采用继承式的写法,单样式都写成一行);
  • 标注样式编写人,各模块都及时标注(标注关键样式调用的地方);
  • 页面进行标注(例如 页面 模块 开始和结束);
  • CSSHTML 分文件夹并行存放,命名都得统一(例如style.css);
  • JS 分文件夹存放 命名以该JS功能为准的英文翻译。
  • 图片采用整合的 images.png png8 格式文件使用 - 尽可能整合在一块儿使用方便未来的管理

6 组件封装

目的:为了重用,提升开发效率和代码质量 注意:低耦合,单一职责,可复用性,可维护性 经常使用操做

  • 分析布局
  • 初步开发
  • 化繁为简
  • 组件抽象

10、一些常见问题

  • 自我介绍
  • 面试完你还有什么问题要问的吗
  • 你有什么爱好?
  • 你最大的优势和缺点是什么?
  • 你为何会选择这个行业,职位?
  • 你以为你适合从事这个岗位吗?
  • 你有什么职业规划?
  • 你对工资有什么要求?
  • 如何看待前端开发?
  • 将来三到五年的规划是怎样的?
  • 你的项目中技术难点是什么?遇到了什么问题?你是怎么解决的?
  • 大家部门的开发流程是怎样的
  • 你认为哪一个项目作得最好?
  • 说下工做中你作过的一些性能优化处理
  • 最近在看哪些前端方面的书?
  • 平时是如何学习前端开发的?
  • 你最有成就感的一件事
  • 你为何要离开前一家公司?
  • 你对加班的见解
  • 你但愿经过这份工做得到什么?
    • 我想经过这份工做好好的锻炼本身,提高本身的能力,同时为公司贡献本身的一份力量
相关文章
相关标签/搜索