Blog icon indicating copy to clipboard operation
Blog copied to clipboard

前端开发面试题大合集

Open CruxF opened this issue 7 years ago • 2 comments

前言

本文收集了一些前端面试题(为了方便阅读,建议先安装gayhub),主要是为了今后的求职,同时也借助这些面试题更进一步系统的学习、透彻的学习,形成自己的知识链。这并不是投机取巧,临时抱佛脚哈,自己也明白如果这么做肯定对未来的发展不利,不说这么多废话,下面正式开始。

前端开发所需掌握知识点概要(HTML&CSS):

  • 对Web标准的理解(结构、表现、行为)
  • 浏览器内核
  • 渲染原理
  • 依赖管理
  • 兼容性
  • CSS语法,层次关系,常用属性,布局,选择器,权重,盒模型,Hack,CSS预处理器
  • Flexbox布局
  • CSS Modules
  • Document flow
  • BFC概念以及应用
  • HTML5(离线 & 存储、Histoy,多媒体、WebGL\SVG\Canvas);

HTML

1、Doctype作用?标准模式与兼容模式各有什么区别?

(1)<!DOCTYPE>声明位于HTML文档中的第一行,处于 <html> 标签之前。告知浏览器的解析器用什么文档标准解析这个文档。DOCTYPE不存在或格式不正确会导致文档以兼容模式呈现。 (2)标准模式的排版 和JS运作模式都是以该浏览器支持的最高标准运行。在兼容模式中,页面以宽松的向后兼容的方式显示,模拟老式浏览器的行为以防止站点无法工作。

2、HTML5 为什么只需要写 <!DOCTYPE HTML>

HTML5 不基于 SGML,因此不需要对DTD进行引用,但是需要doctype来规范浏览器的行为(让浏览器按照它们应该的方式来运行);而HTML4.01基于SGML,所以需要对DTD进行引用,才能告知浏览器文档所使用的文档类型。

3、行内元素有哪些?块级元素有哪些? 空(void)元素有那些?

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

(1)行内元素有:a b span img input select strong(强调的语气) (2)块级元素有:div ul ol li dl dt dd h1 h2 h3 h4…p (3)常见的空元素:<br> <hr> <img> <input> <link> <meta> (4)鲜为人知的空元素:<area> <base> <col> <command> <embed> <keygen> <param> <source> <track> <wbr>

4、页面导入样式时,使用link和@import有什么区别?

(1)link属于XHTML标签,除了加载CSS外,还能用于定义RSS, 定义rel连接属性等作用;而@import是CSS提供的,只能用于加载CSS; (2)页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载; (3)import是CSS2.1 提出的,只在IE5以上才能被识别,而link是XHTML标签,无兼容问题;

5、html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?

(1)新特性:绘画 canvas;用于媒介回放的 video 和 audio 元素;语意化更好的内容元素,比如 article、footer、header、nav、section;表单控件,calendar、date、time、email、url、search;新的技术webworker, websocket, Geolocation;本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失; sessionStorage 的数据在浏览器关闭后自动删除; (2)移除的元素:纯表现的元素:basefont,big,center,font, s,strike,tt,u;对可用性产生负面影响的元素:frame,frameset,noframes; (3)兼容问题:IE8/IE7/IE6支持通过document.createElement方法产生的标签,可以利用这一特性让这些浏览器支持HTML5新标签,浏览器支持新标签后,还需要添加标签默认的样式。当然也可以直接使用成熟的框架、比如html5shim

6、简述一下你对HTML语义化的理解?

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

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

(1)在用户没有与因特网连接时,可以正常访问站点或应用,在用户与因特网连接时,更新用户机器上的缓存文件。 (2)原理:HTML5的离线存储是基于一个新建的.appcache文件的缓存机制(不是存储技术),通过这个文件上的解析清单离线存储资源,这些资源就会像cookie一样被存储了下来。之后当网络在处于离线状态下时,浏览器会通过被离线存储的数据进行页面展示。 (3)使用:离线存储使用案例

8、请描述一下 cookies,sessionStorage 和 localStorage 的区别?

(1)存储位置:cookie是网站为了标示用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密),cookie数据始终在同源的http请求中携带(即使不需要),记会在浏览器和服务器间来回传递。sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存。 (2)存储大小:cookie数据大小不能超过4k。sessionStorage和localStorage 虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大。 (3)存储时间:localStorage 存储持久数据,浏览器关闭后数据不丢失除非主动删除数据;sessionStorage 数据在当前浏览器窗口关闭后自动删除;cookie 设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭。

9、iframe有那些缺点?

(1)iframe会阻塞主页面的Onload事件; (2)搜索引擎的检索程序无法解读这种页面,不利于SEO; (3)iframe和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载。 【拓展】 如果需要使用iframe,最好是通过javascript动态给iframe添加src属性值,这样可以绕开以上两个问题。

10、Label的作用是什么?是怎么用的?

(1)作用:label标签来定义表单控制间的关系,当用户选择该标签时,浏览器会自动将焦点转到和标签相关的表单控件上。 (2)用法:

  <label for="Name">Number:</label>
  <input type=“text“name="Name" id="Name"/>

  <label>Date:<input type="text" name="B"/></label>

11、HTML5的form如何关闭自动完成功能?

给不想要提示的 form 或某个 input 设置为 autocomplete=off。

12、如何实现浏览器内多个标签页之间的通信?

(1)WebSocket、SharedWorker; (2)也可以调用localstorge、cookies等本地存储方式;

13、webSocket如何兼容低浏览器?

(1)Adobe Flash Socket ; (2)ActiveX HTMLFile (IE) ; (3)基于 multipart 编码发送 XHR; (4)基于长轮询的 XHR。

14、页面可见性(Page Visibility API) 可以有哪些用途?

(1)通过 visibilityState 的值检测页面当前是否可见,以及打开网页的时间等; (2)在页面被切换到其他后台进程的时候,自动暂停音乐或视频的播放;

15、title与h1的区别、b与strong的区别、i与em的区别?

(1)title属性没有明确意义只表示是个标题,H1则表示层次明确的标题,对页面信息的抓取也有很大的影响; (2)strong是标明重点内容,有语气加强的含义,使用阅读设备阅读网络时:<strong>会重读,而<b>是展示强调内容; (3)i内容展示为斜体,em表示强调的文本。

16、sessionStorage 、localStorage 和 cookie 之间的区别

(1)共同点:都是保存在浏览器端,且同源的。 (2)区别:cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递;cookie数据还有路径(path)的概念,可以限制cookie只属于某个路径下。存储大小限制也不同,cookie数据不能超过4k,同时因为每次http请求都会携带cookie,所以cookie只适合保存很小的数据,如会话标识。 (3)而sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存。sessionStorage和localStorage 虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大。 (4)数据有效期不同,sessionStorage:仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持;localStorage:始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;cookie只在设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭。 (5)作用域不同,sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面;localStorage 在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的。Web Storage 支持事件通知机制,可以将数据更新的通知发送给监听者。Web Storage 的 api 接口使用更方便。

17、HTML 5标签是否一定需要闭合?标签大小写是否敏感?

不一定;不敏感,但是推荐要用小写标签

18、HTML 中的DOM树

HTML DOM定义访问和操作HTML文档的标准方法。DOM将HTML文档表达为树结构。 image W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。W3C DOM 标准被分为 3 个不同的部分: (1)核心DOM,针对任何结构化文档的标准模型; (2)XML DOM,针对XML文档的标准模型; (3)HTML DOM,针对HTML文档的标准模型,它是标准对象模型,是标准编程接口; 根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:整个文档是一个文档节点、每个HTML元素是元素节点、HTML元素内的文本是文本节点、每个HTML属性是属性节点、注释是注释节点。

19、XHTML和HTML有什么区别?

(1)HTML是一种基本的web网页设计语言,XHTML是一个基于XML的置标语言; (2)XHTML元素必须被正确的嵌套; (3)XHTML元素必须被关闭; (4)XHTML元素必须使用小写字母; (5)XHTML文档必须拥有根元素。

20、canvas和svg图形的区别是什么? image

21、如果我不放入<! DOCTYPE html> ,HTML5还会工作么?

不会,浏览器将不能识别他是HTML文档,同时HTML5的标签将不能正常工作

CSS

1、介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的?如何设置这两种模型?

(1)有两种, IE 盒子模型、W3C 盒子模型; (2)盒模型: 内容(content)、填充(padding)、边界(margin)、 边框(border); (3)区 别: 这两种盒子模型最主要的区别就是width的包含范围,在标准的盒子模型中,width指content部分的宽度,在IE盒子模型中,width表示content+padding+border这三个部分的宽度,故这使得在计算整个盒子的宽度时存在着差异。 (4)标准盒模型box-sizing:content-box;IE盒模型box-sizing:border-box

2、CSS选择符有哪些?哪些属性可以继承?

(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 ;

3、CSS优先级算法如何计算?

优先级就近原则,同权重情况下样式定义最近者为准; 载入样式以最后载入的定位为准;
(1)同权重:内联样式表(标签内部)> 嵌入样式表(当前文件中)> 外部样式表(外部文件中) (2)不同权重:!important > id > class > tag,其中important 比 内联优先级高

4、CSS3新增伪类有那些?

(1)p:first-of-type     选择属于其父元素的首个 <p> 元素的每个<p>元素。 (2)p:last-of-type     选择属于其父元素的最后 <p> 元素的每个<p>元素。 (3)p:only-of-type     选择属于其父元素唯一的 <p> 元素的每个 <p> 元素。 (4)p:only-child     选择属于其父元素的唯一子元素的每个<p>元素。 (5)p:nth-child(2)     选择属于其父元素的第二个子元素的每个 <p> 元素。 (6):checked      单选框或复选框被选中。 (7):disabled     控制表单控件的禁用状态。

5、如何居中div?

(1)水平居中:给div设置一个宽度,然后添加margin:0 auto属性

div {
  width: 200px;
  margin: 0 auto;
}

(2)让绝对定位的div居中

div {
  position: absolute;
  width: 300px;
  height: 300px;
  margin: auto;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  /* 方便看效果 */
  background-color: pink; 
}

(3)水平垂直居中一

 div {
   /* 相对定位或绝对定位均可 */
   position: relative;
   width: 500px;
   height: 300px;
   top: 50%;
   left: 50%;
   /* 外边距为自身宽高的一半 */
   margin: -150px 0 0 -250px;
   /* 方便看效果 */
   background-color: pink;
 }

(4)水平垂直居中二

div {
  /* 相对定位或绝对定位均可 */
  position: absolute;
  width: 500px;
  height: 300px;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  /* 方便看效果 */
  background-color: pink;
}

(5)水平垂直居中三

.container {
  display: flex;
  height: 500px;
  width: 500px;
  border: 1px solid #ccc;
  /* 垂直居中 */
  align-items: center;
  /* 水平居中 */
  justify-content: center;
}
.container div {
  width: 100px;
  height: 100px;
  /* 方便看效果 */
  background-color: pink;
}

6、display有哪些值?说明他们的作用。

(1)block     块类型。默认宽度为父元素宽度,可设置宽高,换行显示。 (2)none     缺省值。象行内元素类型一样显示。 (3)inline     行内元素类型。默认宽度为内容宽度,不可设置宽高,同行显示。 (4)inline-block     默认宽度为内容宽度,可以设置宽高,同行显示。 (5)list-item     象块类型元素一样显示,并添加样式列表标记。 (6)table     此元素会作为块级表格来显示。 (7)inherit     规定应该从父元素继承 display 属性的值。

7、position的值relative和absolute定位原点是?

(1)absolute:生成绝对定位的元素,相对于值不为 static的第一个父元素进行定位。 (2)fixed(老IE不支持):生成绝对定位的元素,相对于浏览器窗口进行定位。 (3)relative:生成相对定位的元素,相对于其正常位置进行定位。 (4)static:默认值,没有定位,元素出现在正常的流中(忽略 top, bottom, left, right z-index 声明)。 (5)inherit:规定从父元素继承 position 属性的值。

8、CSS3有哪些新特性?

(1)新增各种CSS选择器    (: not(.input):所有 class 不是“input”的节点) (2)圆角    (border-radius:8px) (3)多列布局    (multi-column layout) (4)阴影和反射    (Shadow\Reflect) (5)文字特效    (text-shadow、) (6)文字渲染    (Text-decoration) (7)线性渐变    (gradient) (8)旋转    (transform) (9)缩放,定位,倾斜,动画,多背景 例如:transform:\scale(0.85,0.90)\ translate(0px,-30px)\ skew(-9deg,0deg)\Animation:

9、请解释一下CSS3的Flexbox(弹性盒布局模型),以及适用场景?

(1)一个用于页面布局的全新CSS3功能,Flexbox可以把列表放在同一个方向(从上到下排列,从左到右),并让列表能延伸到占用可用的空间。 (2)较为复杂的布局还可以通过嵌套一个伸缩容器(flex container)来实现。 (3)采用Flex布局的元素,称为Flex容器(flex container),简称"容器"。 (4)它的所有子元素自动成为容器成员,称为Flex项目(flex item),简称"项目"。 (5)常规布局是基于块和内联流方向,而Flex布局是基于flex-flow流可以很方便的用来做局中,能对不同屏幕大小自适应。 (6)在布局上有了比以前更加灵活的空间。 使用指南

10、用纯CSS创建一个三角形的原理是什么?

把上、左、右三条边框隐藏掉(颜色设为 transparent)

div {
  height: 0;
  width: 0;
  display: block;
  border: transparent solid 20px;
  border-left: #005AA0 solid 20px;
}

11、一个满屏 品 字布局 如何设计?

简单的方式:上面的div宽100%,下面的两个div分别宽50%,然后用float或者inline使其不换行即可

12、css多列等高如何实现?

利用padding-bottom|margin-bottom正负值相抵;设置父容器设置超出隐藏(overflow:hidden),这样子父容器的高度就还是它里面的列没有设定padding-bottom时的高度,当它里面的任 一列高度增加了,则父容器的高度被撑到里面最高那列的高度,其他比这列矮的列会用它们的padding-bottom补偿这部分高度差。

<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>CSS</title>
    <style type="text/css">
      * {
        margin: 0;
        padding: 0;
        font-size: 12px;
      }
      #wrap {
        overflow: hidden;
        width: 670px;
        margin: 10px auto;
        padding-bottom: 10px;
        position: relative;
      }
      .box {
        float: left;
        display: inline;
        margin-top: 10px;
        width: 190px;
        background: #c8c8c8;
        margin-left: 10px;
        padding: 10px;
        padding-bottom: 820px;
        margin-bottom: -800px;
      }
    </style>
  </head>
  <body>
    <div id="wrap">
      <div class="box">
        <h1>CSS实现三列DIV等高布局</h1>
        <p>
          这确实是个很简单的问题,也许你也已经相当熟悉,但很多人还不知道。 下面介绍的技术是一个简捷的小技巧,它一定可以帮助你解决这个头痛的问题。
        </p>
      </div>
      <div class="box">
        <h1>三列DIV等高</h1>
        <p></p>
      </div>
      <div class="box">
        <h1>CSS实现</h1>
        <p></p>
      </div>
    </div>
  </body>
