关于前端:前端面试题江苏快三人工在线计划10319281

7次阅读

共计 18979 个字符,预计需要花费 48 分钟才能阅读完成。

CSS 面试题:加一 Q 一带一你10319281邀一情一玛33339333进【c9183.com】已助上千人成功翻盘,欢迎增加,沟通交流!
1、谈谈你对 CSS 盒模型的意识?

1、基本概念:规范模型 +IE 模型
CSS 盒模型实质上是一个盒子,封装四周的 HTML 元素,它包含:内边距(padding),边框(border),margin(外边距),和内容(content)。
规范盒模型:一个块的总宽度 =width+margin(左右)+padding(左右)+border(左右)
怪异 (IE) 盒模型:一个块的总宽度 =width+margin(左右)(既 width 曾经蕴含了 padding 和 border 值)
设置盒模型:box-sizing:border-box

2、CSS 是如何设置这两种模型,那么二者怎么转化呢?

content-box: 指的是 W3C 规范盒模型,也是默认的设置属性。
border-box:指的是 IE 盒模型,width 和 height 蕴含了 padding 和 border。

3、JS 如何获取盒模型对应的宽和高?

dom.style.width/height:对节点款式可读可写,但只能读或写内嵌的 CSS 款式对于在 (style) 或外联款式不能读写。
dom.currentStyle.width/height:拿到的是渲染之后的宽和高,比拟实在,但反对 IE 浏览器
window.getComputedStyle(dom).width/height:办法是只读的,只能获取款式,不能设置。
dom.getBoundingClientRect().width/height:getBoundingClientRect() 办法失去 8 个值,除了 width 和 height 外的属性 x、y、left、top、right 和 bottom 都是绝对于视口 (viewport) 的左上角地位而言的。

4、什么是 BFC?BFC 的原理?

块级格式化上下文。是一种边距重叠解决方案。
利用场景:1. 解决 margin 叠加的问题

  1. 用于布局(overflow: hidden)

3.BFC 不会与浮动盒子叠加。

  1. 用于革除浮动,计算 BFC 高度。

5、行内元素和块级元素有什么区别?

块级元素:显示在一块内,会主动换行,元素会从上到下垂直排列,各自占一行,块级元素能够设置宽高,如 p,ul,form,div,(h1-h6)等标签元素
行内元素:元素在一行内程度排列,高度由元素的内容决定,行内元素不能够设置宽高,如 a,br,span,input 等元素。

6、行内元素和块级元素如何转换?

行变块 display:block
块变行display:inline
display:inline-block(能够在同一行内显示)。

7、什么是伪类选择器和伪元素?列举 3 个 CSS3 中引入的伪类选择器和伪元素!

伪类用一个冒号来示意,而伪元素则用两个冒号来示意。
伪元素选择器:dom 中不存在的元素,仅仅是 css 中用来渲染,增加一些特殊效果的,比方 p::before,抉择 p 标签(真元素)后面的假元素(伪元素,p 标签后面没有元素,只是假如有)
::first-line 抉择元素的第一行,比如说扭转每个段落的第一行文本的款式
::before::after这两个次要用来给元素的后面或前面插入内容,这两个罕用 ”content” 配合应用,见过最多的就是革除浮动
::selection 用来扭转浏览网页选中文的默认成果

伪类选择器:一个概念上的类,不是咱们定义的,是形象的。如 a:hover,抉择 a 标签(元素选择器)中具备鼠标悬停类的所有元素,这个类是形象的,不是咱们本人定义的,再如first-child,抉择第一个,抉择具备这个类性质的所有元素,“第一个”,这个类就形象了,咱们没必要定义一个第一个这样的类
列举::root()选择器,根选择器,匹配元素 E 所在文档的根元素。在 HTML 文档中,根元素始终是(html)。:root 选择器等同于(html)元素。
:not()选择器称为否定选择器,和 jQuery 中的:not 选择器截然不同,能够抉择除某个元素之外的所有元素。
:empty()选择器示意的就是空。用来抉择没有任何内容的元素,这里没有内容指的是一点内容都没有,哪怕是一个空格。

8、px 和 em,rem 的区别?

px 实际上就是像素,用 PX 设置字体大小时,比较稳定和准确。px 是固定长度单位,不随其它元素的变动而变动
em 就是依据基准来缩放字体的大小。em 是绝对长度单位。em 是绝对于父级元素的单位,会随父级元素的属性(font-size 或其它属性)变动而变动
rem 是 CSS3 新增的一个绝对单位,rem 是绝对于根目录(HTML 元素)的,所有它会随 HTML 元素的属性(font-size)变动而变动
例如:== 屏幕宽度 / 设计宽度 = 1rem 的值 / 预设定 rem 的值。
1920/1920=100/100 ;
所以 1rem=1920/1920*100 ;
document.documentElement 是 html 节点
document.documentElement.style.fontSize = ((windowWidth / designWidth) * rem2px) + 'px';
如果,用户将屏幕拖小了,变为 960。1rem 将主动变为 50px;960/1920 乘以 100=50
这里须要判断下,当屏幕的宽度大于设计稿定义的宽度,用设计稿的宽度,如果小于,用屏幕宽度作为变量屏幕宽度。

10、对于相对定位,绝对定位和固定定位

1、绝对定位不脱离规范流,在页面中占地位。
绝对于本人原来的地位来进行定位。
2、相对定位脱离规范流,在页面中不占地位。
如果没有父元素,则绝对于 body 定位;如果有父元素,但父元素没有定位,那么还是绝对于 body 定位;如果父元素有定位,那么绝对于父元素来定位。
3、固定定位:绝对于浏览器窗口进行定位
绝对定位:position: relative;
相对定位:position: absolute;

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

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)

