2018前端常见问题整理

$HTML, HTTP,web综合问题

一、前端须要注意哪些SEO

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

二、img的title和alt有什么区别

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

三、HTTP的几种请求方法用途

一、GET方法javascript

  • 发送一个请求来取得服务器上的某一资源css

二、POST方法html

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

三、PUT方法vue

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

四、HEAD方法java

  • 只请求页面的首部react

五、DELETE方法jquery

  • 删除服务器上的某资源webpack

六、OPTIONS方法

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

七、TRACE方法

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

八、CONNECT方法

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

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

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

五、如何进行网站性能优化

content方面

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

Server方面

  1. 使用CDN
  2. 配置ETag
  3. 对组件使用Gzip压缩

Cookie方面

  1. 减少cookie大小

css方面

  1. 将样式表放到页面顶部
  2. 不使用CSS表达式
  3. 使用<link>不使用@import

Javascript方面

  1. 将脚本放到页面底部
  2. javascriptcss从外部引入
  3. 压缩javascriptcss
  4. 删除不须要的脚本
  5. 减小DOM访问

图片方面

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

六、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 服务器端暂时没法处理请求(多是过载或维护)。

七、语义化的理解

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

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

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

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

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

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

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

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

  • 绘画 canvas

  • 用于媒介回放的 videoaudio 元素

  • 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失

  • sessionStorage 的数据在浏览器关闭后自动删除

  • 语意化更好的内容元素,好比articlefooterheadernavsection

  • 表单控件,calendardatetimeemailurlsearch

  • 新的技术webworker, websocket, Geolocation

移除的元素:

  • 纯表现的元素:basefontbigcenterfont, sstrike,tt,u`

  • 对可用性产生负面影响的元素:frameframesetnoframes

支持HTML5新标签:

  • IE8/IE7/IE6支持经过document.createElement方法产生的标签

  • 能够利用这一特性让这些浏览器支持HTML5新标签

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

固然也能够直接使用成熟的框架、好比html5shim

十、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

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

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

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

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

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

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

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

存储大小:

  • cookie数据大小不能超过4k

  • sessionStoragelocalStorage虽然也有存储大小的限制,但比cookie大得多,能够达到5M或更大

有期时间:

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

1三、iframe有那些缺点?

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

1四、WEB标准以及W3C标准是什么?

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

1五、xhtml和html有什么区别?

一个是功能上的差异

  • 主要是XHTML可兼容各大浏览器、手机以及PDA,而且浏览器也能快速正确地编译网页

另外是书写习惯的差异

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

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

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

1七、行内元素有哪些?块级元素有哪些? 空(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>
  • 行内元素不能够设置宽高,不独占一行
  • 块级元素能够设置宽高,独占一行

1八、HTML全局属性(global attribute)有哪些

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

1九、Canvas和SVG有什么区别?

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

20、HTML5 为何只须要写 ?

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

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

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

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

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

$CSS部分

一、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

四、什么是FOUC?如何避免

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

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

建立规则:

  • 根元素

  • 浮动元素(float不是none

  • 绝对定位元素(position取值为absolutefixed

  • display取值为inline-block,table-cell, table-caption,flex, inline-flex之一的元素

  • overflow不是visible的元素

做用:

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

六、display,float,position的关系

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

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

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

八、为何要初始化CSS样式?

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

九、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 单选框或复选框被选中

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

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

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

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

十二、CSS优先级算法如何计算?

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

1三、对BFC规范的理解?

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

1四、谈谈浮动和清除浮动

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

1五、position的值, relative和absolute定位原点是

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

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

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

1七、PNG,GIF,JPG的区别及如何选

GIF

  • 8位像素,256

  • 无损压缩

  • 支持简单动画

  • 支持boolean透明

  • 适合简单动画

JPEG

  • 颜色限于256

  • 有损压缩

  • 可控制压缩质量

  • 不支持透明

  • 适合照片

PNG

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

1八、行内元素float:left后是否变为块级元素?

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

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

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

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

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

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

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

2二、CSS合并方法

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

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

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

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

  • positiondisplayfloatwidthheight、marginpaddingtopleftright、`