</html>

13、li与li之间有看不见的空白间隔是什么原因引起的?有什么解决办法?

行框的排列会受到中间空白(回车\空格)等的影响,因为空格也属于字符,这些空白也会被应用样式,占据空间,所以会有间隔,把字符大小设为0,就没有空格了。

<!DOCTYPE html>
<html lang="zh">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <style>
      ul {
        list-style: none;
        /*解决空格问题*/
        font-size: 0;
      }
      li {
        display: inline-block;
        height: 70px;
        width: 150px;
        line-height: 70px;
        text-align: center;
        border: #005AA0 solid 2px;
        /*解决空格问题*/
        font-size: 16px;
      }
    </style>
  </head>
  <body>
    <ul>
      <li>li标签</li>
      <li>li标签</li>
      <li>li标签</li>
    </ul>
  </body>
</html>

14、为什么要初始化CSS样式?

因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异。当然,初始化样式会对SEO有一定的影响,但鱼和熊掌不可兼得,但力求影响最小的情况下初始化。

15、子class选择器设置蓝色,父id选择器设置红色,最终会显示哪个?

一定是子元素设置的选择器最优先,要不然页面就乱套了。所以答案是蓝色。

16、请解释一下为什么需要清除浮动?清除浮动的方式

清除浮动是为了清除使用浮动元素产生的影响。浮动的元素,高度会塌陷,而高度的塌陷使我们页面后面的布局不能正常显示。

<!DOCTYPE html>
<html lang="zh">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <style>
      .box {
        width: 510px;
        border: #0000FF solid 1px;
      }
      .box:after {
        content: "";
        visibility: hidden;
        display: block;
        height: 0;
        clear: both;
      }
      .left {
        float: left;
        width: 250px;
        height: 100px;
        background-color: green;
      }
      .right {
        float: left;
        width: 250px;
        height: 100px;
        background-color: red;
      }
    </style>
  </head>
  <body>
    <div class="box">
      <div class="left"></div>
      <div class="right"></div>
    </div>
  </body>
</html>

解析原理: (1) display:block 使生成的元素以块级元素显示,占满剩余空间 (2)height:0 避免生成内容破坏原有布局的高度 (3) visibility:hidden 使生成的内容不可见,并允许可能被生成内容盖住的内容可以进行点击和交互 (4)通过 content:"."生成内容作为最后一个元素,至于content里面是点还是其他都是可以的,例如oocss里面就有经典的 content:"."有些版本可能content 里面内容为空,一丝冰凉是不推荐这样做的 (5)zoom:1 触发IE hasLayout。

17、什么是外边距合并?

外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距,合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者。

18、CSS优化、提高性能的方法有哪些?

(1)关键选择器(key selector),选择器的最后面的部分为关键选择器(即用来匹配目标元素的部分); (2)如果规则拥有 ID 选择器作为其关键选择器,则不要为规则增加标签,过滤掉无关的规则(这样样式系统就不会浪费时间去匹配它们了); (3)提取项目的通用公有样式,增强可复用性,按模块编写组件; (4)增强项目的协同开发性、可维护性和可扩展性; (5)使用预处理工具或构建工具(gulp对css进行语法检查、自动补前缀、打包压缩、自动优雅降级);

19、浏览器是怎样解析CSS选择器的?

样式系统从关键选择器开始匹配,然后左移查找规则选择器的祖先元素。只要选择器的子树一直在工作,样式系统就会持续左移,直到和规则匹配,或者是因为不匹配而放弃该规则。

20、设置元素浮动后,该元素的display值是多少?

自动变成了 display:block

21、让页面里的字体变清晰,变细用CSS怎么做?

-webkit-font-smoothing: antialiased;

22、什么是CSS 预处理器 / 后处理器?

(1)预处理器:LESS、Sass、Stylus,用来预编译Sass或less,增强了css代码的复用性,还有层级、mixin、变量、循环、函数等,具有很方便的UI组件模块化开发能力,极大的提高工作效率。 (2)后处理器:PostCSS,通常被视为在完成的样式表中根据CSS规范处理CSS,让其更有效;目前最常做的是给CSS属性添加浏览器私有前缀,实现跨浏览器兼容性的问题。

23、em和rem的区别在哪里?

(1)em是相对长度单位,相对于当前对象内文本的字体尺寸; (2)em是CSS3新增的一个相对单位(root em,根em),这个单位与em有什么区别呢?区别在于使用rem为元素设定字体大小时,仍然是相对大小,但相对的只是HTML根元素。

24、假设高度已知,请写出三栏布局,其中左栏和右栏宽度各为300px,中间自适应

(1)利用浮动

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Layout</title>
    <style>
      html * {
        margin: 0;
        padding: 0;
      }
      .layout article div {
        min-height: 100px;
      }
      .layout.float .left {
        float: left;
        width: 300px;
        background: red;
      }
      .layout.float .right {
        float: right;
        width: 300px;
        background: blue;
      }
      .layout.float .center {
        background: yellow;
      }
    </style>
  </head>
  <body>
    <section class="layout float">
      <article class="left-right-center">
        <div class="left"></div>
        <div class="right"></div>
        <div class="center">
          <h1>浮动解决方案</h1>
          <p>
            这是三栏布局中间部分 这是三栏布局中间部分 这是三栏布局中间部分 这是三栏布局中间部分
          </p>
        </div>
      </article>
    </section>
  </body>
</html>

(2)利用绝对定位

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Layout</title>
    <style>
      html * {
        margin: 0;
        padding: 0;
      }
      .layout article div {
        min-height: 100px;
      }
      .layout.absolute .left-center-right>div {
        position: absolute;
      }
      .layout.absolute .left {
        left: 0;
        width: 300px;
        background: red;
      }
      .layout.absolute .center {
        left: 310px;
        right: 310px;
        background: yellow;
      }
      .layout.absolute .right {
        right: 0;
        width: 300px;
        background: blue;
      }
    </style>
  </head>
  <body>
    <section class="layout absolute">
      <article class="left-center-right">
        <div class="left"></div>
        <div class="center">
          <h1>绝对定位解决方案</h1>
          <p>
            这是三栏布局中间部分 这是三栏布局中间部分 这是三栏布局中间部分 这是三栏布局中间部分
          </p>
        </div>
        <div class="right"></div>
      </article>
    </section>
  </body>
</html>

(3)利用flexbox布局

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Layout</title>
    <style>
      html * {
        margin: 0;
        padding: 0;
      }
      .layout article div {
        min-height: 100px;
      }
      .layout.flexbox .left-center-right {
        display: flex;
      }
      .layout.flexbox .left {
        width: 300px;
        background: red;
      }
      .layout.flexbox .center {
        flex: 1;
        background: green;
      }
      .layout.flexbox .right {
        width: 300px;
        background: yellow;
      }
    </style>
  </head>
  <body>
    <section class="layout flexbox">
      <article class="left-center-right">
        <div class="left"></div>
        <div class="center">
          <h1>flexbox解决方案</h1>
          <p>
            这是三栏布局中间部分 这是三栏布局中间部分 这是三栏布局中间部分 这是三栏布局中间部分
          </p>
        </div>
        <div class="right"></div>
      </article>
    </section>
  </body>
</html>

(4)表格布局法

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Layout</title>
    <style>
      html * {
        margin: 0;
        padding: 0;
      }
      .layout article div {
        min-height: 100px;
      }
      .layout.table .left-center-right {
        width: 100%;
        display: table;
        height: 100px;
      }
      .layout.table .left-center-right>div {
        display: table-cell;
      }
      .layout.table .left {
        width: 300px;
        background: black;
      }
      .layout.table .center {
        background: green;
      }
      .layout.table .right {
        width: 300px;
        background: burlywood;
      }
    </style>
  </head>
  <body>
    <section class="layout table">
      <article class="left-center-right">
        <div class="left"></div>
        <div class="center">
          <h1>表格布局解决方案</h1>
          <p>
            这是三栏布局中间部分 这是三栏布局中间部分 这是三栏布局中间部分 这是三栏布局中间部分
          </p>
        </div>
        <div class="right"></div>
      </article>
    </section>
  </body>
</html>

25、什么是BFC?它的渲染规则是什么?如何创建BFC?它的使用场景有哪些?

(1)概念: BFC是Block Formatting Context (块级格式化上下文)的缩写,它是W3C CSS 2.1 规范中的一个概念,是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。 (2)渲染规则:

  • 内部的box会在垂直方向,一个接一个的放置;
  • box垂直方向的距离由margin决定,属于同一个BFC的两个相邻box的margin会发生重叠;
  • 每个元素的margin box的左边,与包含块border box的左边相接触,即使存在浮动也是如此;
  • BFC的区域不会与float box重叠;
  • BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素;
  • 计算BFC的高度时,浮动元素也参与计算。 (3)创建BFC:
  • float属性不为none;
  • position属性值为absolute或fixed;
  • display属性值为inline-block,table-cell,table-caption,flex,inline-flex;
  • overflow属性值不为visible。 (4)使用场景:
  • 解决垂直方向边距重叠;
  • 解决和浮动元素的重叠;
  • 清除浮动

26、CSS中的文档流

普通流就是正常的文档流,在HTML里面的写法就是从上到下,从左到右的排版布局。其中涉及到了块状元素和内联元素。脱离文档流的几个属性:绝对定位(absolute)、固定定位(fixed)、浮动(float)。

27、CSS中的伪类

(1)概念:伪类存在的意义是为了通过选择器找到那些不存在与DOM树中的信息以及不能被常规CSS选择器获取到的信息。 (2)拓展:伪类由一个冒号:开头,冒号后面是伪类的名称和包含在圆括号中的可选参数。任何常规选择器可以再任何位置使用伪类。伪类语法不区别大小写。一些伪类的作用会互斥,另外一些伪类可以同时被同一个元素使用。并且,为了满足用户在操作DOM时产生的DOM结构改变,伪类也可以是动态的。

28、CSS中的伪元素