1.2 能够继承的属性:
可继承的款式:font-size font-family color, UL LI DL DD DT;
不可继承的款式:border padding margin width height ;

优先级:!important > id > class > tag
important 比 内联优先级高, 但内联比 id 要高

CSS3 新增伪类举例:
p:first-of-type 抉择属于其父元素的首个 <p> 元素的每个 <p> 元素。
p:last-of-type 抉择属于其父元素的最初 <p> 元素的每个<p> 元素。
p:only-of-type 抉择属于其父元素惟一的<p> 元素的每个<p> 元素。
p:only-child 抉择属于其父元素的惟一子元素的每个<p> 元素。
p:nth-child(2) 抉择属于其父元素的第二个子元素的每个<p> 元素。
:enabled :disabled 管制表单控件的禁用状态。
:checked 单选框或复选框被选中。

12、以下是 CSS3 的几种罕用前缀

-webkit
-moz
-ms
-o

13、CSS3 新增的伪类有哪些

p:last-of-type 抉择属于其父元素的最初 <p> 元素的每个 <p> 元素。
p:only-of-type 抉择属于其父元素惟一的<p> 元素的每个 <p> 元素。
p:only-child 抉择属于其父元素的惟一子元素的每个 <p> 元素。
p:nth-child(2) 抉择属于其父元素的第二个子元素的每个 <p> 元素。
:enabled、:disabled 管制表单控件的禁用状态。
p:first-of-type 抉择属于其父元素的首个 <p> 元素的每个 <p> 元素。
:checked,单选框或复选框被选中。

14、CSS3 有哪些新个性?

  1. CSS3 实现圆角(border-radius),暗影(box-shadow)
  2. 对文字加特效(text-shadow),线性突变(gradient),旋转(transform)
  3. transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);// 旋转, 缩放, 定位, 歪斜
  4. 减少了更多的 CSS 选择器 多背景 rgba
  5. 在 CSS3 中惟一引入的伪类是 ::selection.
  6. 媒体查问,多栏布局
  7. border-image

15、为什么要初始化 CSS 款式。

因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对 CSS 初始化往往会呈现浏览器之间的页面显示差别。当然,初始化款式会对 SEO 有肯定的影响, 但求影响最小的状况下初始化。

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

因为浮动元素不再占用原文档流的地位,所以它会对前面的元素排版产生影响,革除浮动的实质: 次要为了解决父级元素因为子级浮动引起外部高度为 0 的问题。

  1. 应用空标签革除浮动。
    这种办法是在所有浮动标签前面增加一个空标签 定义 css clear:both. 弊病就是减少了无意义标签。
  2. 应用 overflow。
    给蕴含浮动元素的父标签增加 css 属性 overflow:auto; zoom:1; zoom:1用于兼容 IE6。
  3. 应用 after 伪对象革除浮动。
    该办法只实用于非 IE 浏览器。
    一、该办法中必须为须要革除浮动元素的伪对象中设置 height:0,否则该元素会比理论高出若干像素;
    能够给父元素设置 overflow:auto 或者 hidden

JS 的面试问题:

0、如何判断一个变量是对象还是数组?

1、咱们可能应用 typeof 判断变量的身份,判断字符串失去 string,数字和 NaN 失去 number,函数会失去 function 等,然而判断数组,对象和 null 时都会失去 object,这就是 typeof 的局限性,
2、应用 instanceof(比拟运算符)能够用来判断一个变量是数组还是对象
3、constructor(构造函数)
4、Object.prototype.toString.call()
总结:判断简略数据类型能够用 typeof,判断数组,对象应用instanceofconstructorObject.prototype.toString.call(),最好应用Object.prototype.toString.call(),更加精准

1. 闭包

闭包就是可能读取其余函数外部变量的函数。
内部函数调用之后其变量对象本应该被销毁,但闭包的存在使咱们依然能够拜访内部函数的变量对象
创立闭包最常见形式,就是在一个函数外部创立另一个函数。
闭包的毛病:滥用闭包函数会造成内存泄露,因为闭包中援用到的包裹函数中定义的变量都永远不会被开释
在退出函数之前,将不应用的局部变量全副删除。能够使变量赋值为 null;

2. 数据类型

根本数据类型:String(字符串),Boolean(布尔),number(数值),Null(空值),undefined(未定义)
援用数据类型:Object(Array,Date,RegExp,Function)

3.javascript 中 == 和 === 的区别是什么?举例说明。

=== 会主动进行类型转换,== 不会

4. 请尽可能详尽的解释 ajax 的工作原理

思路:先解释异步,再解释 ajax 如何应用
Ajax 的原理简略来说通过 XmlHttpRequest 对象来向服务器发异步申请,从服务器取得数据,而后用 JS 来操作 DOM 而更新页面。XMLHttpRequest 是 ajax 的外围机制,它是在 IE5 中首先引入的,是一种反对异步申请的技术。简略的说,也就是 javascript 能够及时向服务器提出申请和解决响应,而不阻塞用户。达到无刷新的成果。
特点:Ajax 能够实现异步通信成果,实现页面部分刷新,带来更好的用户体验;按需获取数据,节约带宽资源

ajax 是什么?

  1. 通过异步模式,晋升了用户体验
  2. 优化了浏览器和服务器之间的传输,缩小不必要的数据往返,缩小了带宽占用
  3. Ajax 在客户端运行,承当了一部分原本由服务器承当的工作,缩小了大用户量下的服务器负载。

Ajax 的毛病:

  1. Ajax 不反对浏览器 back 按钮
  2. 平安问题 Ajax 裸露了与服务器交互的细节
  3. 对搜索引擎的反对比拟弱
  4. 毁坏了程序的异样机制
  5. 不容易调试