2五、CSS在性能优化方面的实践

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

2六、CSS3动画(简单动画的实现,如旋转等)

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

2七、base64的原理及优缺点

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

2八、几种常见的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;
    }


<divclass="container"><divclass="left"></div><divclass="right"></div><divclass="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;
        }


<divclass="container"><divclass="main"></div><divclass="left"></div><divclass="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;
        }


<divclass="content"><divclass="main"></div></div><divclass="left"></div><divclass="right"></div>
复制代码

2九、stylus/sass/less区别

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

30、postcss的做用

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

$JavaScript

一、闭包

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

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

闭包的特性:

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

说说你对闭包的理解

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

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

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

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

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

使用闭包的注意点

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

二、说说你对做用域链的理解

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

三、JavaScript原型,原型链 ? 有什么特色?

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

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

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

特色:

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

当咱们须要一个属性的时,Javascript引擎会先看当前对象中是否有这个属性, 若是没有的

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

四、请解释什么是事件代理

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

五、Javascript如何实现继承?

构造继承

原型继承

实例继承

拷贝继承

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

functionParent(){
        this.name = 'wang';
    }

    functionChild(){
        this.age = 28;
    }
    Child.prototype = new Parent();//继承了Parent,经过原型var demo = new Child();
    alert(demo.age);
    alert(demo.name);//获得被继承的属性
  }
复制代码

六、谈谈This对象的理解

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

七、事件模型

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

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

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

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

九、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暴露了与服务器交互的细节。

  • 对搜索引擎的支持比较弱。

  • 不容易调试。

十、如何解决跨域问题?

  • jsonpiframewindow.namewindow.postMessage、服务器上设置代理页面