(1)概念:伪元素在DOM树中创建了一些抽象元素,这些抽象元素是不存在于文档语言里的(可以理解为html源码)。比如:document接口不提供访问元素内容的第一个字或者第一行的机制,而伪元素可以使开发者可以提取到这些信息。并且,一些伪元素可以使开发者获取到不存在于源文档中的内容(比如常见的::before,::after)。 (2)拓展:伪元素的由两个冒号::开头,然后是伪元素的名称。使用两个冒号::是为了区别伪类和伪元素(CSS2中并没有区别)。当然,考虑到兼容性,CSS2中已存的伪元素仍然可以使用一个冒号:的语法,但是CSS3中新增的伪元素必须使用两个冒号::。一个选择器只能使用一个伪元素,并且伪元素必须处于选择器语句的最后。 (3)分类:::first-letter;::first-line;::before;::after;::selection;(对用户所选取的部分样式改变)

29、伪元素和伪类的区别

(1)CSS伪类:用于向某些选择器添加特殊的效果。 (2)CSS伪元素:用于将特殊的效果添加到某些选择器。伪元素代表了某个元素的子元素,这个子元素虽然在逻辑上存在,但却并不实际存在于文档树中。 (3)总结:

  • 伪类本质上是为了弥补常规CSS选择器的不足,以便获取到更多信息;
  • 伪元素本质上是创建了一个有内容的虚拟容器;
  • CSS3中伪类和伪元素的语法不同;
  • 可以同时使用多个伪类,而只能同时使用一个伪元素。

30、CSS隐藏元素的几种方法

(1)Opacity:元素本身依然占据它自己的位置并对网页的布局起作用。它也将响应用户交互; (2)Visibility:与 opacity 唯一不同的是它不会响应任何用户交互。此外,元素在读屏软件中也会被隐藏; (3)Display:display 设为 none 任何对该元素直接打用户交互操作都不可能生效。此外,读屏软件也不会读到元素的内容。这种方式产生的效果就像元素完全不存在; (4)Position:不会影响布局,能让元素保持可以操作;

31、float和display:inline-block;的区别

(1)文档流(Document flow): 浮动元素会脱离文档流,并使得周围元素环绕这个元素。而inline-block元素仍在文档流内。因此设置inline-block不需要清除浮动。当然,周围元素不会环绕这个元素,你也不可能通过清除inline-block就让一个元素跑到下面去。 (2)水平位置(Horizontal position): 很明显你不能通过给父元素设置text- align:center让浮动元素居中。事实上定位类属性设置到父元素上,均不会影响父元素内浮动的元素。但是父元素内元素如果设置了 display:inline-block,则对父元素设置一些定位属性会影响到子元素。(这还是因为浮动元素脱离文档流的关系)。 (3)垂直对齐(Vertical alignment): inline-block元素沿着默认的基线对齐。浮动元素紧贴顶部。你可以通过vertical属性设置这个默认基线,但对浮动元素这种方法就不行了。这也是我倾向于inline-block的主要原因。 (4)空白(Whitespace): inline-block包含html空白节点。如果你的html中一系列元素每个元素之间都换行了,当你对这些元素设置inline-block时,这些元素之间就会出现空白。而浮动元素会忽略空白节点,互相紧贴。

32、关于空白节点的解决方案

(1)删除html中的空白: 不要让元素之间换行,这可能比较蛋疼,但也是一种方法,特别是你元素不多的时候。 (2)使用负边距: 你可以用负边距来补齐空白。但你需要调整font-size,因为空白的宽度与这个属性有关系。 (3)给父元素设置font-size:0: 不管空白多大,由于空白跟font-size的关系,设置这个属性即可把空白的宽度设置为0.在实际使用的时候,你还需要给子元素重新设置font-size。

33、如何解决图片与文字的不对齐

(1)vertical-align:最有效的一种方式; (2)margin: 需要不断调试图片的高度,精确度难以保证; (3)position:同样是需要不断调试图片的高度,精确度难以保证。

34、如何实现点击radio的文字描述控制radio的状态

<!DOCTYPE html>
<html lang="zh">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
  </head>
  <body>
    <label for="man">男</label>
    <input type="radio" id="man" name="sex" checked="checked" />

    <label for="women">
	女
       <input type="radio" id="women" name="sex" />
    </label>
  </body>
</html>

35、position有哪些常用定位属性?定位原点是基于哪个位置?

(1)relative :相对定位,没有脱离文档流,依然占有文档空间,它是根据自身原本在文档流中的位置进行偏移; (2)absolute:绝对定位,脱离文档流,根据祖先类元素(父类以上)进行定位,而这个祖先类还必须是以position非static方式定位的,如果无父级是position非static定位时是以html作为原点定位。 (3)fixed:固定定位,脱离文档流,根据浏览器窗口进行定位。

36、介绍一下box-sizing属性

(1)box-sizing属性主要用来控制元素的盒模型的解析模式。默认值是content-box。 (2)content-box:让元素维持W3C的标准盒模型。元素的宽度/高度由border + padding + content的宽度/高度决定,设置width/height属性指的是content部分的宽/高 (3)border-box:让元素维持IE传统盒模型(IE6以下版本和IE6~7的怪异模式)。设置width/height属性指的是border + padding + content

37、解释下浮动和它的工作原理?清除浮动的技巧

(1)原理:浮动元素脱离文档流,不占据空间,浮动元素碰到包含它的边框或者浮动元素的边框停留。 (2)使用空标签清除浮动:这种方法是在所有浮动标签后面添加一个空标签定义css clear:both. 弊端就是增加了无意义标签。 (3)使用overflow:给包含浮动元素的父标签添加css属性 overflow:auto; zoom:1; zoom:1用于兼容IE6。 (4)使用after伪对象清除浮动:该方法只适用于非IE浏览器。

#parent:after {
  content: ".";
  height: 0;
  visibility: hidden;
  display: block;
  clear: both;
}

38、浮动元素引起的问题

(1)父元素的高度无法被撑开,影响与父元素同级的元素 (2)与浮动元素同级的非浮动元素(内联元素)会跟随其后 (3)若非第一个元素浮动,则该元素之前的元素也需要浮动,否则会影响页面显示的结构

39、img的白边是因为什么

原因在于,img标签默认情况下display:inline-block;img在div中的白边就是因为inline-block;造成的,所以此时将img的display设置为block;白边就消失了

40、px、pt和em、rem的区别是什么?

(1)px(pixel)指的是像素,是屏幕上显示数据的最基本的点,表示相对大小。不同分辨率下相同长度的px元素显示会不一样,比如同样是14px大小的字,在1366*768显示屏下会显示的小,在1024*768尺寸的显示器下会相对大点。 (2)pt(point)是印刷行业常用的单位,等于1/72英寸,表示绝对长度。 (3)em是相对长度单位,相对于当前对象内文本的字体尺寸,即em的计算是基于父级元素font-size的。

<body style="font-size:14px">
  <p style="font-size:2em">我这里的字体显示大小是28px(14px*2)</p>
  <div style="font-size:18px">
    <p style="font-size:2em">我这里显示字体大小是36px(18px*2),而不是上面计算的28px</p>
  </div>
</body>

(4)rem是css3新增的一个相对单位,与em的区别在于,它是相对于html根元素的。

<body style="font-size:14px">
  <p style="font-size:2rem">我这里的字体显示大小是28px(14px*2)</p>
  <div style="font-size:18px">
    <p style="font-size:2rem">我这里显示字体大小是28px(14px*2),因为我是根据html根元素的font-size大小进行计算的</p>
  </div>
</body>

41、谈谈nth-of-type() 选择器

:nth-of-type(n) 选择器匹配属于父元素的特定类型的第 N 个子元素的每个元素,n 可以是数字、关键词或公式。其中,Odd 和 even 是可用于匹配下标是奇数或偶数的子元素的关键词(第一个子元素的下标是 1)。

p:nth-of-type(2) {
  background: #ff0000;
}

p:nth-of-type(odd) {
  background: #ff0000;
}
p:nth-of-type(even) {
  background: #0000ff;
}

p:nth-of-type(3n+0) {
  background: #ff0000;
}

JavaScript

1、JavaScript对数组的操作方法有哪些?

(1)join()方法:接收一个参数,即用作分隔符的字符串,然后返回包含所有数组项的字符串 (2)push()方法:接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度 (3)pop()方法:从数组末尾移除最后一项,减少数组的length值,然后返回移除的项 (4)shift()方法:移除数组中第一个项并返回改项,同时将数组长度减1 (5)unshift()方法:在数组前端添加任意个项并返回新数组的长度 (6)sort()方法:对数组中的数据进行排序 (7)concat()方法:可以基于当前数组中的所有项创建一个新数组 (8)slice()方法:基于当前数组中的一或多个项创建一个新数组 (9)indexOf()方法:从数组的开头(位置0)开始向后查找 (10)lastIndexOf():从数组的末尾开始向前查找 (11)splice()方法:恐怕要算是最强大的数组方法了,它有很多种用法,splice()的主要用途是向数组的中部插入项,但使用这种方法的方式则有如下3种:

  • 删除:可以删除任意数量的项,只需指定2个参数(要删除的第一项的位置和要删除的项数),例如:splice(0,2)会删除数组中的前两项
  • 插入:可以向指定位置插入任意数量的项,只需要提供3个参数(起始位置,0(要删除的项数)和要插入的项),例如:splice(2,0,"red","green")会从当前数组的位置2开始插入字符串"red"和"green"
  • 替换:可以向指定位置插入任意数量的项,且同时删除任意数量的项,只需要提供3个参数(起始位置,要删除的项数和要插入的任意数量的项),例如:splice(2,1,"red","green")会删除当前数组位置2的项,然后再从位置2开始插入字符串"red"和"green"; 原文地址

数组面试题 (1)计算给定数组arr中所有元素的总和

function sum(arr) {
  var result = 0;
  for (var i = 0; i < arr.length; i++) {
    result += arr[i];
  }
  return result;
}
var arr = [4,5,6,1];
console.log(sum(arr));

(2)合并数组 arr1 和数组 arr2,不要直接修改数组 arr,结果返回新的数组

function concat(arr1, arr2) {
  var arr3 = arr1.concat(arr2);
  return arr3;
}
var Arr1 = [4, 5, 2];
var Arr2 = [7, 8, 3];
console.log(concat(Arr1, Arr2));

(3)删除数组 arr 第一个元素,不要直接修改数组 arr,结果返回新的数组

function curtail(arr) {
  var arr2 = arr.slice(0);
  arr2.shift();
  return arr2;
}
var Arr = [1, 2, 34, 5];
console.log(curtail(Arr));

(4)在数组 arr 开头添加元素 item,不要直接修改数组 arr,结果返回新的数组

function prepend(arr, item) {
  var arr2 = arr.slice(0);
  arr2.unshift(item);
  return arr2;
}

(5)移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回

function removeWithoutCopy(arr, item) {
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] == item) {
      arr.splice(i, 1);
      i--;
    }
  }
  return arr;
}
var Arr = [3, 4, 5, 6, 6, 6, 1];
console.log(removeWithoutCopy(Arr, 6));

(6)找出元素 item 在给定数组 arr 中的位置

function indexOf(arr, item) {
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] == item) {
      return i;
    }
  }
  return -1;
}

2、JavaScript如何设置获取盒模型对应的宽和高?

(1)dom.style.width/height(只能获取到内联样式的宽和高,输出值带单位)

<!DOCTYPE html>
<html lang="zh">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
  </head>
  <body>
    <div id="box" style="height: 200px;"></div>
    <script>
      var getHeight = document.getElementById("box");
      console.log(getHeight.style.height);
    </script>
  </body>
</html>

(2)dom.currentStyle.width/height(只有IE浏览器支持,输出值带单位)

<!DOCTYPE html>
<html lang="zh">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <style>
      #box {
        height: 200px;
      }
    </style>
  </head>
  <body>
    <div id="box"></div>
    <script>
      var getHeight = document.getElementById("box");
      document.write(getHeight.currentStyle.height);
    </script>
  </body>
</html>

(3)window.getComputedStyle(dom).width/height(兼容性好,输出值带单位)

<!DOCTYPE html>
<html lang="zh">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <style>
      #box {
        height: 200px;
      }
    </style>
  </head>
  <body>
    <div id="box"></div>
    <script>
      var getHeight = document.getElementById("box");
      document.write(window.getComputedStyle(getHeight).height);
    </script>
  </body>
</html>

(4)dom.getBoundingClientRect().width/height(兼容性好,输出值不带单位)

<!DOCTYPE html>
<html lang="zh">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <style>
      #box {
        height: 200px;
      }
    </style>
  </head>
  <body>
    <div id="box"></div>
    <script>
      var getHeight = document.getElementById("box");
      document.write(getHeight.getBoundingClientRect().height);
    </script>
  </body>
</html>

3、DOM事件的级别