HTTP 协定类型题目:

  1. HTTP 状态音讯

200:申请已胜利,申请所心愿的响应头或数据体将随此响应返回。
302:申请的资源长期从不同的 URI 响应申请。因为这样的重定向是长期的,客户端该当
持续向原有地址发送当前的申请。只有在 Cache-Control 或 Expires 中进行了指定的状况下,
这个响应才是可缓存的
304:如果客户端发送了一个带条件的 GET 申请且该申请已被容许,而文档的内容(自上
次访问以来或者依据申请的条件)并没有扭转,则服务器该当返回这个状态码。304 响应禁
止蕴含音讯体,因而始终以音讯头后的第一个空行结尾。
403:服务器曾经了解申请,然而拒绝执行它。
404:申请失败,申请所心愿失去的资源未被在服务器上发现。
500:服务器遇到了一个未曾意料的情况,导致了它无奈实现对申请的解决。一般来说,这个问题都会在服务器端的源代码呈现谬误时呈现。

6. 说一下什么是 Http 协定

对客户端和服务器端之间数据传输的格局标准,格局简称为“超文本传输协定”

7. 什么是 Http 协定无状态协定? 怎么解决 Http 协定无状态协定?

(1)、无状态协定对于事务处理没有记忆能力。短少状态意味着如果后续解决须要后面的信息
(2)、无状态协定解决办法:通过 1、Cookie 2、通过 Session 会话保留。

8.Http 协定中有哪些申请形式?

GET: 用于申请拜访曾经被 URI(对立资源标识符)辨认的资源, 能够通过 URL 传参给服务器,从指定的资源申请数据
POST: 用于传输信息给服务器, 向指定的资源提交要解决的数据
PUT: 传输文件, 报文主体中蕴含文件内容, 保留到对应 URI 地位
HEAD: 取得报文首部, 与 GET 办法相似, 只是不返回报文主体, 个别用于验证 URI 是否无效
DELETE: 删除文件, 与 PUT 办法相同, 删除对应 URI 地位的文件
OPTIONS: 查问响应 URI 反对的 HTTP 办法

区别:

Get 是通过地址栏来传值,而 Post 是通过提交表单来传值。

9.Http 协定由什么组成?

申请报文包含三局部 :
(1). 申请行: 蕴含申请办法,URI,HTTP 版本协定 (2). 申请首部字段 (3). 申请内容实体
响应报文蕴含三局部:
(1). 状态行: 蕴含 HTTP 版本, 状态码, 状态码起因短语 (2). 响应首部字段 (3). 响应内容实体

10.HTTP 协定的工作原理?

HTTPS 在传输数据之前须要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立单方加密传输数据的明码信息,通常状况下会配合数字证书实现。

13.ajax 的同步和异步区别:

  1. 同步:提交申请 -> 期待服务器解决 -> 处理完毕返回,这个期间客户端浏览器不能干任何事
  2. 异步:申请通过事件触发 -> 服务器解决(这是浏览器依然能够作其余事件)-> 处理完毕
    ajax.open 办法中,第 3 个参数是设同步或者异步。

14. 跨域? ?

了解跨域的概念:协定、域名、端口都雷同才同域,否则都是跨域

14-1、什么状况下会碰到跨域问题?有哪些解决办法?

跨域是指 a 页面想获取 b 页面资源,如果 a、b 页面的协定、域名、端口、子域名不同,或是 a 页面为 ip 地址,b 页面为域名地址,所进行的拜访口头都是跨域的,而浏览器为了平安问题个别都限度了跨域拜访,也就是不容许跨域申请资源。
解决办法:1. JSONP 办法:JSONP 是服务器与客户端跨源通信的罕用办法,Jsonp 须要指标服务器配合一个 callback 函数网页通过增加一个 (script) 元素,向服务器申请 JSON 数据,这种做法不受同源政策限度;服务器收到申请后,将数据放在一个指定名字的回调函数里传回来。
首先,网页动静插入 (script) 元素,由它向跨源网址发出请求。
2. 通过批改 document.domain 来跨子域
3. 应用 window.name 来进行跨域
4. 通过 CORS 解决 AJAX 跨域

15. 简述 ajax 的过程。

  1. 创立 XMLHttpRequest 对象, 也就是创立一个异步调用对象
  2. 创立一个新的 HTTP 申请, 并指定该 HTTP 申请的办法、URL 及验证信息
  3. 设置响应 HTTP 申请状态变动的函数
  4. 发送 HTTP 申请
  5. 获取异步调用返回的数据
  6. 应用 JavaScript 和 DOM 实现部分刷新

16.axios 和 ajax 的区别

axios 是通过 promise 实现对 ajax 技术的一种封装,就像 jQuery 实现 ajax 封装一样。
简略来说:ajax 技术实现了网页的部分数据刷新,axios 实现了对 ajax 的封装。

②axios 特色:
1. 主动转换 JSON 数据
2. 从 node.js 创立 http 申请
3. 反对 Promise API
4. 客户端反对避免 CSRF
5. 提供了一些并发申请的接口
PS:避免 CSRF:就是让你的每个申请都带一个从 cookie 中拿到的 key,依据浏览器同源策略,混充的网站是拿不到你 cookie 中失去 key 的,这样,后盾就能够轻松分别出这个申请是否是用户在混充网站上的误导输出,从而采取正确的策略

17.JavaScript 链 原型,原型链 ? 有什么特点?

1. 原型对象也是一般的对象,是对象一个自带隐式的 proto 属性,原型也有可能有本人的原型,如果一个原型对象的原型不为 null 的话,咱们就称之为原型链

  1. 原型链是由一些用来继承和共享属性的对象组成的(无限的)对象链。