十一、模块化开发怎么作?

  • 当即执行函数,不暴露私有成员

    var module1 = (function(){     var _count = 0;     var m1 = function(){       //...     };     var m2 = function(){       //...     };     return {       m1 : m1,       m2 : m2     };   })();

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

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

1三、那些操做会形成内存泄漏?

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

1四、XML和JSON的区别?

数据体积方面

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

数据交互方面

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

数据描述方面

  • JSON对数据的描述性比XML较差

传输速度方面

  • JSON的速度要远远快于XML

1五、谈谈你对webpack的见解

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

1六、说说你对AMD和Commonjs的理解

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

1七、常见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方式方法不少样,但总的思想都是一致的,就是在客户端页面增长伪随机数
  • 经过验证码的方法

1八、用过哪些设计模式?

工厂模式:

  • 工厂模式解决了重复实例化的问题,但还有一个问题,那就是识别问题,由于根本没法

  • 主要好处就是能够消除对象间的耦合,经过使用工程方法而不是new关键字

构造函数模式

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

1九、为何要有同源限制?

  • 同源策略指的是:协议,域名,端口相同,同源策略是一种安全协议
  • 举例说明:好比一个黑客程序,他利用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 + 溢出内容的尺寸

2一、javascript有哪些方法定义对象

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

2二、常见兼容性问题?

  • 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属性.

2二、说说你对promise的了解

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

pending: 初始状态, 非 fulfilledrejected.

fulfilled: 成功的操做.

rejected: 失败的操做.

settled: Promise已被fulfilledrejected,且不是pending

另外, fulfilledrejected一块儿合称 settled

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

Promise 的构造函数

  • 构造一个 Promise,最基本的用法以下:

    var promise = newPromise(function(resolve, reject) {

    if (...) {  // succeed
    
              resolve(result);
    
          } else {   // fails
    
              reject(Error(errMessage));
    
          }
      });
    复制代码
  • Promise 实例拥有 then 方法(具备 then 方法的对象,一般被称为thenable)。它的使用方法以下:

    promise.then(onFulfilled, onRejected)

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

2三、你以为jQuery源码有哪些写的好的地方

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

2四、vue、react、angular

Vue.js

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

AngularJS

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

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

2五、Node的应用场景

特色:

  • 一、它是一个Javascript运行环境

  • 二、依赖于Chrome V8引擎进行代码解释

  • 三、事件驱动

  • 四、非阻塞I/O

  • 五、单进程,单线程

优势:

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

缺点:

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

2六、谈谈你对AMD、CMD的理解

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

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

2七、那些操做会形成内存泄漏?

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

2八、web开发中会话跟踪的方法有哪些

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

2九、介绍js的基本数据类型

  • UndefinedNullBooleanNumberString

30、介绍js有哪些内置对象?

  • ObjectJavaScript 中全部对象的父对象
  • 数据封装类对象:ObjectArrayBooleanNumberString
  • 其余对象:FunctionArgumentsMathDateRegExpError

3一、说几条写JavaScript的基本规范?

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

3二、JavaScript有几种类型的值?,你能画一下他们的内存图吗?

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

3三、javascript建立对象的几种方式?

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

  • 对象字面量的方式

    person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};

  • function来模拟无参的构造函数

    functionPerson(){} 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关键字定义构造的上下文属性)

    functionPet(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 =newObject(); wcDog.name="旺财"; wcDog.age=3; wcDog.work=function(){ alert("我是"+wcDog.name+",汪汪汪......"); } wcDog.work();

  • 用原型方式来建立

    functionDog(){

    }
       Dog.prototype.name="旺财";
       Dog.prototype.eat=function(){
       alert(this.name+"是个吃货");
       }
       var wangcai =new Dog();
       wangcai.eat();
    复制代码
  • 用混合方式来建立

    functionCar(name,price){ this.name=name; this.price=price; } Car.prototype.sell=function(){ alert("我是"+this.name+",我如今卖"+this.price+"万元"); } var camry =new Car("凯美瑞",27); camry.sell();

3四、eval是作什么的?

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

3五、null,undefined 的区别?

undefined 表示不存在这个值。

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

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

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

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

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

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

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

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

3七、javascript 代码中的"use strict";是什么意思 ? 使用它区别是什么?

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

3八、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);

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

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

40、同步和异步的区别?

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

4一、渐进加强和优雅降级

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

优雅降级 :一开始就构建完整的功能,而后再针对低版本浏览器进行兼容

4二、defer和async

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

4三、说说严格模式的限制

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

4四、attribute和property的区别是什么?

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

4五、谈谈你对ES6的理解

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

4六、ECMAScript6 怎么写class么,为何会出现class这种东西?

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

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

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

4八、面向对象编程思想

  • 基本思想是使用对象,类,继承,封装等基本概念来进行程序设计

  • 优势

  • 易维护

  • 采用面向对象思想设计的结构,可读性高,因为继承的存在,即便改变需求,那么维护也只是在局部模块,因此维护起来是很是方便和较低成本的

  • 易扩展

  • 开发工做的重用性、继承性高,下降重复工做量。

  • 缩短了开发周期

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

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

50、如何经过JS判断一个数组?

  • instanceof方法

  • instanceof 运算符是用来测试一个对象是否在其原型链原型构造函数的属性

    var arr = []; arr instanceofArray; // true

  • constructor方法

  • constructor属性返回对建立此对象的数组函数的引用,就是返回对象相对应的构造函数

    var arr = []; arr.constructor == Array; //true

  • 最简单的方法

  • 这种写法,是 jQuery 正在使用的

    Object.prototype.toString.call(value) == '[object Array]'// 利用这个方法,能够写一个返回数据类型的方法var isType = function (obj) { returnObject.prototype.toString.call(obj).slice(8,-1); }

  • ES5新增方法isArray()

    var a = newArray(123); var b = newDate(); console.log(Array.isArray(a)); //trueconsole.log(Array.isArray(b)); //false

5一、谈一谈let与var的区别?

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

5二、map与forEach的区别?

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

5三、谈一谈你理解的函数式编程?

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

5四、谈一谈箭头函数与普通函数的区别?

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

5五、谈一谈函数中this的指向吧?

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

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

方法调用模式

函数调用模式

构造器调用模式

graph LR
A-->B
复制代码
  • apply/call调用模式

5六、异步编程的实现方式?

回调函数

  • 优势:简单、容易理解

  • 缺点:不利于维护,代码耦合高

事件监听(采用时间驱动模式,取决于某个事件是否发生):

  • 优势:容易理解,能够绑定多个事件,每一个事件能够指定多个回调函数

  • 缺点:事件驱动型,流程不够清晰

发布/订阅(观察者模式)

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

Promise对象

  • 优势:能够利用then方法,进行链式写法;能够书写错误时的回调函数;

  • 缺点:编写和理解,相对比较难

Generator函数

  • 优势:函数体内外的数据交换、错误处理机制

  • 缺点:流程管理不方便

async函数

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

5七、对原生Javascript了解程度

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

5八、Js动画与CSS动画区别及相应实现

  • CSS3的动画的优势

  • 在性能上会稍微好一些,浏览器会对CSS3的动画作一些优化

  • 代码相对简单

  • 缺点

  • 在动画控制上不够灵活

  • 兼容性很差

  • JavaScript的动画正好弥补了这两个缺点,控制能力很强,能够单帧的控制、变换,同时写得好彻底能够兼容IE6,而且功能强大。对于一些复杂控制的动画,使用javascript会比较靠谱。而在实现一些小的交互动效的时候,就多考虑考虑CSS

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

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

for in循环

for循环

forEach

  • 这里的 forEach回调中两个参数分别为 valueindex

  • forEach 没法遍历对象

  • IE不支持该方法;Firefoxchrome 支持

  • forEach 没法使用 breakcontinue 跳出循环,且使用 return 是跳过本次循环

这两种方法应该很是常见且使用很频繁。但实际上,这两种方法都存在性能问题

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

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

60、gulp是什么?

  • gulp是前端开发过程当中一种基于流的代码构建工具,是自动化项目的构建利器;它不只能对网站资源进行优化,并且在开发过程当中不少重复的任务可以使用正确的工具自动完成

  • Gulp的核心概念:流

  • 流,简单来讲就是创建在面向对象基础上的一种抽象的处理数据的工具。在流中,定义了一些处理数据的基本操做,如读取数据,写入数据等,程序员是对流进行全部操做的,而不用关心流的另外一头数据的真正流向

  • gulp正是经过流和代码优于配置的策略来尽可能简化任务编写的工做

  • Gulp的特色:

  • 易于使用:经过代码优于配置的策略,gulp 让简单的任务简单,复杂的任务可管理

  • 构建快速 利用 Node.js 流的威力,你能够快速构建项目并减小频繁的 IO 操做

  • 易于学习 经过最少的 API,掌握 gulp 绝不费力,构建工做尽在掌握:如同一系列流管道

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

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

$jQuery

一、你以为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实现的链式调用能够节约代码,所返回的都是同一个对象,能够提升代码效率

二、jQuery 的实现原理?

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

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

window.jQuery = window.$ = jQuery;

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

三、jQuery.fn 的 init 方法返回的 this 指的是什么对象? 为何要返回 this?

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

四、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();

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

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

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

六、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

七、jQuery 中的 bind(), live(), delegate(), on()的区别?

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

八、是否知道自定义事件? jQuery 里的 fire 函数是什么意思,何时用?

  • 事件即“发布/订阅”模式,自定义事件即“消息发布”,事件的监听即“订阅订阅”

  • JS 原生支持自定义事件,示例:

    document.createEvent(type); // 建立事件 event.initEvent(eventType, canBubble, prevent); // 初始化事件 target.addEventListener('dataavailable', handler, false); // 监听事件 target.dispatchEvent(e); // 触发事件

  • jQuery 里的 fire 函数用于调用 jQuery 自定义事件列表中的事件

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

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

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

// 经过原生 JSON.stringify/JSON.parse 扩展 jQuery 实现
 $.array2json = function(array) {
    returnJSON.stringify(array);
 }

 $.json2array = function(array) {
    // $.parseJSON(array); // 3.0 开始,已过期returnJSON.parse(array);
 }

 // 调用var json = $.array2json(['a', 'b', 'c']);
 var array = $.json2array(json);
复制代码

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

$("#btn").on("mouseover mouseout", func);

  $("#btn").on({
      mouseover: func1,
      mouseout: func2,
      click: func3
  });
复制代码

十二、针对 jQuery 的优化方法?

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

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

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

1四、jQuery UI 如何自定义组件?

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

1五、jQuery 与 jQuery UI、jQuery Mobile 区别?

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

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

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

1六、jQuery 和 Zepto 的区别? 各自的使用场景?

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

1七、jQuery对象的特色

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

$编程题

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

// event(事件)工具集,来源:github.com/markyun
    markyun.Event = {
       
        // 视能力分别使用dom0||dom2||IE方式 来绑定事件// 参数: 操做的元素,事件名称 ,事件处理程序
        addEvent : function(element, type, handler) {
            if (element.addEventListener) {
                //事件类型、须要执行的函数、是否捕捉
                element.addEventListener(type, handler, false);
            } elseif (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);
            } elseif (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;
        }
复制代码

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

functionisArray(arg) {
    if (typeof arg === 'object') {
        returnObject.prototype.toString.call(arg) === '[object Array]';
    }
    returnfalse;
}
复制代码

三、冒泡排序

  • 每次比较相邻的两个数,若是后一个比前一个小,换位置

    var arr = [3, 1, 4, 6, 5, 7, 2];

    functionbubbleSort(arr) { for (var i = 0; i < arr.length - 1; i++) { for(var j = 0; j < arr.length - i - 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));

四、快速排序

  • 采用二分法,取出中间数,数组每次和中间数比较,小的放到左边,大的放到右边

    var arr = [3, 1, 4, 6, 5, 7, 2];

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

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

  • 假设:一个英文字符占用一个字节,一个中文字符占用两个字节

    functionGetBytes(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"));

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

  • bind的做用与callapply相同,区别是callapply是当即调用函数,而bind是返回了一个函数,须要调用的时候再执行。

一个简单的bind函数实现以下

Function.prototype.bind = function(ctx) {
    var fn = this;
    returnfunction() {
        fn.apply(ctx, arguments);
    };
};
复制代码

$其余

一、谈谈你对重构的理解

网站重构:在不改变外部行为的前提下,简化结构、添加可读性,而在网站前端保持一致的行为。也就是说是在不改变UI的状况下,对网站进行优化, 在扩展的同时保持一致的UI

对于传统的网站来讲重构一般是:

表格(table)布局改成DIV+CSS

使网站前端兼容于现代浏览器(针对于不合规范的CSS、如对IE6有效的)

对于移动平台的优化

针对于SEO进行优化

二、什么样的前端代码是好的

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

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

前端是最贴近用户的程序员,比后端、数据库、产品经理、运营、安全都近

  • 实现界面交互

  • 提高用户体验

  • 有了Node.js,前端能够实现服务端的一些事情

前端是最贴近用户的程序员,前端的能力就是能让产品从 90分进化到 100 分,甚至更好,

与团队成员,UI设计,产品经理的沟通;

作好的页面结构,页面重构和用户体验;

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

为简化用户使用提供技术支持(交互部分)

为多个浏览器兼容性提供支持

为提升用户浏览速度(浏览器性能)提供支持

为跨平台或者其余基于webkit或其余渲染引擎的应用提供支持

为展现数据提供支持(数据接口)

五、平时如何管理你的项目?

先期团队必须肯定好全局样式(globe.css),编码模式(utf-8) 等;

编写习惯必须一致(例如都是采用继承式的写法,单样式都写成一行);

标注样式编写人,各模块都及时标注(标注关键样式调用的地方);

页面进行标注(例如 页面 模块 开始和结束);

CSSHTML 分文件夹并行存放,命名都得统一(例如style.css);

JS 分文件夹存放 命名以该JS功能为准的英文翻译。

图片采用整合的 images.png png8 格式文件使用 - 尽可能整合在一块儿使用方便未来的管理

前端技术 微信群 欢迎加入

添加管理员微信申请入群 : yiyalan0826

相关文章
相关标签/搜索