(1)DOM0:element.onclick = function(){} (2)DOM2:element.addEventListener('click',function(){},false) 【拓展】 所谓的0级dom与2级dom事件就是不同版本间的差异,具体的说就是,对于不同的dom级别,如何定义事件处理,以及使用时有什么不同。 比如在dom0级事件处理中,后定义的事件会覆盖前面的,但是dom2级事件处理中,对一个按钮点击的时间处理就没有被覆盖掉。 (3)DOM3:element.addEventListener('keyup',function(){},false) (4)建议结合红宝书第6页

4、DOM事件模型

(1)冒泡型事件处理模型(Bubbling):冒泡型事件处理模型在事件发生时,首先在最精确的元素上触发,然后向上传播,直到根节点,反映到DOM树上就是事件从叶子节点传播到根节点。 (2)捕获型事件处理模型(Captrue):相反地,捕获型在事件发生时首先在最顶级的元素上触发,传播到最低级的元素上,在DOM树上的表现就是由根节点传播到叶子节点。 【捕获事件的具体流程】 window==>document==>html==>body==>父级元素==>目标元素 (3)标准的事件处理模型分为三个阶段:

  • 父元素中所有的捕捉型事件(如果有)自上而下地执行
  • 目标元素的冒泡型事件(如果有)
  • 父元素中所有的冒泡型事件(如果有)自下而上地执行 (4)建议结合红宝书第345页

5、Event对象的常见应用

(1)event.preventDefault():阻止事件的默认行为 (2)event.stopPropagation():阻止事件的进一步传播,也就是阻止冒泡 (3)event.stopImmediatePropagation():阻止剩余的事件处理函数的执行,并防止当前事件在DOM树上冒泡。 (4)event.currentTarget:返回绑定事件的元素 (5)event.target:返回触发事件的元素

6、JavaScript自定义事件

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Event</title>
    <style>
      html * {
        margin: 0;
        padding: 0;
      }
    </style>
  </head>
  <body>
    <div id="ev">
      <span>目标元素</span>
    </div>
    <script>
      var event = new Event('test');
      ev.addEventListener('test', function () {
        console.log('test dispatch');
      })
      ev.dispatchEvent(event);
    </script>
  </body>
</html>

7、JavaScript类的声明

// 1、类的声明
function Animal() {
  this.name = "name";
}
// 2、ES6中类的声明
class Animal2 {
  constructor() {
    this.name = name;
  }
}
// 3、实例化类
console.log(new Animal(), new Animal2());

8、JavaScript类之间的继承

(1)借助构造函数实现不完全继承,无法继承方法:

function Parent1() {
  this.name = 'parent1';
}
function Child1() {
  Parent1.call(this);
  this.type = 'child1';
}
console.log(new Child1());

(2)借助原型链实现继承,所有的属性和方法都得去原型链上去找,因而找到的属性方法都是同一个,所以直接利用原型链继承是不现实的。

function Parent2() {
  this.name = 'parent2';
  this.play = [1, 2, 3];
}
function Child2() {
  this.type = 'child2';
}
Child2.prototype = new Parent2();
console.log(new Child2());
var s1 = new Child2();
var s2 = new Child2();
console.log(s1.play, s2.play);
s1.play.push(4);

(3)组合方式实现继承

function Parent3() {
  this.name = 'parent3';
  this.play = [1, 2, 3];
}
function Child3() {
  Parent3.call(this);
  this.type = 'child3';
}
Child3.prototype = new Parent3();
var s3 = new Child3();
var s4 = new Child3();
s3.play.push(4);
console.log(s3.play, s4.play);

(4)组合继承的优化1

function Parent4() {
  this.name = 'parent4';
  this.play = [1, 2, 3];
}
function Child4() {
  Parent4.call(this);
  this.type = 'child4';
}
Child4.prototype = Parent4.prototype;
var s5 = new Child4();
var s6 = new Child4();
console.log(s5.play, s6.play);
console.log(s5 instanceof Child4, s5 instanceof Parent4);
console.log(s5.constructor);

(5)组合继承的优化2(俗称寄生式继承)

function Parent5() {
  this.name = 'parent5';
  this.play = [1, 2, 3];
}
function Child5() {
  Parent5.call(this);
  this.type = 'child5';
}
Child5.prototype = Object.create(Parent5.prototype);
Child5.prototype.constructor = Child5;
var s7 = new Child5();
console.log(s7 instanceof Child5, s7 instanceof Parent5);
console.log(s7.constructor);

9、创建对象有几种方法?

(1)字面量:

var k1 = {
  name: 'k1'
};
var k2 = new Object({
  name: 'k2'
});

(2)通过构造函数

var m = function (name) {
  this.name = name;
};
var k3 = new m('k3');

(3)通过Object.create

var p = {
  name: 'ppp'
};
var k4 = Object.create(p);

11、什么是原型和原型链?有什么特点?

(1)每个对象都会在其内部初始化一个属性,就是prototype(原型),当我们访问一个对象的属性时,如果这个对象不存在这个属性,那么就会去prototype里找这个属性,这个prototype又会有自己的prototype,于是就这样一直找下去,也就是我们平时所说的原型链的概念。 (2)特点:JavaScript对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变。当我们需要一个属性的时,Javascript引擎会先看当前对象中是否有这个属性, 如果没有的话,就会查找他的Prototype对象是否有这个属性,如此递推下去,一直检索到 Object 内建对象。 (3)更多原型知识1

12、JavaScript的运行机制

(1)JavaScript是单线程,一个时间段内,JavaScript只能干一件事情。任务队列分为同步任务和异步任务。 (2)异步任务类型:setTimeout和setInterval、DOM事件、ES6中的Promise

13、JavaScript异步加载的方式

(1)动态脚本加载; (2)defer (3)async

14、JavaScript的typeof返回哪些数据类型?