3. 每一次获取对象中的属性都是一次查问过程,如果在自有属性中找不到就会去原型对象中查找,如果原型对象中还查不到,就回去原型对象的原型中查找,也就是依照原型链查找,直到查找到原型链的顶端,也就是 Object 的原型。

作用域链:
个别状况下,变量取值到 创立 这个变量 的函数的作用域中取值。
然而如果在以后作用域中没有查到值,就会向下级作用域去查,直到查到全局作用域,这么一个查找过程造成的链条就叫做作用域链。

一、作用域
在 Javascript 中,作用域分为 全局作用域 和 函数作用域
全局作用域:
代码在程序的任何中央都能被拜访,window 对象的内置属性都领有全局作用域。
函数作用域:
在固定的代码片段能力被拜访

18、JS 创建对象有几种办法?

1.new Object()
2. 应用字面量
3. 工厂模式
4. 构造函数模式(constructor)
5. 原型模式(prototype)
6. 构造函数 + 原型模式
还是点击上面链接解说的比拟具体吧 ↓
https://www.jianshu.com/p/1fb…

19、虚构 dom 和实体 dom 的区别?

DOM 的实质:
浏览器概念,浏览器从服务器端读取 html 页面,浏览器将 html 解析成一棵元素嵌套关系的 dom 树,用对象来示意页面上的元素,并提供操作 dom 对象的 api。
虚构 DOM:
框架概念,程序员用 js 对象来模仿页面上 dom 元素的嵌套关系 (实质),为了实现页面元素的高效更新(目标)
区别:1、虚构 DOM 不会进行重排与重绘操作;
2、虚构 DOM 进行频繁批改,而后一次性比拟并批改实在 DOM 中须要批改的局部,最初进行重排和重绘,缩小过多 DOM 节点重排和重绘损耗。
3、虚构 DOM 无效升高大面积(实在 DOM 节点)的重排和重绘,因为最终与实在 DOM 比拟差别,能够部分渲染

20、形容一下事件冒泡机制

当你应用事件冒泡时,子级元素先触发,父级元素后触发,即 p 先触发,div 后触发。

21、请形容一下 cookies,sessionStorage 和 localStorage 的区别

cookie(贮存在用户本地终端上的数据)是网站为了标识用户身份而贮存在用户本地终端上的数据,cookie 数据始终在同源的 http 申请中携带,只会在浏览器和服务器间来回传递。另外两个不会主动把数据发给服务器,仅在本地保留。

22、js 阻止事件冒泡的两种办法

event.stopPropagation()
event.target

23、JS 的内置对象

24、函数调用的四种形式

函数调用模式
办法调用模式
结构器调用模式
间接调用模式,通过 call()和 apply()进行

25、JS 中常见的几种继承办法

1.原型链继承
原型链实现继承的思维:利用原型让一个援用类型继承另一个援用类型的属性和办法。
原型链的基本概念:当一个原型对象等于另一个类型的实例,此时的原型对象将蕴含一个指向另一个指向另一个原型的指针。同时,另一个原型中也蕴含着一个指向另一个构造函数的指针。如果另一个原型是另一个类型的实例,此时实例和原型就形成了原型链
原型链存在的问题
1)蕴含援用类型值的原型属性会被所有实例共享,这会导致对一个实例的批改会影响另一个实例。在通过原型来实现继承时,原型实际上会变成另一个类型的实例。原先的实例属性就变成了当初的原型属性
2)在创立子类型的实例时,不能向超类型的构造函数中传递参数

2. 构造函数继承(经典继承)
借用构造函数的根本思维,即在子类型构造函数的外部调用超类型构造函数。函数只不过是在特定环境中执行代码的对象,因而通过应用 apply()和 call()办法能够在新创建的对象上执行构造函数
借用构造函数的劣势 :能够在子类型构造函数中向超类型构造函数传递参数
借用构造函数的问题:
1)无奈防止构造函数模式存在的问题,办法都在构造函数中定义,因而无奈复用函数。
2)在超类型的原型中定义的办法,对子类型而言是不可见的。因而这种技术很少独自应用。

3. 组合形式继承(构造函数 + 原型链)
组合继承 :指的是将原型链和借用构造函数的技术组合到一起。思路是应用原型链实现对原型办法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数的复用,又可能保障每个实例都有它本人的属性。
组合继承的劣势
防止了原型链和借用构造函数的毛病,交融了他们的长处,是 JavaScript 中最罕用的继承模式。instanceof 和 isprototypeOf()也可能用于辨认基于组合继承创立的对象

4.es6 办法继承

27、JS 运行机制

JS 为什么是单线程?

  • JS 的单线程,与它的用处无关。作为浏览器脚本语言,JavaScript 的主要用途是与用户互动,以及操作 DOM。这决定了它只能是单线程,否则会带来很简单的同步问题。

JS 的运行机制:

  • 因为 JavaScript 是单线程,意味着工作要一个接着一个实现,然而,如果前一个工作执行工夫很长,那么前面的工作就得始终阻塞着,这样用户体验非常差。
    JavaScript 的设计者思考到了这一点,所以他将 JavaScript 的工作分为两种,在主线程上执行的工作 ” 同步工作 ”,被主线程挂载起来的工作 ” 异步工作 ”, 后者个别是放在一个叫工作队列的数据结构中。
    只有当所有同步工作都执行完了才会,开始察看工作队列中被挂载起来的工作,并且依照队列的个性,先进先出的顺次执行。

28、DOM 是什么?

DOM 是 Document Object Model,即文档对象模型,它容许脚本管制 Web 页面、窗口和文档。

29、DOM 事件流(event flow)存在三个阶段:事件捕捉阶段、处于指标阶段、事件冒泡阶段。

事件捕捉(event capturing):艰深的了解就是,当鼠标点击或者触发 dom 事件时,浏览器会从根节点开始由外到内进行事件流传,即点击了子元素,如果父元素通过事件捕捉形式注册了对应的事件的话,会先触发父元素绑定的事件。
事件冒泡(dubbed bubbling):与事件捕捉恰恰相反,事件冒泡程序是由内到外进行事件流传,直到根节点。
无论是事件捕捉还是事件冒泡,它们都有一个独特的行为,就是事件流传,
dom 规范事件流的触发的先后顺序为:先捕捉再冒泡,即当触发 dom 事件时,会先进行事件捕捉,捕捉到事件源之后通过事件流传进行事件冒泡。

30、数组去重的办法

1.ES6 Set 去重

`var arr = [1,2,3,3,2,1,5,1];
var arr2 = Array.from(new Set(arr))
console.log(arr2)` 

*   1
*   2
*   3

`var arr = [1,2,3,3,2,1,5,1];
let a = [...new Set(arr)]
console.log(a)` 

*   1
*   2
*   3

2. 利用 for 嵌套 for,而后 splice 去重
3. 利用 indexOf 去重

`var arr = [1,3,4,5,6,7,4,3,2,4,5,6,7,3,2];
function find(){var newArr = [];
for (var i = 0; i < arr.length; i++) {if (newArr.indexOf(arr[i]) == -1 ) {// 也能够换成 if(newArr.indexOf(arr[i])<0)
newArr.push(arr[i]);
  }
}
consoloe.log(newArr); // [1, 3, 4, 5, 6, 7, 2]
}
find(arr); // 调用这个办法  indexOf 对大小写敏感 ` 

*   1
*   2
*   3
*   4
*   5
*   6
*   7
*   8
*   9
*   10
*   11

4. 利用 filter
filter(x,index,self)能够为数组提供过滤性能,其中 x 代表元素,index是与 X 一起传入元素的索引,而 self 代表数组自身。

`var arr = [1, 2, 2, 3, 4, 5, 5, 6, 7, 7];
var arr2 = arr.filter(function(x, index,self) {return self.indexOf(x)===index;
}); 
console.log(arr2); //[1, 2, 3, 4, 5, 6 ,7]` 

*   1
*   2
*   3
*   4
*   5

32、事件委托

简介:事件委托指的是,不在事件的发生地(间接 dom)上设置监听函数,而是在其父元素上设置监听函数,通过事件冒泡,父元素能够监听到子元素上事件的触发,通过判断事件产生元素 DOM 的类型,来做出不同的响应。
举例:最经典的就是 ul 和 li 标签的事件监听,比方咱们在增加事件时候,采纳事件委托机制,不会在 li 标签上间接增加,而是在 ul 父元素上增加。
益处:比拟适合动静元素的绑定,新增加的子元素也会有监听函数,也能够有事件触发机制。

34、DOM 操作——怎么增加、移除、挪动、复制、创立和查找节点。

35、null 和 undefined 的区别?

null 是一个示意 ” 无 ” 的对象,转为数值时为 0
undefined 是一个示意 ” 无 ” 的原始值,转为数值时为 NaN
当申明的变量还未被初始化时,变量的默认值为 undefined
null 用来示意尚未存在的对象,罕用来示意函数希图返回一个不存在的对象
undefined 示意“短少值”,就是此处应该有一个值,然而还没有定义。典型用法是:

  • 1. 变量被申明了,但没有赋值时,就等于 undefined

    1. 调用函数时,应该提供的参数没有提供,该参数等于 undefined
    2. 对象没有赋值的属性,该属性的值为 undefined
    3. 函数没有返回值时,默认返回 undefined
  • null 示意“没有对象”,即该处不应该有值。典型用法是:

    1. 作为函数的参数,示意该函数的参数不是对象
    2. 作为对象原型链的起点

36、哪些操作会造成内存透露?

内存透露指任何对象在您不再领有或须要它之后依然存在。
垃圾回收器定期扫描对象,并计算援用了每个对象的其余对象的数量。如果一个对象的援用数量为 0(没有其余对象援用过该对象),或对该对象的惟一援用是循环的,那么该对象的内存即可回收。

  • setTimeout 的第一个参数应用字符串而非函数的话,会引发内存透露。
  1. 闭包
  2. 控制台日志
  3. 循环(在两个对象彼此援用且彼此保留时,就会产生一个循环)

37、typeof null 返回什么?为什么?

不同的对象在底层都示意为二进制,在 javascript 中二进制前三位都为 0 的话会被判断为 object 类型,
null 的二进制示意全 0,天然前三位也是 0,所以执行 typeof 时会返回“object”

39、ES6 中…运算符能做什么

1. 复制数组 2. 合并数组 3. 扩大运算符能够与解构赋值联合起来,用于生成数组。4. 扩大运算符还能够将字符串转为真正的数组

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

第一种——调用 localStorage
在一个标签页外面应用 localStorage.setItem(key,value)增加(批改、删除)内容;
在另一个标签页外面监听 storage 事件。
即可失去 localstorge 存储的值,实现不同标签页之间的通信。

第二种——调用 cookie+setInterval()
将要传递的信息存储在 cookie 中,每隔肯定工夫读取 cookie 信息,即可随时获取要传递的信息。

43、数据类型的主动转换和隐式转换你晓得哪些?

隐式类型转换:
1 ==‘1’
‘1’+ 1
‘1’– 1
显示类型转换
parseInt(str,radix)/parseFloat(str,radix)/Number() 转变成数字。
Boolean(param)转变成布尔值
subString() 转变成字符串

VUE 方面的问题:
1. 谈谈你对 MVVM 开发模式的了解