Object number function boolean underfind、String; 【拓展】 比较混淆的是:介绍JavaScript的基本数据类型 答案为:Undefined、Null、Boolean、Number、String、Symbol(创建后独一无二且不可变的数据类型

15、JavaScript中的事件委托是什么?

事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。

16、为什么要使用JavaScript的事件委托?

为了减少代码的DOM操作,提高程序性能。更多详情

17、JavaScript中的闭包

(1)有权访问另一个函数作用域内变量的函数都是闭包。 (2)闭包就是一个函数引用另外一个函数的变量,因为变量被引用着所以不会被回收,因此可以用来封装一个私有变量。这是优点也是缺点,不必要的闭包只会徒增内存消耗!另外使用闭包也要注意变量的值是否符合你的要求,因为他就像一个静态私有变量一样。 (3)更多

18、window.onload和DOMContentLoaded的区别是?

window.addEventListener('load',function(){
    //页面的全部资源加载完才会执行,包括图片、视频等
})
document.addEventListener('DOMContentLoaded',function(){
    //DOM渲染完即可执行,此时图片、视频还可能没有加载完
})

19、用JavaScript创建10个标签,点击的时候弹出来对应的序号

var i;
for (i = 0; i < 10; i++) {
  (function (i) {
    var a = document.createElement('a');
    a.innerHTML = i + '<br>';
    a.addEventListener('click', function (e) {
      e.preventDefault();
      alert(i);
    });
    document.body.appendChild(a);
  })(i)
}

20、实现数组的随机排序

Array.prototype.shuffle = function () {
  var input = this;
  for (var i = input.length - 1; i >= 0; i--) {
    var randomIndex = Math.floor(Math.random() * (i + 1));
    var itemAtIndex = input[randomIndex];
    input[randomIndex] = input[i];
    input[i] = itemAtIndex;
  }
  return input;
}
var tempArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
tempArray.shuffle();
console.log(tempArray);

21、JavaScript中有哪些内置函数,与内置对象的区别是什么?

(1)内置函数:是浏览器内核自带的,不用任何函数库引入就可以直接使用的函数,如常规函数(alert等)、数组函数(reverse等)、日期函数(getDate等)、数学函数(floor等)、字符串函数(length等); (2)内置对象:是浏览器本身自带的,内置对象中往往包含了内置函数。内置对象有Object、Array、Boolean、Number、String、Function、Date、RegExp等。

22、JavaScript变量按照存储方式区分为哪些类型,并描述其特点

//值类型
//变量的交换,按值访问,操作的是他们实际保存的值。
//等于在一个新的地方按照新的标准开了一个空间(栈内存),
//这样a的值对b的值没有任何影响
var a = 100;
var b = a;
b = 200;
console.log("a:" + a + ",b:" + b);
//引用类型
//变量的交换,当查询时,我们需要先从栈中读取内存地址,
//然后再顺藤摸瓜地找到保存在堆内存中的值;
//发现当复制的是对象,那么obj1和obj2两个对象被串联起来了,
//obj1变量里的属性被改变时候,obj2的属性也被修改。
var obj1 = {
  x: 100
};
var obj2 = obj1;
obj2.x = 200;
console.log("obj1:" + obj1.x + ",obj2:" + obj2.x);

23、如何理解JSON?

其实JSON只不过是一个JavaScript对象而已。stringify()是把对象变成字符串;parse()是把字符串变成对象。

24、JavaScript中&&和||

(1)只要“||”前面为false,不管“||”后面是true还是false,都返回“||”后面的值; (2)只要“||”前面为true,不管“||”后面是true还是false,都返回“||”前面的值。 (3)且在js逻辑运算中,0、”“、null、false、undefined、NaN都会判为false,其他都为true。

(4)只要“&&”前面是false,无论“&&”后面是true还是false,结果都将返“&&”前面的值; (5)只要“&&”前面是true,无论“&&”后面是true还是false,结果都将返“&&”后面的值。

25、描述new一个对象的过程

(1)创建空对象:var obj = {}; (2)设置新对象的constructor属性为构造函数的名称,设置新对象的__proto__属性指向构造函数的prototype对象:obj.proto = ClassA.prototype; (3)使用新对象调用函数,函数中的this被指向新实例对象:ClassA.call(obj); //{}.构造函数();
(4)将初始化完毕的新对象地址,保存到等号左边的变量中 【注意】 若构造函数中返回this或返回值是基本类型(number、string、boolean、null、undefined)的值,则返回新实例对象;若返回值是引用类型的值,则实际返回值为这个引用类型。

26、什么是构造函数?

(1)构造函数就是初始化一个实例对象,对象的prototype属性是继承一个实例对象。 (2)注意事项:

  • 默认函数首字母大写;
  • 构造函数并没有显示返回任何东西。new 操作符会自动创建给定的类型并返回他们,当调用构造函数时,new会自动创建this对象,且类型就是构造函数类型;
  • 也可以在构造函数中显示调用return.如果返回的值是一个对象,它会代替新创建的对象实例返回。如果返回的值是一个原始类型,它会被忽略,新创建的实例会被返回;
  • 因为构造函数也是函数,所以可以直接被调用,但是它的返回值为undefine,此时构造函数里面的this对象等于全局this对象。this.name其实就是创建一个全局的变量name。在严格模式下,当你补通过new 调用Person构造函数会出现错误;

27、函数声明和函数表达式的区别

//成功
fn()
function fn() {
  console.log("函数声明,全局");
}
//报错
fn1()
var fun1 = function () {
  console.log("函数表达式,局部")
}

28、说一下对变量提升的理解

(1)顾名思义,就是把下面的东西提到上面。在JS中,就是把定义在后面的东东(变量或函数)提升到前面中定义。

var v = 'Hello World';
(function () {
  alert(v); //undefined
  var v = 'I love you';
})()

(2)根据上面变量提升原件以及js的作用域(块级作用域)的分析,得知 上面代码真正变成如下:

var v = 'Hello World';
(function () {
  var v;
  alert(v);
  v = 'I love you';
})()

(3)在我们写js code 的时候,我们有2中写法,一种是函数表达式,另外一种是函数声明方式。我们需要重点注意的是,只有函数声明形式才能被提升。

//成功
function myTest() {
  foo();
  function foo() {
    alert("我来自 foo");
  }
}
myTest();
//失败
function myTest() {
  foo();
  var foo = function foo() {
    alert("我来自 foo");
  }
}
myTest();

29、说一下this几种不同的使用场景

(1)作为构造函数执行,如果函数创建的目的是使用new来调用,并产生一个对象,那么此函数被称为构造器函数;

var Niu = function (string) {
  this.name = string;
};

(2)作为对象属性执行,对象成员方法中的this是对象本身,此时跟其他语言是一致的,但是也有差异,JavaScript中的this到对象的绑定发生在函数调用的时候;

var myObj = {
  value: 0,
  increment: function (inc) {
    this.value += typeof inc === 'number' ? inc : 1;
  }
};
myObj.increment(); //1
myObj.increment(2); //3

(3)作为普通函数执行,以普通方式定义的函数中的this:会被自动绑定到全局对象;

var value = 232;
function toStr() {  
  console.log(this.value);
}

(4)对象方法中闭包函数的this

//在以普通方式定义的函数中的this会被自动绑定到全局对象上,
//大家应该可以看出闭包函数定义也与普通方式无异,因此他也会被绑定到全局对象上。
value = 10;
var closureThis = {
  value: 0,
  acc: function () {
    var helper = function () {
      this.value += 2;
      console.log("this.value : %d", this.value);
    }
    helper();
  }
};
closureThis.acc(); //12
closureThis.acc(); //14

var closureThat = {
  value: 0,
  acc: function () {
    that = this;
    var helper = function () {
      that.value += 2;
      console.log("that.value : %d", that.value);
    }
    helper();
  }
};
closureThat.acc(); // 2
closureThat.acc(); // 4

(5)apply函数的参数this,apply方法允许我们选择一个this值作为第一个参数传递,第二个参数是一个数组,表明可以传递多个参数。

30、如何理解JavaScript作用域?

函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的。

function foo() {
  var x = 1;
  return function () {
    alert(x);
  }
};
var bar = foo();
bar(); // 1
var x = 2;
bar(); // 1

31、什么是自由变量?

自由变量就是当前作用域没有定义的变量,即“自由变量”

var a = 100;
function F1() {
  var b = 200;
  function F2() {
    var c = 300;
    //a是自由变量
    console.log(a);
    //b是自由变量
    console.log(b);
    console.log(c);
  }
  F2();
}
F1();

32、this的特点

this要在执行时才能确认值,定义时无法确认。

33、同步和异步的区别是什么?分别举一个同步和异步的例子

同步会阻塞代码执行,而异步不会;alert是同步,setTimeout是异步。

33、一个关于setTimeout的笔试题

//输出结果13542
console.log(1);
setTimeout(function () {
  console.log(2);
}, 100);
console.log(3);
setTimeout(function () {
  console.log(4);
}, 99);
console.log(5)

34、何时需要异步?

在可能发生等待的情况、等待过程中不能像alert一样阻塞程序运行、因此所有的等待的情况都需要异步

35、JavaScript中的异步和单线程

(1)其实,单线程和异步确实不能同时成为一个语言的特性。js选择了成为单线程的语言,所以它本身不可能是异步的,但js的宿主环境(比如浏览器,Node)是多线程的,宿主环境通过某种方式(事件驱动,下文会讲)使得js具备了异步的属性。 (2)js是单线程语言,浏览器只分配给js一个主线程,用来执行任务(函数),但一次只能执行一个任务,这些任务形成一个任务队列排队等候执行,但前端的某些任务是非常耗时的,比如网络请求,定时器和事件监听,如果让他们和别的任务一样,都老老实实的排队等待执行的话,执行效率会非常的低,甚至导致页面的假死。所以,浏览器为这些耗时任务开辟了另外的线程,主要包括http请求线程,浏览器定时触发器,浏览器事件触发线程,这些任务是异步的。

36、使用JavaScript获取当天的日期

function formatDate(dt) {
  if (!dt) {
    dt = new Date();
  }
  var year = dt.getFullYear();
  var month = dt.getMonth() + 1;
  var date = dt.getDate();
  if (month < 10) {
    month = "0" + month;
  }
  if (date < 10) {
    date = "0" + date;
  }
  return year + "-" + month + "-" + date;
}
var dt = new Date();
var formatDate = formatDate(dt);
console.log(formatDate);

37、获取随机数,要求是长度一致的字符串

var random = (Math.random() * 10 + "0000000000").slice(0, 10);
console.log(random);

38、写一个能遍历对象和数组的通用forEach函数

function forEach(obj, fn) {
  if (obj instanceof Array) {
    //准确判断是不是数组
    obj.forEach(function (item, index) {
      fn(index, item);
    })
  } else {
    //不是数组就是对象
    for (var key in obj) {
      if (obj.hasOwnProperty(key)) {
        fn(key, obj[key]);
      }
    }
  }
}
//检测数组
var arr = [1, 2, 3];
//这里顺序换了,为了和对象的遍历格式一致
forEach(arr, function (index, item) {
  console.log(index, item);
});
//检测对象
var obj = {
  x: 100,
  y: 200
};
forEach(obj, function (key, value) {
  console.log(key, value);
})

39、DOM操作的常用API有哪些?

获取DOM节点,以及节点的property和Attribute;获取父节点和子节点;新增节点和删除节点

40、DOM节点的attr和property有何区别?

property只是一个JavaScript对象的属性的修改;Attribute是对html标签属性的修改

41、DOM的本质

浏览器把拿到的HTML代码,结构化一个浏览器能识别并且js可以操作的一个模型而已。

42、手动编写一个ajax,不依赖第三方库

var xmlHttp = new XMLHttpRequest() || new ActiveXObject("Msxml2.XMLHTTP");
xmlHttp.open("提交方式", "提交地址", true);
xmlHttp.onreadystatechange = function () {
  if (xmlHttp.readyState == 4) {
    infoDiv.innerHTML = xmlHttp.responseText;
  }
}
xmlHttp.send();

更多ajax知识,请点击这里

43、什么是跨域?

(1)浏览器有同源策略,不允许ajax访问其他域接口。跨域条件(协议、域名、端口)有一个不同就算是跨域。 (2)可以跨域的三个标签(<img src=xxx>、<link href=xxx>、<script src=xxx>)。三个标签的应用场景(<img>用于打点统计,统计网站可能是其他域、

44、跨域的几种实现方式

(1)通过jsonp跨域:在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的。但是,在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的。 (2)通过修改document.domain来跨子域: (3)使用window.name来进行跨域: (4)使用HTML5中新引进的window.postMessage方法来跨域传送数据: (5)更详细的内容

45、JavaScript实现字符串反转

(1)第一种方法

var str = "abcdef";
console.log(str.split("").reverse().join(""));

(2)第二种方法

var str = "abcdef";
var i = str.length - 1;
for (var x = i; x >= 0; x--) {
  document.write(str.charAt(x));
}

(3)第三种方法

function reverse(str) {
  if (str.length == 0) return null;
  var i = str.length;
  var dstr = "";
  while (--i >= 0) {
    dstr += str.charAt(i);
  }
  return dstr;
}
var str = "abcdef";
str = reverse(str);
document.write(str);

46、ajax中的get和post两种请求方式的异同

(1) get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到;post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。 (2)对于get方式,服务器端用Request.QueryString获取变量的值;对于post方式,服务器端用Request.Form获取提交的数据。两种方式的参数都可以用Request来获得。 (3)get传送的数据量较小,不能大于2KB;post传送的数据量较大,一般被默认为不受限制,但理论上,因服务器的不同而异。 (4)get安全性非常低,post安全性较高。 (5)

是一样的,也就是说,method为get时action页面后边带的参数列表会被忽视;而
是不一样的。

47、找出数字数组中最大的元素

var a = [111, 2, 6, 4, 22, 5, 99, 3];
console.log(Math.max.apply(null, a));

48、实现该语法的功能:var a = (5).plus(3).minus(6)

Number.prototype.plus = function (a) {
  return this.valueOf() + a;
}
Number.prototype.minus = function (a) {
  return this.valueOf() - a;
}
var a = (5).plus(3).minus(6);
console.log(a);

49、有一个大数组,var a = [‘1’,’2’,’3’,…];a数组的长度是100,内容填充随机整数的字符串,请先构造此数组a,然后设计一个算法,将其内容去重。

function Random(n) {
  var arr = [];
  for (var i = 0; i < n; i++) {
    arr[i] = parseInt(Math.random() * 100);
  }
  console.log(arr);
  return arr;
}
//使用indexof  这里也可以使用arr2的indexOf
function DeleRepeat1(arr) {
  var arr2 = [];
  var len = arr.length;
  for (var i = 0; i < len; i++) {
    if (arr.indexOf(arr[i]) == i) {
      arr2.push(arr[i])
    }
  }
  return arr2;
}
var arr = Random(100);
console.log(DeleRepeat1(arr));

50、返回只包含数字类型的数组,比如:’abc234koi45jodjnvi789’ –> [234,45,789]

var str = 'abc234koi45jodjnvi789';
var reg = /\d+/g;
console.log(str.match(reg));

51、slice数组的浅复制:向数组后添加一个元素,返回原数组不变,返回新数组。

function append(arr, item) {
  var arr2 = [];
  arr2 = arr.slice(0);
  arr2.push(item);
  return arr2;
}
var arr = [1, 2, 3, 4];
console.log(append(arr, 10)); //[1, 2, 3, 4,10]
console.log(arr) //[1, 2, 3, 4]

【解析】 如果定义 var arr2=arr的话,那么arr2指向了arr的引用。那么arr2改变也会伴随着arr改变。 而slice浅复制:arr数组并返回了一个新数组,与原数组没有关系了。

52、实现数组内容增添的函数

function insert(arr, item, index) {
  var arr2 = arr.concat();
  arr2.splice(index, 0, item);
  return arr2;
}
//[1,2,'z',3,4]
console.log(insert([1, 2, 3, 4], 'z', 2));

53、什么是同步?什么是异步

(1)同步:脚本会停留并等待服务器发送回复然后再继续 (2)异步:脚本允许页面继续其进程并处理可能的回复

54、documen.write和 innerHTML的区别是什么?

document.write重绘整个页面;innerHTML可以重绘页面的一部分。

55、介绍JavaScript有哪些内置对象?

(1)数据封装类对象:Object、Array、Boolean、Number 和 String (2)其他对象:Function、Arguments、Math、Date、RegExp、Error

56、JavaScript的作用域链式什么?

全局函数无法查看局部函数的内部细节,但局部函数可以查看其上层的函数细节,直至全局细节。当需要从局部函数查找某一属性或方法时,如果当前作用域没有找到,就会上溯到上层作用域查找,直至全局函数,这种组织形式就是作用域链。

57、什么是window对象? 什么是document对象?

(1)window对象是指浏览器打开的窗口。 (2)document对象是Documentd对象(HTML 文档对象)的一个只读引用,window对象的一个属性。

58、null,undefined 的区别?

(1)null:表示一个对象是“没有值”的值,也就是值为“空”; (2)undefined:表示一个变量声明了没有初始化(赋值); 【注意】 在验证null时,一定要使用 === ,因为 == 无法分别 null 和undefined

59、什么是闭包(closure),为什么要用它?

(1)闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部。 (2)闭包的特性:

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

60、如何判断一个对象是否属于某个类?

if(a instanceof Person){
  alert('yes');
}

61、new操作符具体干了什么呢?

(1)创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型; (2)属性和方法被加入到 this 引用的对象中; (3)新创建的对象由 this 所引用,并且最后隐式的返回 this 。 【栗子】

var obj  = {};
obj.__proto__ = Base.prototype;
Base.call(obj);

62、Javascript中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是?

(1)javaScript中hasOwnProperty函数方法是返回一个布尔值,指出一个对象是否具有指定名称的属性。此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员。 (2)使用方法:

  • object.hasOwnProperty(proName)
  • 其中参数object是必选项。一个对象的实例。
  • proName是必选项。一个属性名称的字符串值。
  • 如果 object 具有指定名称的属性,那么JavaScript中hasOwnProperty函数方法返回 true,反之则返回 false。

63、对JSON 的了解?

(1)JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于JavaScript的一个子集。数据格式简单, 易于读写, 占用带宽小,比如:{"age":"12", "name":"back"} (2)JSON字符串转换为JSON对象:

var obj =eval('('+ str +')');
var obj = str.parseJSON();
var obj = JSON.parse(str);

(3)JSON对象转换为JSON字符串:

var last=obj.toJSONString();
var last=JSON.stringify(obj);

64、js延迟加载的方式有哪些?

defer和async、动态创建DOM方式(用得最多)、按需异步载入js。

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

(1)defer,只支持IE; (2)async: (3)创建script,插入到DOM中,加载完毕后callBack

66、DOM操作——怎样添加、移除、移动、复制、创建和查找节点?

(1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元素 createTextNode() //创建一个文本节点 (2)添加、移除、替换、插入 appendChild() removeChild() replaceChild() insertBefore() //在已有的子节点前插入一个新的子节点 (3)查找 getElementsByTagName() //通过标签名称 getElementsByName() //通过元素的Name属性的值 getElementById() //通过元素Id,唯一性

67、JQuery一个对象可以同时绑定多个事件,这是如何实现的?

(1)多个事件同一个函数: $("div").on("click mouseover", function(){}); (2)多个事件不同函数

$("div").on({
  click: function(){},
  mouseover: function(){}
})

68、JavaScript中如何检测一个变量是一个String类型或者Array类型?请写出函数实现

var str = "hello";
if (typeof (str) === "string") {
  console.log("str is String");
}
var arr = [];
if (arr instanceof Array) {
  console.log("arr is Array");
}

69、prototype和_proto_的关系是什么

prototype和__proto__都指向原型对象,任意一个函数(包括构造函数)都有一个prototype属性,指向该函数的原型对象,同样任意一个构造函数实例化的对象,都有一个__proto__属性(__proto__并非标准属性,ECMA-262第5版将该属性或指针称为[[Prototype]],可通过Object.getPrototypeOf()标准方法访问该属性),指向构造函数的原型对象。

70、ajax是什么?同步和异步的区别?

(1)ajax是一种无需重新加载整个网页的情况下,能够更新部分网页的技术。 (2)同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。

71、事件委托是什么,举个例子

它还有一个名字叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。那这是什么意思呢?网上的各位大牛们讲事件委托基本上都用了同一个例子,就是取快递来解释这个现象。

<!DOCTYPE html>
<html lang="zh">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <style>
      ul li {
        display: block;
        height: 50px;
        width: 100px;
        text-align: center;
        line-height: 50px;
        background-color: #888;
        margin-bottom: 8px;
      }
    </style>
  </head>
  <body>
    <ul id="Inul">
      <li>111</li>
      <li>222</li>
      <li>333</li>
      <li>444</li>
      <li>555</li>
    </ul>
    <script>
      //不使用事件委托
      /*window.onload = function(){
      	var oUL = document.getElementById("Inul");
      	var aLi = oUL.getElementsByTagName("li");
      	for(var i=0;i<aLi.length;i++){
      	  aLi[i].onclick = function(){
      	    alert(123);
      	  }
      	}
      }*/
      //使用事件委托
      window.onload = function () {
        var oUL = document.getElementById("Inul");
        oUL.onclick = function () {
          alert(123);
        }
      }
    </script>
  </body>
</html>

72、判断字符串是否是这样组成的:第一个必须是字母,后面可以是字母、数字和下划线,总长度为5-20

var str = "adfadfa2343243e";
var reg = /^[a-zA-Z]\w{4,19}$/g;
console.log(reg.test(str));

73、编写一个方法,去掉一个数组的重复元素

Array.prototype.methods = function () {
  //定义一个临时数组
  var arr = [];
  //循环遍历当前数组
  for (var i = 0; i < this.length; i++) {
    //判断当前数组下标为i的元素是否已经保存到临时数组
    //如果已经保存,则跳过,佛则将此元素保存到临时数组中
    //没有保存则说明查不到,返回-1
    if (arr.indexOf(this[i]) === -1) {
      arr.push(this[i]);
    }
  }
  return arr;
}
var arry = [2, 3, 5, 6, 6, 7];
console.log(arry.methods());

74、如何实现JavaScript模块化,请至少使用两种方法

(1)立即执行函数(IIFE):可以达到不暴露私有成员的目的。 (2)对象写法:可以把模块写成一个对象,所有的模块成员都放到这个对象里面。

75、编写一个JavaScript函数,该函数有一个n(数字类型),其返回值是一个数组,该数组内是n个随机且不重复的整数,且整数取值范围是[2,32]。

//定义一个函数用来返回整数的取值范围
function getRand(a, b) {
  //ceil向上取整
  var rand = Math.ceil(Math.random() * (b - a) + a);
  return rand;
}
//定义一个函数用来过滤重复的整数
function checkArrIn(rand, arry) {
  if (arry.indexOf(rand) != -1) {
    return true;
  }
  return false;
}
//定义一个执行函数
function fn(n, min, max) {
  var arr = [];
  //判断n是不是一个数字,包含字符串类型的数字
  var isNum = !isNaN(Number(n));
  //判断n的取值是否符合要求
  var isRandOk = (n >= min && n <= max && n <= (max - min)) ? true : false;
  if (n && isRandOk && isNum) {
    for (var i = 0; i < n; i++) {
      var rand = getRand(min, max);
      //假如checkArrIn()返回true,说明有相同元素,那么就重新执行一次
      if (checkArrIn(rand, arr)) {
        i--;
      } else {
        arr.push(rand);
      }
    }
  }
  console.log(arr);
}
//调用函数
fn(10, 2, 32);

76、[1,2,3].map(parseInt) 的结果是多少?

(1)答案是:[1, NaN, NaN] (2)原因:parseInt接收的是两个参数,map传递的是3个参数 (3)具体解析

77、构造函数调用方法this指向问题

构造函数其实就是用new操作符调用的一个函数,用new时构造函数内部的this会指向新的实例。

78、getElementsByClassName()和querySelector()的区别是什么?

(1)getElementsByTagName方法返回一个对象数组(准确的说是HTMLCollection集合),返回元素的顺序是它们在文档中的顺序,传递给 getElementsByTagName() 方法的字符串可以不区分大小写;DOM还提供了getElementsByClassName方法来获取指定class名的元素,该方法返回文档中所有指定类名的元素集合,作为 NodeList 对象。NodeList 对象代表一个有顺序的节点列表。 (2)querySelector() 方法返回匹配指定 CSS 选择器元素的第一个子元素 。 该方法只返回匹配指定选择器的第一个元素。如果要返回所有匹配元素,需要使用 querySelectorAll() 方法替代。由于querySelector是按css规范来实现的,所以它传入的字符串中第一个字符不能是数字。 (3)总结

  • query选择符选出来的元素及元素数组是静态的,而getElement这种方法选出的元素是动态的。静态的就是说选出的所有元素的数组,不会随着文档操作而改变。
  • 在使用的时候getElement这种方法性能比较好,query选择符则比较方便。

Vue.js相关知识

1、v-if和v-show的区别是什么?

(1)v-if是条件渲染指令,它根据表达式的真假来删除和插入元素; (2)v-show也是条件渲染指令,和v-if指令不同的是,使用v-show指令的元素始终会被渲染到HTML,它只是简单地为元素设置CSS的style属性。 (3)总结:v-if 有更高的切换开销,而 v-show 有更高的出事渲染开销.因此,如果需要非常频繁的切换,那么使用v-show好一点;如果在运行时条件不太可能改变,则使用v-if 好点. (4)点击查看更多

2、Vue的生命周期是什么?

3、Vue的父子组件如何传值?

组件实例的作用域是孤立的。这意味着不能并且不应该在子组件的模板内直接引用父组件的数据。可以使用 props 把数据传给子组件。prop默认是单向绑定:当父组件的属性变化时,将传导给子组件,但是反过来不会。这是为了防止子组件无意修改了父组件的状态。更多知识

4、v-bind指令和v-on指令

(1)v-bind指令可以在其名称后面带一个参数,中间放一个冒号隔开,这个参数通常是HTML元素的特性(attribute),例如:v-bind:class (2)v-on指令用于给监听DOM事件,它的用语法和v-bind是类似的,例如监听元素的点击事件:<a v-on:click="doSomething">

5、v-text和v-html的区别是什么?

(1)v-text能够把html标签当做字符给渲染出来;

<-- 结果为TWO TODO<span>Vue</span>-->
<h1 v-text="title"></h1>
data() {
    return {
      title: "TWO TODO<span>Vue</span>",
  }
}

(2)v-html能够把html标签直接渲染出来;

<-- 结果为TWO TODOVue-->
<h1 v-html="title"></h1>
data() {
    return {
      title: "TWO TODO<span>Vue</span>",
  }
}

6、Vuejs中关于computed、methods、watch的区别是什么?

(1)watch和computed都是以Vue的依赖追踪机制为基础的,它们都试图处理这样一件事情:当某一个数据(称它为依赖数据)发生变化的时候,所有依赖这个数据的“相关”数据“自动”发生变化,也就是自动调用相关的函数去实现数据的变动。 (2)对methods:methods里面是用来定义函数的,很显然,它需要手动调用才能执行。而不像watch和computed那样,“自动执行”预先定义的函数。 (3)methods 适合小的、同步的计算,而 watch 对于多任务、异步或者响应数据变化时的开销大的操作是有利的。 (4)点击查看更多

其他

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

(1)主要分成两部分:渲染引擎(layout engineer或Rendering Engine)和JS引擎。 (2)渲染引擎:负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入CSS等),以及计算网页的显示方式,然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。所有网页浏览器、电子邮件客户端以及其它需要编辑、显示网络内容的应用程序都需要内核。 (3)JS引擎则:解析和执行javascript来实现网页的动态效果。最开始渲染引擎和JS引擎并没有区分的很明确,后来JS引擎越来越独立,内核就倾向于只指渲染引擎。

2、常见的浏览器内核有哪些? (1)Trident内核:IE,MaxThon,TT,The World,360,搜狗浏览器等。[又称MSHTML] (2)Gecko内核:Netscape6及以上版本,FF,MozillaSuite/SeaMonkey等 (3)Presto内核:Opera7及以上。 [Opera内核原为:Presto,现为:Blink;] (4)Webkit内核:Safari,Chrome等。 [ Chrome的:Blink(WebKit的分支)]

3、网页验证码是干嘛的,是为了解决什么安全问题。

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

4、经常遇到的浏览器的兼容性有哪些?原因,解决方法是什么,常用hack的技巧 ?

(1)png24位的图片在iE6浏览器上出现背景,解决方案是做成PNG8 (2)浏览器默认的margin和padding不同,解决方案是加一个全局的*{margin:0;padding:0;}来统一 (3)IE6双边距bug:块属性标签float后,又有横行的margin情况下,在ie6显示margin比设置的大 (4)超链接访问过后hover样式就不出现了 被点击访问过的超链接样式不在具有hover和active了解决方法是改变CSS属性的排列顺序:L-V-H-A : a:link {} a:visited {} a:hover {} a:active {}

5、png、jpg、gif 这些图片格式解释一下,分别什么时候用,有没有了解过webp?

(1)GIF是一种索引颜色格式,在颜色数很少的情况下,产生的文件极小。GIF格式支持背景透明;GIF格式支持动画;GIF格式支持图形渐进;GIF格式支持无损压缩。
(2)JPG最主要的优点是能支持上百万种颜色,从而可以用来表现照片。此外,由于JPG图片使用更有效的有损压缩算法,从而使文件长度更小,下载时间更短。JPG较GIF更适合于照片,因为在照片中损失一些细节不像对艺术线条那么明显。另外,JPG对照片的压缩比例更大,而最后的质量也更好。
(3)PNG 是20世纪90年代中期开始开发的图像文件存储格式,其目的是企图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。png是一种无损耗的图像格式。
(4)Webp格式:Google开发的一种旨在加快图片加载速度的图片格式。图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器带宽资源和数据空间。Facebook Ebay等知名网站已经开始测试并使用WebP格式。当然其也是一种有损压缩,其主要目的就是加快网络图片的传输效率,让图片能更快的显示在用户的眼前。目前所知道的只有高版本的W3C浏览器才支持这种格式,比如chorme39+,safari7+等等。

6、前端分为哪三层,对应的作用是什么?

(1)网页的结构层(structural layer)由 HTML 或 XHTML 之类的标记语言负责创建。标签,也就是那些出现在尖括号里的单词,对网页内容的语义含义做出了描述,但这些标签不包含任何关于如何显示有关内容的信息。例如,P 标签表达了这样一种语义:“这是一个文本段。” (2)网页的表示层(presentation layer) 由 CSS 负责创建。 CSS 对“如何显示有关内容”的问题做出了回答。 (3)网页的行为层(behavior layer)负责回答“内容应该如何对事件做出反应”这一问题。这是 Javascript 语言和 DOM 主宰的领域。

7、浏览器的渲染过程 image

8、页面重排(Reflow)的概念和触发reflow的条件

(1)概念: DOM结构中的各个元素都有自己的盒子(模型),这些都需要浏览器根据各种样式来计算并根据计算结果将元素放到它该出现的位置,这个过程称之为reflow。 (2)触发的条件:

  • 当你增加、删除、修改DOM节点时,会导致reflow或repaint;
  • 当你移动DOM的位置,或是搞个动画的时候;
  • 当你修改CSS样式的时候;
  • 当你resize窗口的时候(移动端没有这个问题),或是滚动的时候;
  • 当你修改网页默认字体的时候。

9、页面重绘(Repaint)的概念和触发repaint的条件

(1)概念: 当各种盒子的位置、大小以及其他属性,例如颜色、字体大小等都确定下来后,浏览器于是便把这些元素都按照各自的特性绘制了一遍,于是页面的内容出现了,这个过程称之为repaint。 (2)触发的条件:

  • DOM的改动和CSS改动

10、如何实现浏览器内多个标签页之间的通信?

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

代码分析系列题

1、关于作用域的问题

请问下面几行代码输出什么?简单说一下流程

for (var i = 0; i < 5; i++) {
  console.log(i);
}

再来看看这几行代码会输出什么?再简单说一下为什么

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

如果要输出0到4,那么该如何修改呢(下面答案先不要看先)?

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

那么把function里的i删掉会输出什么?为什么会是这个结果?

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

再稍微改一改,分析一下输出的结果是什么?

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

最后来看看一段关于Promise的代码,试着分析输出的结果是什么?

setTimeout(function() {
  console.log(1)
}, 0);
new Promise(function executor(resolve) {
  console.log(2);
  for( var i=0 ; i<10000 ; i++ ) {
    i == 9999 && resolve();
  }
  console.log(3);
}).then(function() {
  console.log(4);
});
console.log(5);

原文地址:请戳这里

2、分析下面两段代码的输出结果,说一说箭头函数中this的指向

//ES3和ES5语法
var factory = function() {
  this.a = 'a';
  this.b = 'b';
  this.c = {
    a: 'c=>a',
    b: function() {
      return this.a
    }
  }
}
console.log(new factory().c.b());

//ES6语法
var factory = function() {
  this.a = 'a';
  this.b = 'b';
  this.c = {
    a: 'c=>a',
    b: () => {
      return this.a
    }
  }
}
console.log(new factory().c.b());

【分析】 在ES3和ES5语法中,this指向的是调用b这个函数的c对象,因此输出结果为“c=>a”,即此时的this是执行时确定的; 在ES6箭头函数语法中,this指向的永远是构造函数(new factory)的实例,即此时的this是声明时确定的。

海枯同学的面试经历

写在前面的话

笔者从17年的2月份开始准备春招,其中遇到不少坑,也意识到自己走过的弯路。故写了这篇文章总结一番,本文适合主动学习的,对自己要学的课程不明确的,对面试有恐惧症的...等将来打算从事技术岗位的同学们。

正文开始。。。

为什么要准备校招?

社招不一样能够进入大公司吗?对于一些不懂校招这个概念的人来说,经常会问这个问题。同时,大公司的校招薪水一般比工作2年经验社招的人还高,为什么企业会给一个没经验的应届毕业生这么高的薪水?理由何在?理清这些问题之前,我们先来看看校招是一个什么概念?

校园招聘是企业直接从学校招聘各类各层次应届毕业生。校招每年时间比较固定,即春季校招(三四月份)和秋季秋招(九到十二月份)。在原则上,春季校招大部分岗位是面向大三与研二(研三毕业)的同学,对这部分的同学提供实习的岗位。少部分企业由于秋招签约率不高或者业务剧增,会针对大四与研三的同学进行补招。

而秋季秋招主要针对大四与研三的同学(这里以每年的九月份来分隔年级),对这部分同学提供的是毕业之后的正职工作。拿到秋招offer的同学,如确定入职需与用人单位签署三方协议,以保证双方的利益不受损失。

有校招需求的企业一般是发展规模较为成型的企业,不论是成熟运作的传统企业,或年轻但已然庞大的互联网公司。在较为成熟的企业管理下,分工细致,完善地各种福利补贴制度,以及专业的导师制培养人才的策略,这些因素无疑能带给应届生们更好的成长。

同时,应届生在校空闲时间多,能学的东西更多,工作之后业务繁多能真正挤出来自主学习的时间太少,计算机基础的课程篇幅过多,出来工作之后就没时间、没精力学了。

而这些计算机基础课程却是成为业界大牛的必经之路,没学这种基础知识,很多东西的底层原理我们是没办法摸透的,这也是为什么互联网BAT大厂重视计算机基础的一个原因。

基础扎实工作之后很多东西很快就可以上手,所以很多互联网大厂宁愿把招聘精力放在校招,而不是社招;其二,应届生作为新鲜血液一般还没有成家,固然能为公司做更大的贡献。

如何准备校招?

既然校招这么重要,那我们应该怎么准备校招呢?

要想在校招中取胜,笔者觉得有几个方面是比较重要的:视野+专注+方法论+心态

1.视野

视野的开阔指对一件事物认知的广度,要对业界有一定的了解,才能明确我们的求知方向;否则一味地蛮干,最后只会南辕北辙。举个例子:对于非一本学校的某些同学来说,可能都不知道校招是怎么一回事,身边的老师也没有跟同学们灌输这些思想,不关注技术社区的同学可能就不知道。导致的后果就是不清楚大厂注重的是哪方面的知识(大厂考察的知识一般来说对技术发展很有意义),水平停滞不前,最后毕业去了家不太理想的公司。

很多东西都是这样,身边的人不可能全部传授给你,需要你带着一份热情不断地去挖掘。我们可以在空闲的时间里,去各种技术社区以及一些问答平台上刷刷动态从而不断地开阔我们的视野,比如说:在知乎平台上我们可以看到某些前辈的回答,一般这种回答都具有建设性意义,有时候抛开一些现成的观念,去接受一些新观念何妨不是一件好事呢?

同时,我们可以在社交平台上结交一些应届生“大佬”,询问他们各种学习方法,一般“大佬”都会很热情的帮助你。混熟了以后,可以跟“大佬”交流下面试心得、学习心得等等的东西,不得不说与同类型的人交流是成长最快的一种方式。

2.专注

专注是指在技术方面投入的时间成本。我们都不是圣人,只有不断地去学习与训练才能更大程度地去提升自我。当我们对一件事物有热情时,我们都愿意把所有时间花在它上面。就如我们看上了一个漂亮的女生,对她产生好感了,我们会想尽一切办法去讨好她。

在技术方面也是这样的,对于我们不感兴趣的方向我们从不会主动地去学习,保持对技术的热情才能达到持续的产出。有一句话说的好:时间花在哪里,成就就在哪里。A同学在课后每天都花8小时专研技术,而B同学每天只在课堂上学习。很明显这两人的差距只会越来越大,放心地去努力吧,付出了肯定会有回报的,回报未到只是时候未到。

专注还指对某一领域的专注程度。我们应该对自己以后想从事的职位有一个大概的方向,从而对这个方向应具备的技能进行钻研。有时候看到部分同学既写前端代码,又写PHP后端代码,又写一点硬件底层C语言代码,精力太分散了到最后很难做到每样东西都精通。大厂对应届生的要求还不至于做到全栈工程师的程度,能做到熟悉一领域的开发已经很不错了,当然懂的越多是一个加分项(但非必备)。

反观大厂对应届生的要求是熟悉计算机专业的必修课,诸如:数据库原理、操作系统原理、数据结构与算法、计算机网络等,这类知识可能比较枯燥学起来没什么劲,但却是必备的,其能为以后工作发展铺路。当然每个岗位所要求的侧重点不同,但却百变不离其宗。对这种基础知识要学到哪种程度呢?

是不是考试考到80分以上就代表这门课掌握得不错呢?不是这样的,考试的考点是有局限性的,我们应该通过看一些巨献读物来全面学习。看完之后我们可以通过看别人的面试经历(后面简称“面经”)来检测自己是否掌握这些知识点。

对于不会的知识点,建议大家可以过一遍书本的内容,书本讲的内容一般比较详细。不建议通过搜索引擎查询这种与理论相关的内容,因为大部分搜出来的结果都是摘抄书本的文字。面试服务端开发时,经常会被问到数据库索引的底层实现原理。很多同学可能会问:“为什么要搞懂这些原理性的东西?我会怎么用不就行了吗?”。只懂使用API的人永远是搬运工,工程师最大的使命是去创造,研究原理的时候我们能了解到先人的设计初衷,从而能更快速地在线上出现性能问题的时候根据原理排查问题。

3.方法论

要想达成某个目标都有其特定的方法论,学习技术也不例外,掌握适当的学习方法才能事半功倍。 我们需要形成一个完整的知识体系,强烈建议大家读一些巨献读物,其讲的内容很详细,不会漏掉某些知识点。 读完一章节后建议大家可以做做笔记,坚持读完一本书你会发现受益匪浅,以下是一些巨献读物的推荐:

JavaScript

JavaScript高级程序设计(入门前端必读读物) 你不知道的JavaScript系列(带你探索JavaScript的黑魔法) JavaScript设计模式与开发实践(让你的代码锦上添花)

计算机网络

图解HTTP(Web开发必会) 计算机网络(第五版)作者:谢希仁

数据结构

网易云课堂浙大的数据结构课程(推荐,基础视频,每节课的配套题目必须独立完成) 大话数据结构(推荐,但是感觉不如浙大的视频讲解) 算法4(推荐,书籍代码是Java语言,不影响理解)

算法

剑指offer(看完之后你会发现面试会遇到原题) 程序员代码面试指南(作者:左程云,里面讲的比剑指深入一点) LeetCode(看完剑指可以进阶算法)

数据库

数据库概论(基础,重在了解概念) MySQL必知必会 高性能MySQL

在准备面试的时候可以上牛客网的讨论区看看面经,了解一下面试可能会被问到的问题,对于不会的问题要查漏补缺。当你看完好几篇面经你会发现面试很多问题都是重复的,也就是说这些问题是必须掌握的。同时,可以不断地向更深的层次学习,比如看看源码的实现等等,这些深层次的东西是面试的加分项。

平时的积累也很重要,做项目或者学习知识点的时候可以把心得分享到博客上,一个好处是可以重新梳理知识点,在这个过程中你会对这些知识点印象更加深刻,同时也会给面试加分,面试官看了你的博客之后可以看出你是一个持续学习的人,这将会加大你面试的通过率。

另个好处是在分享的过程中,可以提升自身的表达能力,毕竟把事情讲清楚与心里懂事情是怎么回事是两码事,这也为之后公司的内部分享会奠定基础。

4.心态

在准备校招的过程中难免会遇到一些困难,比如:书本的内容看不懂,这时候可以从搜索引擎里搞清楚一些名词的意思,再把这些名词带入书本中反复地去理解。遇到困难的时候要保持一种愈战愈勇的心态,面试的过程也难免会失利,不要气馁。这时候的重点是把面试被问到不会的知识点搞清楚,争取下次被问到的时候能答上来。

关于简历

书写简历也是门学问,优秀的简历能在内推批次脱颖而出直通面试。

能缩减的信息尽量缩减,比如一些专业必修课的课程就没有必要写上去 个人信息一定要写全,如姓名,电话,邮箱,求职意向(加分项:持续产出的博客与github) 项目介绍用一句话概述,重点在于技术点的描述,建议用一些显著性的数字注明成果(经过xxx,性能提高了30%等) 对于业务型的项目,不要把那些CURD的功能写出来(太low了千篇一律),这种项目在编码的时候要多思考,看看哪些卓越的技术点可以提炼出来 获奖情况方面可以把一些有代表性的比赛及名次写进去,最好不超过3个

关于简历投递

简历投递有几个比较重要的阶段:提前批、正式批、补招。建议大家前期要广投各种企业,这能一定几率地增大面试的可能性。面试多了就有了面试的感觉,拿offer的几率会更大,后期我们能更好地选择offer。

1.提前批

无论是春招还是秋招,提前批都会在校招正式开始前的1~2个月开始内推,一般互联网大厂都有提前批。提前批一般需要在职人员内推,有师兄师姐在名企可以让其帮忙推荐。没有的话也无需担心,一旦有内推在牛客网讨论区总会出现各种信息,把简历投到帖子的邮箱里也可以进行内推。在提前批里只要你的简历通过了筛选就能直通面试了,这就是为什么要提前准备校招。

2.正式批

正式批需要在校园招聘的官网上申请,一般来说会比提前批多一轮线上或线下的笔试,只有笔试过了才能有面试的资格。校招招聘信息可以在梧桐果查看,里面还有宣讲会一栏,错过了提前批的同学可以找到符合自己需求的公司的宣讲会时间,某些公司在宣讲会结束后会进行当场的笔试,一般现场笔试通过后,第二天会进行现场的面试。

3.补招

由于某些“收割机”的弃坑,这时候某些岗位可能还会有几个空缺的名额。招聘的形式与提前批相似,也通过员工内部推荐,简历通过后会进行面试。

关于实习

最后说说找实习的事情,建议大家提前一年准备春招,这样拼进互联网知名大厂(百度、阿里、腾讯、滴滴、美团、京东等等)的可能性很大。实习的工作地点无非太在意,实习最重要的是镀金,有互联网知名大厂的实习经历,在秋招找工作是非常吃香的。

因为实习经历绝大多数情况下决定了你的能力,HR在筛简历时就会认为你既然能被上一家大厂所认可,你的能力肯定不会差到哪里去,就会让你无需笔试直通面试,这样在秋招提前批拿到offer的几率更大!

校招面经

以下是我的校招面经:

网易游戏雷火事业群

1、块级元素和行内元素的区别

2、行内块级元素是什么东西?

3、HTML语义化的理解和作用

4、什么是盒子模型?

5、元素的水平和垂直居中

6、三栏布局,左右定宽,中间自适应

7、JavaScript的基本数据类型,0 == null吗?为什么?

8、跨域怎么做

9、移动端怎么做优化?动画如何做加速?

10、如何做首屏加速的?

11、移动端适配的3种方案

12、单页应用的路由内部原理怎么做的?自己实现过SPA吗?

13、了解过canvas和WebGL吗?

14、如果让你做IE7兼容,你怎么做?(从html,css,js方面说)

15、我们网易游戏要做一个交互性很强的移动端界面,你有什么思路吗?

有赞

1、性能优化

2、图片懒加载怎么做的(getBoundingClientRect)

3、懒加载的滚动如何做优化(函数节流)

4、cookie除了key与value还有哪些参数

5、做过后端吧?如何判断区分一个用户的身份?

6、session的生成规则?sessionid的生成规则?

CVTE

1、项目用REM布局吧?REM如何做自适应的?

2、知道哪5种设计模式吗?

3、Vue双向绑定的原理

4、AMD是什么?解决什么问题?了解AMD,CMD,UMD吗?AMD与CMD的区别?啥叫依赖前置?

5、BootStrap的栅格系统实现原理?

6、什么是原型链

7、三栏布局,左右定宽,中间自适应

8、性能优化

9、为什么选择做前端

10、为什么要用Vue框架?有比较其他框架吗?

11、了解WEB安全吗(XSS、CSRF)

12、项目中有针对WEB安全做防御吗?

百度-网页搜索部

1、项目都用Vue是吧,说说Vue的MVVM如何交互的?

2、知道Vue监测变量如何实现的吗?

3、VueRouter用哪些API实现的?改变hash参数会引起视图的更新吗?

4、说说你项目中实现的Dialog组件?提供了哪些API?如何设计这些API的?

5、用过AJAX吧?说说AJAX是干什么用的?如何实现AJAX?

6、说说你了解的垃圾回收机制

7、绑定事件有哪几种方式?addEventListener有哪些参数?冒泡跟捕获有什么区别?

8、来道算法题吧,在一个数组中求连续最大的累加和

9、居中可以使用哪几个属性?不定宽度与定宽度如何居中?

10、position有哪些属性,都是何意思?

11、啥是闭包?用来干嘛的?

12、CSS有了解过如何做动画吗?animation有哪些参数?

13、HTTP状态码

14、HTTP缓存

15、Git常用操作?merge与rebase有什么区别?

16、数据库有哪些引擎 17、数据库如何实现回滚

18、知道Promise是用来干嘛的吗?Promise底层如何实现的?为什么要用setTimeout去模拟

京东

1、介绍一个你觉得做的最好的项目

2、在做项目遇到过什么问题

3、怎么解决click 300ms的问题

4、fastclick内部实现

5、1px border的问题?为什么会产生?怎么解决?还有什么解决方案

6、touch有哪些事件?tap是原生事件吗?

7、HTTP状态码

8、304缓存

9、eTag跟哪个字段一起用?

10、闭包的定义与作用

11、闭包会产生什么问题?我说内存泄露,他问还有吗

12、原生Ajax的过程

readyState有哪几种值,分别代表什么

es6如何发异步请求? fetch与ajax有啥区别

Promise与setTimeout哪个先执行?为什么

性能优化方式

跨域有哪些方式?window.name有什么问题?

Get与Post有啥区别?哪个更快?

不定宽高3种垂直水平居中。

position取值,啥是stickty

网易游戏互娱事业群

两个栈实现一个队列

快排思想,手写快排

数组里有N个偶数个相同的数,只有一个奇数个相同的数,找出这个数

数组中的项是1-100连续的数,把任意一个数变为-1,找出这个数

有三个柜子,每个抽屉都有两个球,第一个抽屉是2个黑球;第二个抽屉是2个白球;第三个是1个白球和1个黑球。求一个抽屉拿到黑球的情况下,另一个球是白球的概率

假设一对夫妻生小孩的观念是这样的,如果第一次生到的是男孩,则不继续生了;如果第二次生到的是女孩,继续生到有男孩为止。求世界男女比例

什么是原型链

看代码说输出结果,并说原因。 var F = function () {} var f = new F() console.log(f.proto) console.log(f.proto.proto) console.log(f.proto.proto.proto)

说说有哪些请求方法,越多越好

GET与POST有啥区别

介绍一个你觉得最有难度的项目

为什么用Vue不用其他框架

用Vue的原因

说说Vue的优势

看过源码是吧?说说你对Vue哪种机制最熟悉?并说说其源码实现过程

微众银行

除了前端方向,我们还有大数据和JAVA方向,你对哪个有意向?

Vue2有哪些新特性?双向绑定如何实现?

项目有遇到什么问题?

设计一个微信服务器与开发者的交互,判断是否有权限操作

迅雷

介绍一个最近做的一个项目

做项目的时候遇到过什么问题

闭包,如何防止IE下的内存泄露

undefined与null的区别。举个用到undefined与null的例子

介绍一下HTTP协议与HTTP Ruquest

HTTP缓存

Last-Modified的时间如何生成的

GET与POST的区别

我说到POST会发送两次数据包的时候,反问我,你这个是从哪里看的?确定是官方说的?如果POST的数据量很少的时候呢?也会分两次发吗?为什么?

我说到GET参数暴露到url上不安全,而POST更安全,他反问你不会装包吗?都能装到包为什么还安全?GET与POST的区别到底在哪里,为何这两者要区分开。如何防止数据被抓包

我说到GET的传输数据包的体积与POST的不同,反问我,你确定GET只能传4K?有什么办法使GET能传输与POST一样大小的数据包容量?

HTTP2有什么新特性?多路复用中,HTTP2能兼容HTTP1.1的请求吗?比如:会请求多个域名服务器,有些请求是HTTP1的有些请求是HTTP2的?这样子合法吗?

性能优化

数组去重,说出哈希表法的时间复杂度与空间复杂度。hash表查找的过程时间复杂度是多少,为什么?

如何防止非本地域名脚本的恶性注入?(两种方法)

如何防范CSRF攻击(两种方法)

MVC、MVVM的交互流程

typeof有哪些返回值

跨域方式

继承的6种方法

cookie与Web Storge的区别?如何在IE下存储4M的数据

说输出结果题1 console.log(typeof ('a' - 1))

说输出结果题2 for (var i = 0;i < 3;i++) { setTimeout(function () { console.log(i++) }, 0) console.log(i) }

说输出结果题3 function bar() { return foo foo = 2 function foo() {} var foo foo = 'string' } console.log(bar())

交换排序与堆排序的时间复杂度是多少

1~100000个连续的数,随机取出两个数。不能用特定的数据结构,不能用数组方法找出这两个数 WPS

介绍BFPRT算法

null是什么?与undefined的区别

说出结果,null > 0,null >= 0,null == 0。并说出原因

写出匹配IP的正则表达式

写出观察者模式,如果要删除某个依赖呢

new运算符做了什么?写出代码

new中的this是何时生成的

实现一个类

实现继承,如何处理重复生成了两个相同的实例属性

Object.create()内部做了什么?

什么是函数?函数为什么可以当参数传递

写一个开头不能连续出现abc的正则,不区分大小写

线程与进程的区别

磁盘读取速度为什么比内存读取速度慢

tcp三次握手

DNS如何找IP

HTTP借用了TCP的哪些优点

HTTP的Content-Type可能取的值?设置哪个值是以json的格式去传输

AJAX实现过程

美团

如何做出五角星并居中

使用Math.random()的点怎样才能等概率地落到等边三角形中

实现这样一个功能: sum(2, 3) // 5 sum(2)(3) // 5

0.068如何转化成6.8%,这其中有什么坑?要怎么处理?

说说JavaScript的数据类型

如何判断是否是Array

如何判断是NaN

如何实现一个手表,如果是实现一个计秒器呢?

setTimeout发生在什么时刻,如何避免延迟?

说说项目的难点以及遇到的问题

说说v-model的实现原理

如何实现v-model的单向绑定

如何实现跨组件的通信,比如点击一个按钮,要使另一个组件中背景色改变

如何实现跨页面的通信,需求同上

如何实现跨域页面的通信,需求同上

如何实现跨iframe且跨域页面的通信?

字符串反转不能用辅助API

两个有序数组合并成一个有序数组

两个无序数组合并成一个有序数组的两种方式,并说说这两种方式最优的时间复杂度是多少,过程是如何求出来的?

http构成

https原理

为啥要用非对称加密

客户端是如何验证证书的合法性的?

浏览器如何渲染界面

什么是reflow与repaint?哪个性能消耗大

如何避免reflow?

看《JavaScript高级程序设计》的时候觉得哪块最难理解?讲一下

讲解你项目中遇到的难点?

你博客主要写什么内容?发个地址来看看

对什么排序熟悉?我说快排。那来道非递归的快排吧

看你博客写了TCP的内容,说说TCP与UDP的区别

TCP如何实现拥塞控制的?一发生网络堵塞,为什么把拥塞窗口重新设置为1。设置为1,这个发送流量不是很小了吗,这不是前后矛盾了吗?

智力题:有N个物品,其中有一个是很轻的,有一个天平,用最少的次数找出这个轻的物品

富途

说说原型

以下代码中F与f与F.prototype与它们之间是什么关系 function F() {} var f = new F() f.constuctor是什么?f自身存在constuctor吗?为什么?

JavaScript如何实现继承

继承之后的child.constuctor是什么值

console.log(f.prototype)的结果是什么

两个升序的数组,判断一个数组中是否包含另一个数组的所有项?还有更优的解决方案吗?原来的时间复杂度是多少,现在的复杂度是多少?

以下代码怎么输出?为什么会这样?如何改善?setTimeout为什么在最后输出? for (var i = 0; i < 3; i++) setTimeout(function () { console.log(i) }, 0)

说说HTTP缓存

浏览器怎么判断是否是强缓存过期,整个过程是怎么样的?协商缓存具体整个过程?

返回200状态码后,还会重新发送一次请求来获取文件吗?

Web安全

TCP与UDP有什么区别?

HTTP与HTTPS有啥区别?HTTPS握手过程?HTTPS都是怎么加密的?具体点哪里对称加密哪里非对称加密 状态码301与302有啥区别?

说说cookie与session

cookie与离线存储的区别

求第n大的数?时间复杂度多少?

雅虎的N条军规你知道吗?

什么是跨域?怎么解决跨域问题?

为什么要把资源文件放在另一个服务器中?除了服务器压力的问题呢?还有没有其他?

如何破解验证码?

有一堆猴子与一堆桃子,若这些猴子每人分3个桃子,最后剩下59个桃子。若每人分5个桃子,最后一个猴子分到<5个桃子,求有多少个猴子与桃子

服务器突然很卡你会怎么排查?如果看日志看不出问题呢?如果看内存看不出问题呢

怎么设计分页接口的参数?若以id为自增唯一索引,有什么缺陷?那用什么当唯一索引比较好? 一个Room类里面有Door,一个User类,只有主人才能开这个door。问这个开door的函数是放在Room类?还是放在User类?

说说你对富途的了解

荔枝FM

说出输入 function fn() { return function () { return inner var inner = 3 inner = 'a' function inner() {} } } 写出Function.prototype.bind的polyfill

输出z-index属性的元素排布,层叠上下文,还有什么属性可以使z-index生效

有四个接口/a,/b,/c,/d。找出一个相应时间最快的接口,并返回这个时间

写个弹窗组件,有title,body,cancelText,confirmText参数。可以通过on来绑定回调,与及通过off解绑。 var dialog = new Dialog() dialog.on('show', function () { console.log('showing') }) dialog.on('hide', function () { console.log('hideing') })

dialog.show() // showing dialog.hide() // hideing 两栏布局一边定宽一边自适应的多种方法 介绍BFC 如何解决跨域问题 服务器如何监测是否跨域 我不想每次进来都重新加载这个文件,有什么办法 Vue父子组件如何通信,跨级组件呢,不用Vuex呢? 如何与后端协作?在后端没有做出接口的时候,怎么套数据?在线上有接口的时候,怎么套数据? 追一科技 如何实现微信电脑端登录的功能? 一个猴子,一共有100根香蕉,每次最多能拿50根,回家有50m,每走1m需要消耗1根香蕉。问最多带多少根香蕉回家?

CruxF avatar Jan 25 '18 09:01 CruxF

thx : )

dffshikibode avatar Feb 09 '18 08:02 dffshikibode

谢谢分享!

LoverFancy avatar Apr 13 '18 08:04 LoverFancy