**Vue 是一个 MVVM 框架,其各层的对应关系如下:
View 层:在 Vue 中是绑定 dom 对象的 HTML(代表 UI 视图,负责数据的展现;)
ViewModel 层:在 Vue 中是实例的 vm 对象 (负责监听 Model 中数据的扭转并且管制视图的更新,解决用户交互操作;)
Model 层:在 Vue 中是 data、computed、methods 等中的数据 (代表数据模型,数据和业务逻辑都在 Model 层中定义;)
在 Model 层的数据变动时,View 层会在 ViewModel 的作用下,实现自动更新 **

2、Vue 的响应式原理?

Vue 响应式底层实现办法是 Object.defineProperty() 办法,该办法中存在一个 getter 和 setter 的可选项,能够对属性值的获取和设置造成影响
Vue 中编写了一个 wather 来解决数据,在应用 getter 办法时,总会告诉 wather 实例对 view 层渲染页面,同样的,在应用 setter 办法时,总会在变更值的同时,告诉 wather 实例对 view 层进行更新

3、Vue 的生命周期

1.beforeCreate – 创立前
触发的行为:vue 实例的挂载元素 $el 和数据对象 data 都为 undefined,还未初始化。
在此阶段能够做的事件:加 loading 事件
2.created – 创立后
触发的行为:vue 实例的数据对象 data 有了,$el还没有
在此阶段能够做的事件:解决 loading,申请ajax 数据为 mounted 渲染做筹备
3.beforeMount – 渲染前
触发的行为:vue 实例的 $el 和 data 都初始化了,但还是虚构的 dom 节点,具体的 data.filter 还未替换
在此阶段能够做的事件:。。。
4.mounted – 渲染后
触发的行为:vue 实例挂载实现,data.filter 胜利渲染
在此阶段能够做的事件:配合路由钩子应用
5.beforeUpdate – 更新前
触发的行为:data 更新时触发
在此阶段能够做的事件:。。。
6.updated —更新后
触发的行为:data 更新时触发
在此阶段能够做的事件:数据更新时,做一些解决(此处也能够用 watch 进行观测)
7.beforeDestroy —销毁前
触发的行为:组件销毁时触发
在此阶段能够做的事件:可向用户询问是否销毁
8.destroyed —销毁后
触发的行为:组件销毁时触发,vue 实例解除了事件监听以及和 dom 的绑定(无响应了),但 DOM 节点仍旧存在
在此阶段能够做的事件:组件销毁时进行提醒

4、请具体说下你对 vue 生命周期的了解?

答:总共分为 8 个阶段:创立前 / 后,载入前 / 后,更新前 / 后,销毁前 / 后。
创立前 / 后:在 beforeCreated 阶段,vue 实例的挂载元素 $el 和数据对象 data 都为 undefined,还未初始化。
载入前 / 后:在 beforeMount 阶段,vue 实例的 $el 和 data 都初始化了,但还是挂载之前为虚构的 dom 节点,data.message 还未替换。在 mounted 阶段,vue 实例挂载实现,data.message 胜利渲染。
更新前 / 后:当 data 变动时,会触发 beforeUpdateupdated办法。
销毁前 / 后:在执行 destroy 办法后,对 data 的扭转不会再触发周期函数,阐明此时 vue 实例曾经解除了事件监听以及和 dom 的绑定,然而 dom 构造仍然存在

5、vue 生命周期在实在场景下的业务利用

created:进行 ajax 申请异步数据的获取、初始化数据
mounted:挂载元素内 dom 节点的获取
nextTick:针对繁多事件更新数据后立刻操作 dom
updated:任何数据的更新,如果要做对立的业务逻辑解决
watch:监听具体数据变动,并做相应的解决

7、Vue 中双向数据绑定是如何实现的?

Vue 在组件和实例初始化的时候,会将 data 里的数据进行数据劫持 (object.definepropty 对数据做解决)。被解除过后的数据会有两个属性:一个叫 getter,一个叫setter
getter 是应用数据的时候触发,setter是在批改数据的时候触发,批改数据的时候触发 setter,同时也触发了底层的watcher(能够收到属性的变动告诉并执行相应的函数,从而更新视图。) 监听,告诉 dom 批改刷新。

8、父组件与子组件传值

父向子传值:属性传值,父组件通过给子组件标签上定义属性,子组件通过 props 办法接收数据;
子向父传值:事件传值,子组件通过 $emit(‘自定义事件名’,值),父组件通过子组件上的 @自定义事件名 =“函数”接管 ($emit 办法传递参数)

10、如何让 css 只在以后组件中起作用

将以后组件的 (style)批改为(styple scoped)

11、第一次加载页面会触发哪几个钩子

第一次加载会触发 beforeCreatecreatedbeforeMountmounted四个钩子

12、Vuex 是什么?

Vuex 是专门为 Vue 服务,用于治理页面的数据状态、提供对立数据操作的生态系统
vuex: 是 vue 提供的状态管理工具,简略解释就是 vue 各个组件间接的变量是不能间接共享的,组件间接的参数传递才多层的时候变得异样简单,所以就诞生了 vuex 的状态管理工具,保障了状态的对立和可追踪
①:这个状态自治理利用蕴含以下几个局部:
state,驱动利用的数据源;
view,以申明形式将 state 映射到视图;
actions,响应在 view 上的用户输出导致的状态变动。
②:应用 vuex 治理数据的益处:
可能在 vuex 中集中管理共享的数据,便于开发和前期进行保护
可能高效的实现组件之间的数据共享,进步开发效率
存储在 vuex 中的数据是响应式的,当数据放生扭转时,页面中的数据会同步更新
③:vuex 中的数据和 data 中的数据与什么区别?
vuex 中的数据是全局的,共享的,data 中的数据是公有的
vuex 中的数据是响应式的,只有 vuex 中的数据产生扭转,援用 vuex 中的数据的文件会同步更新
vuex 中的数据是单向的,想要批改 vuex 中的数据必须在 mutation 中批改

13、router 是什么?

1.routerthis.$router 是路由【导航对象】,用它 能够不便的 应用 JS 代码,实现路由的 后退、后退、跳转到新的 URL 地址
2.routes:指创立 vue-router 路由实例的配置项。用来配置多个 route 路由对象
3.routethis.$route 是路由【参数对象】,所有路由中的参数,params, query 都属于它

14、vue 单页面利用及优缺点

vue 外围是一个响应的数据绑定零碎,mvvm,数据驱动,组件化,轻量,简洁,高效,疾速,模块敌对。
毛病:不反对低版本浏览器,最低到 IE9,不利于 SEO 的优化,首页加载工夫较长,不能够应用浏览器的导航按钮须要自行实现后退后退。

15、vue 生命周期的作用是什么?

它的生命周期中有多个事件钩子,让咱们在管制整个 Vue 实例的过程时更容易造成好的逻辑。

16、vue.nextTick()的用途?

nextTick 能够使咱们在下次 DOM 更新循环完结之后执行提早回调,用于取得更新后的 DOM。

18、兄弟组件之间如何传值?

能够用过一个 vue 实例 Bus 作为媒介,要互相通信的兄弟组件之中,都引入 Bus,之后通过别离调用 Bus 事件触发 e m i t 和 监 听 emit 和监听 emit 和监听 on 来实现组件之间的通信和参数传递,相似 window 的全局自定义事件。相似与子传父,只不过是利用一个新的 vue 示例作为媒介,而不是以后 vue 示例(this)

19、jquery 和 vue 的管制 DOM 元素的次要区别是什么?

jquery 操作的是间接 dom 元素。vue 操作的是 dom 元素对象。
vue.js 劣势是(视图 - 模型)双向绑定,简化了 dom 的操作(不必重写大量的 html 标签),进步 dom 的复用率(以起码代码实现更多的性能),偏向于数据读写,尽管看上去应用比拟繁琐,然而利于前期的保护。
jquery 劣势是 jquery 语义化,容易了解,比较简单,可拓展的插件多。
总结: 如果 dom 操作频繁,不须要动画成果,就应用 vue.js。如果 dom 操作不频繁,但又须要简单的动画成果,就应用 jquery. vue.js 比拟适宜于后盾治理页面,jquery 比拟适宜于前台用户交互页面。

20、vue2 模版 template 的四种写法?

1. 写在结构器里的:
2. 写在 (template) 标签里
3. 写在(script type=“x-template”) 标签里

21、var let const 申明的变量的区别

let 不容许在雷同作用域内,反复申明同一个变量。let 申明的变量只在其所在代码块内无效
const 是定义常量的, 而且定义一次当前不能再进行更改,否者会报错;
应用 const 定义的常量,领有 let 一样的个性(无申明提前,有块状作用域,反复申明)

  • let: 申明的变量只在它所在的代码块无效; 须要先申明而后再应用,否则报错
  • var:* 申明的变量在全局范畴内都无效;
  • var 定义的变量能够批改,如果不初始化会输入 undefined,不会报错
  • const:* 申明一个只读的常量,一旦申明,常量的值就不容许扭转;
  • 一旦申明了变量,就必须初始化,不能留到当前赋值;
  • 只在申明所在的块级作用域内无效;

22、如何了解 JSON?

JSON 是一种轻量级的数据交换格局, 作用:通常用于服务端向页面传输数据。
JSON 是 一个 JS 对象,有 2 个 API
JSON.stringify() 办法用于将 JavaScript 值转换为 JSON 字符串。
JSON.parse() 办法用于将一个 JSON 字符串转换为对象。

23、函数申明和函数表达式的区别(作用域)

1. 以函数申明的办法定义的函数, 函数名是必须的, 而函数表达式的函数名是可选的.
2. 以函数申明的办法定义的函数, 函数能够在函数申明之前调用, 而函数表达式的函数只能在申明之后调用.
3. 以函数申明的办法定义的函数并不是真正的申明, 它们仅仅能够呈现在全局中, 或者嵌套在其余的函数中, 然而它们不能呈现在循环, 条件或者 try/catch/finally 中, 而函数表达式能够在任何中央申明.

24、对于动静路由

不能传递参数的是动态路由,能够传递参数,然而其对应的路由数量是不确定的,叫动静路由
在参数名后面加上:, 而后将参数写在路由的 path 内
这是无参数跳转

query 和 params 两者都能够传递参数,区别是什么?
1.query 传参配置的是 path,而 params 传参配置的是 name,在 params 中配置 path 有效
2.query 在路由配置不须要设置参数,而 params 必须设置
3.query 传递的参数会显示在地址栏中
4.params 传参刷新会有效,然而 query 会保留传递过去的值,刷新不变

25、vue 是什么?跟 JS 有什么区别?

vue 就是一个 js 库,并且无依赖别的 js 库,跟 jquery 差不多。vue 的外围库只关注视图层,非常容易与其它库或已有我的项目整合。Vue.js 是一个笨重、高性能、可组件化的 MVVM 库,同时领有非常容易上手的 API。
区别:在传统 web 开发中,咱们搭建我的项目都以 html 构造为根底,而后通过 jquery 或者 js 来增加各种特效性能,须要去选中每一个元素进行命令,这样太繁琐了
vue 的益处:1. 数据绑定:vue 会依据对应的元素,进行设置元素数据,通过输入框,以及 get 获取数据等多种形式进行数据的实时绑定,进行网页及利用的数据渲染。
2. 组件式开发:通过 vue 的模块封装,它能够将一个 web 开发中设计的各种模块进行拆分,变成独自的组件,而后通过数据绑定,调用对应模版组件,同时传入参数,即可实现对整个我的项目的开发。
一句话概括:用数据绑定的思维,vue 能够简略写单个页面,也能够写一个大的前端零碎,也能够做手机 app 的界面。

26、Vue-CLi 是啥?

它是一个 vue.js 的脚手架工具。说白了就是一个主动帮你生成好我的项目目录,配置好 Webpack,以及各种依赖包的工具

27、vue 是怎么渲染的?

1. 原有模板语法,挂载渲染:就是对应用 Vue 标签语法的 hmtl 进行渲染。
2. 应用 render 属性,createElement函数间接渲染:本来无 html,通过 JavaScript 的齐全编程的能力生成页面。
3. 应用 render 属性,配合组件的 template 属性,createElement函数渲染
4. 应用 render 属性,配合单文件组件,createElement 函数渲染

28、vue 罕用的 5 个事件修饰符
.stop: 阻止事件冒泡;
.prevent: 阻止默认事件;
.capture: 实现捕捉触发事件的机制 ;
.self: 实现只有点击以后元素时候,才会触发事件处理函数 ;
.once: 事件只触发一次;

26、vue-router 有哪几种导航钩子?

第一种:全局导航钩子
第二种:独自路由独享钩子
第三种:组件内的钩子

29、vue-router 路由模式有几种?

Hash: 应用 URL 的 hash 值来作为路由。反对所有浏览器。
History: 以来 HTML5 History API 和服务器配置。参考官网中 HTML5 History 模式
Abstract:反对所有 javascript 运行模式。如果发现没有浏览器的 API,路由会主动强制进入这个模式。

30、Vue 组件通信的六种办法

  • 1. 父组件向子组件传值:props/$emit
  • 2. 子组件向父组件传值(通过事件模式)$ emit/$on
  • 3.vuex
  • 4.$ attrs/$ listeners
    $ attrs:蕴含了父作用域中不被 prop 所辨认 (且获取) 的个性绑定 (class 和 style 除外)。当一个组件没有申明任何 prop 时,这里会蕴含所有父作用域的绑定 (class 和 style 除外),并且能够通过 v-bind="$ attrs" 传入外部组件。通常配合 interitAttrs 选项一起应用。
    $ listeners:蕴含了父作用域中的 (不含 .native 润饰器的) v-on 事件监听器。它能够通过 v-on="$listeners" 传入外部组件
  • 5.provide/inject
  • 6.$parent / $childrenref
    ref:如果在一般的 DOM 元素上应用,援用指向的就是 DOM 元素;如果用在子组件上,援用就指向组件实例
    $parent / $children:拜访父 / 子实例

31、veu 中的三要素

响应式:vue 如何监听到 data 每个属性变动?
vue 的响应式原理:Vue 在组件和实例初始化的时候,会将 data 里的数据进行数据劫持 (object.definepropty 对数据做解决)。被解除过后的数据会有两个属性:一个叫getter,一个叫setter
getter 是应用数据的时候触发,setter是在批改数据的时候触发,批改数据的时候触发 setter,同时也触发了底层的 watcher(能够收到属性的变动告诉并执行相应的函数,从而更新视图。)监听,告诉 dom 批改刷新。

模板引擎:vue 的模板如何被解析,指令如何解决?
. 实质就是个字符串。模板最终必须转换成 JS 代码。因为:
. 有逻辑,如(v-if v-for), 必须用 JS 能力实现
. 转换为 html 渲染页面,必须用 JS 能力实现
. 因而,模板最重要转化成 JS 函数(render 函数)

渲染:vue 的模板如何被渲染成 html?
模板解析成 render 函数 —-> 返回 JS 模仿的虚构 DOM 构造:模板是一段字符串,模板解析生成 render 函数,执行 render 函数返回为 vnode,vnode 表明了各个节点的层级关系、个性、款式、绑定的事件。
2、vnode—->html:通过 updateComponent 函数调用 vm._update()传入 vnode,利用基于 snabbdom 的 patch()办法革新的生成实在 DOM 节点并渲染页面。

32、v-if 跟 v -show 的区别

v-if 是通过管制 dom 节点的存在与否来管制元素的显隐;v-show 是通过设置 DOM 元素的 display 款式,block 为显示,none 为暗藏;
v-if 判断是否加载,能够加重服务器的压力,在须要时加载, 但有更高的切换开销;
v-show 调整 DOM 元素的 CSS 的 dispaly 属性,能够使客户端操作更加晦涩,但有更高的初始渲染开销。
如果须要十分频繁地切换,则应用 v-show 较好;如果在运行时条件很少扭转,则应用 v-if 较好。

33、在 ES6 中,Promise 对象只有三种状态

异步操作“未实现”(pending)
异步操作“已实现”(resolved,又称 fulfilled)
异步操作“失败”(rejected)

34、箭头函数和一般函数的区别

, 不须要通过 function 关键字创立函数, 并且能够省略 return 关键字. 但函数体内的 this 对象指的是定义时所在的对象, 而不是应用时所在的对象;
①不绑定 this, 箭头函数的 this 永远指向其父作用域,任何办法都扭转不了,包含 call,apply,bind。
一般函数的 this 指向调用它的那个对象。
②箭头函数不能作为构造函数,不能应用 new
③箭头函数不绑定arguments
④箭头函数通过callapply调用,不会扭转 this 指向,只会传入参数
⑤箭头函数没有原型属性

35、ES6 有哪些新个性

1. 模板字符串: 模板字符串是为了解决应用 + 号拼接字符串的不便当而呈现的

2. 解析构造

  1. 函数默认参数


4.开展运算符

正文完
 0