目录

const
let var 之间的区别
4、es6中的const解释解释
9.em和rem区别
3.js部分,const,let和 var 的区别。
4.js部分,数组遍历map和forEach的区别。

1
2
3
能用forEach()做到的,map()同样可以。反过来也是如此。
map()会分配内存空间存储新数组并返回,forEach()不会返回数据。
forEach()允许callback更改原始数组的元素。map()返回新的数组。

5.css部分,em和rem怎么做自适应。
8.函数提升和变量提升优先级

1
2
3
4
5
6
7
8
9
函数提升 优于变量
解析器在向执行环境中加载数据时会率先读取函数声明,并使其在执行任何代码之前可用(可访问),即函数声明提升、JavaScript上卷中第40页提到函数声明是优于变量提升的。可见代码
console.log(getName)
var getName = 1;
function getName() {
console.log(2)
}
// 输出为函数getName
注意:不要学了一点就忘记别的了啊,如果两个函数名一样,后面的会覆盖前面的(认为是在函数解析的时候覆盖,即提升的时候就覆盖了)

JS深拷贝的用处,哪里会用到?

浅拷贝
深拷贝

7、闭包以及带来问题
闭包知道吗?它可能出现的问题呢
10、css有哪些布局(一开始理解错了说了一大堆,后来面试官带回来了,是关于position、float)
11、flex实现水平垂直居中
12、align-items:center是不是只针对垂直
css布局都用过啥,flex布局,想让我说flex布局的原理的。。。想想还是算了,感觉面试官对原理情有独钟
CSS布局技巧
跨域的几种方式,有答jsonp,然后又问了 jsonp 的原理是啥?
6.跨域问题
6.常用的跨域方式。
项目有没跨域问题
5.作用域链
JavaScript深入之作用域链
深入理解JavaScript作用域和作用域链

1
2
3
4
5
6
7
作用域链,是由当前环境与上层环境的一系列变量对象组成,
它保证了当前执行环境对符合访问权限的变量和函数的有序访问。

当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,
就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到
全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对
象构成的链表就叫做作用域链。

第一个问题是讲一下原型链,这个我先推了一下,讲了个小插曲,promise的状态和蘑菇街面试的状态吻合,只有pending、resolved、rejected三种状态,算是个破冰吧,今天看promise想到的。
然后继续回答原型链。

2、Promise了解多少

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Promise 是异步编程的一种解决方案:
从语法上讲,promise是一个对象,从它可以获取异步操作的消息;
从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。
promise有三种状态:pending(等待态),fulfiled(成功态),rejected(失败态);
状态一旦改变,就不会再变。创造promise实例后,它会立即执行。

pending,异步任务正在进行。
resolved (也可以叫fulfilled),异步任务执行成功。
rejected,异步任务执行失败。

回调地狱,代码难以维护, 常常第一个的函数的输出是第二个函数的输入这种现象
promise可以支持多个并发的请求,获取并发请求中的数据
这个promise可以解决异步的问题,本身不能说promise是异步的

Promise.resolve(value)
类方法,该方法返回一个以 value 值解析后的 Promise 对象
1、如果这个值是个 thenable(即带有 then 方法),返回的 Promise
对象会“跟随”这个 thenable 的对象,采用它的最终状态
(指 resolved/rejected/pending/settled)
2、如果传入的 value 本身就是 Promise 对象,
则该对象作为 Promise.resolve 方法的返回值返回。
3、其他情况以该值为成功状态返回一个 Promise 对象。

Promise.all的用法:谁跑的慢,以谁为准执行回调。
all接收一个数组参数,里面的值最终都算返回Promise对象
all方法可以说是Promise中很常用的方法了,它的作用就是将一个数组的Promise对象放在其中,当全部resolve的时候就会执行then方法,当有一个reject的时候就会执行catch,并且他们的结果也是按着数组中的顺序来排放的,那么我们来实现一下。
Promise.race的用法:谁跑的快,以谁为准执行回调
它的作用是将一个Promise数组放入race中,哪个先执行完,race就直接执行完,并从then中取值。
Promise.prototype.catch
实例方法,捕获异常,函数形式:fn(err){}, err 是 catch 注册 之前的回调抛出的异常信息。
Promise.prototype.then
实例方法,为 Promise 注册回调函数,函数形式:fn(vlaue){},value 是上一个任务的返回结果,then 中的函数一定要 return 一个结果或者一个新的 Promise 对象,才可以让之后的then 回调接收。
Promise.reject
类方法,且与 resolve 唯一的不同是,返回的 promise 对象的状态为 rejected。

Promise的立即执行性
Promise 三种状态
Promise 状态的不可逆性
then方法链式调用

async/await

promise有了解吗
Promise.all promise.race 有了解吗(当时一直听成Promise.out ,我就纳闷了说哪儿来的这个方法。。)

3.React 生命周期,如果要合并 props 和 state 在哪进行
4.React 组件想用函数调用的方式使用,怎么设计
react如果更新了父组件,子组件没有更新,会都重新渲染吗?
react的原理,他的内部是怎么构建DOM的,比如p标签的子元素放在哪个属性里。。。没看过源码着实不知道
react相关的redux的原理?
7.你印象比较深的项目或者代码
我觉得是像 antd 里面的 message 模块,使用 ReactDOM.render
挂载组件到指定节点,然后通过更新 props 使用
html css js擅长哪部分?
我回答擅长js,但他居然没有继续问下去了

3、es5和es6了解多少
es5,es6哪个用的多点?
3、es5和es6了解多少

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
变量声明:let const
字符串模板
解构赋值 对象对对象 数组对数组
扩展运算符
箭头函数
不需要 function 关键字来创建函数
省略 return 关键字
继承当前上下文的 this 关键字
import导入模块、export导出模块
Promise
数组常用方法:
Array.isArray
map
filter
forEach
every
reduce
splice
indexOf
slice
concat
reverse()
join()

Array.from()
Array.of()
copyWitch
find
findIndex
keys()
values()
class 静态、私有、共有

生成器( generator)是能返回一个迭代器的函数。
生成器函数也是一种函数,最直观的表现就是比普通的function多了个星号*,
在其函数体内可以使用yield关键字,有意思的是函数会在每个yield后暂停。

可以暂停并重新开始执行的函数

generators 可以扮演三种角色
迭代器(数据生产者)
观察者(数据消费者)
协作程序(数据生产者和消费者)

es6 Generators详解

2.CSS sprite(雪碧图或者精灵图)
CSS Sprite “精灵图”
CSS Sprite雪碧图

1
2
3
4
5
6
7
8
9
10
用CSS的"background-image""background-repeat""background-position"
的组合进行背景定位,background-position可以用数字精确的定位出背景图片的位置。
CSS Sprites 的优点:
减少图片字节
减少网页HTTP请求,提高网页性能
减少命名难的问题
缺点
图片合并的时候要把图片合理的合并成一张图片,防止板块内出现不必要的背景
在高分辨率下的自适应如果图片宽度不够,容易造成背景断裂
维护的时候比较困难,如果背景图有少许改动,需要改动合并图片。

事件节流?刚看过,没印象了,哭。
情景题,往下滚动,加载更多,有什么优化方案,图片懒加载?提示了可以滚轮事件是个比较频繁的操作,但是还是没想出来。防抖

vue和react差别,
8、问了vue有没有做过项目,然后就没有了
1.vue生命周期,没有问详细的,就是顺着生命周期说了一遍。英文捉急。
2.vue源码部分,几个重要的部分,compile,数据劫持,依赖收集,虚拟DOM。
问了一个异步加载组件,不用标签引入的方法。
让你实现vue你怎么实现……
说说vue的双向绑定(顺带把响应式说了)
说说Vue的diff过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
如果不了解virtual dom,要理解diff的过程是比较困难的。虚拟dom对应的是真实dom, 使用document.CreateElement 和 document.CreateTextNode创建的就是真实节点。

我们先根据真实DOM生成一颗virtual DOM,当virtual DOM某个节点的数据改变后会生成一个新的Vnode,然后Vnode和oldVnode作对比,发现有不一样的地方就直接修改在真实的DOM上,然后使oldVnode的值为Vnode。
diff的过程就是调用名为patch的函数,比较新旧节点,一边比较一边给真实的DOM打补丁。

在采取diff算法比较新旧节点的时候,比较只会在同层级进行, 不会跨层级比较。
diff流程图
当数据发生改变时,set方法会让调用Dep.notify通知所有订阅者Watcher,
订阅者就会调用patch给真实的DOM打补丁,更新相应的视图。

patch函数接收两个参数oldVnode和Vnode分别代表新的节点和之前的旧节点
判断两节点是否值得比较,值得比较则执行patchVnode
不值得比较则用Vnode替换oldVnode
如果两个节点都是一样的,那么就深入检查他们的子节点。如果两个节点不一样那就说明Vnode完全被改变了,就可以直接替换oldVnode。

当我们确定两个节点值得比较之后我们会对两个节点指定patchVnode方法
这个函数做了以下事情:
找到对应的真实dom,称为el
判断Vnode和oldVnode是否指向同一个对象,如果是,那么直接return
如果他们都有文本节点并且不相等,那么将el的文本节点设置为Vnode的文本节点。
如果oldVnode有子节点而Vnode没有,则删除el的子节点
如果oldVnode没有子节点而Vnode有,则将Vnode的子节点真实化之后添加到el
如果两者都有子节点,则执行updateChildren函数比较子节点,这一步很重要
updateChildren
先说一下这个函数做了什么
将Vnode的子节点Vch和oldVnode的子节点oldCh提取出来
oldCh和vCh各有两个头尾的变量StartIdx和EndIdx,它们的2个变量相互比较,一共有4种比较方式。如果4种比较都没匹配,如果设置了key,就会用key进行比较,在比较的过程中,变量会往中间靠,一旦StartIdx>EndIdx表明oldCh和vCh至少有一个已经遍历完了,就会结束比较。

v-model,v-bind 和v-click

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
v-bind  动态地绑定一个或多个特性、或一个组件 prop 到表达式。
1:v-bind动态绑定指令,默认情况下标签自带属性的值是固定的,
在为了能够动态的给这些属性添加值,可以使用v-bind:你要动态变化的值="表达式"

v-model 在表单控件或者组件上创建双向绑定。
v-on 指令用于监听DOM事件 形式如:v-on:click 缩写为 @click;


[VUE中的v-if与v-show](http://www.cnblogs.com/wmhuang/p/5420344.html)
手段:v-if是动态的向DOM树内添加或者删除DOM元素;
v-show是通过设置DOM元素的display样式属性控制显隐;
编译过程
:v-if切换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组件;
v-show只是简单的基于css切换;
编译条件:
v-if是惰性的,如果初始条件为假,则什么也不做;
只有在条件第一次变为真时才开始局部编译(编译被缓存?编译被缓存后,然后再切换的时候进行局部卸载)
v-if是动态的向DOM树内添加或者删除DOM元素;
v-show是通过设置DOM元素的display样式属性控制显隐;
v-show是在任何条件下(首次条件是否为真)都被编译,然后被缓存,而且DOM元素保留;
性能消耗:
v-if有更高的切换消耗;v-show有更高的初始渲染消耗;
使用场景:
v-if适合运营条件不大可能改变;v-show适合频繁切换。


v-if 是“真正的”条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。
v-if 也是惰性的:
如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。
相比之下,v-show 就简单得多——不管初始条件是什么,
元素总是会被渲染,并且只是简单地基于 CSS 进行切换。
一般来说, v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;
如果在运行时条件不太可能改变,则使用 v-if 较好。

function a(){},a的proto 指向哪,Function呢?Object呢?
js异步都有哪些?答了onclick之类的、setTimeout/setInterval/requestAnimation、Generator、promise、async/await,讲了promise和async/await的优缺点。

1.就我这次面试表现而言,有哪方面需要提升或者欠缺的
3.团队技术栈?
然后项目……照着你简历上的问,
技术选型,遇到的困难,解决思路,

面试中印象最深的问题
场面试官自己先介绍了三分钟..然后让我也介绍一下基本情况,项目经历难点之类的。
然后开始面试,很少技术问题
项目难点,如何解决的
有没有想过进入一个团队实习之后会有哪些压力大的事情?
有没有了解前端的新技术
有没有参加线下前端活动
会去看哪些博客或者社区
CSS动画和JS动画。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 (1)浏览器可以对动画进行优化。
1、 浏览器使用与 requestAnimationFrame 类似的机制,requestAnimationFrame比起setTimeout,setInterval设置动画的优势主要是:1)requestAnimationFrame 会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔紧紧跟随浏览器的刷新频率,一般来说,这个频率为每秒60帧。2)在隐藏或不可见的元素中requestAnimationFrame不会进行重绘或回流,这当然就意味着更少的的cpu,gpu和内存使用量。
2、强制使用硬件加速 (通过 GPU 来提高动画性能)
(2)代码相对简单,性能调优方向固定
(3)对于帧速表现不好的低版本浏览器,CSS3可以做到自然降级,而JS则需要撰写额外代码
缺点:
  1、 运行过程控制较弱,无法附加事件绑定回调函数。CSS动画只能暂停,不能在动画中寻找一个特定的时间点,不能在半路反转动画,不能变换时间尺度,不能在特定的位置添加回调函数或是绑定回放事件,无进度报告
  2、 代码冗长。想用 CSS 实现稍微复杂一点动画,最后CSS代码都会变得非常笨重。

JavaScript
(1)JavaScript动画控制能力很强, 可以在动画播放过程中对动画进行控制:开始、暂停、回放、终止、取消都是可以做到的。
(2)动画效果比css3动画丰富,有些动画效果,比如曲线运动,冲击闪烁,视差滚动效果,只有JavaScript动画才能完成
(3)CSS3有兼容性问题,而JS大多时候没有兼容性问题
缺点:
   (1)JavaScript在浏览器的主线程中运行,而主线程中还有其它需要运行的JavaScript脚本、样式计算、布局、绘制任务等,对其干扰导致线程可能出现阻塞,从而造成丢帧的情况。
(2)代码的复杂度高于CSS动画

后来说问点有难度的问题的吧。直接怼了好多原理。。。卡了好几下
webpack的打包目录为啥是这样的,知道原理吗?
大概目前只能想到这些了,最后问了面试官几个问题,面试官说有结果,顿了一下,通过或者不通过hr都会通知你的emmm,感觉有点凉,主要是原理着实卡了好几个地方,不过自我感觉面试官人还是很nice的,没有太难为我,看面相是个忠厚老实的小哥哥emmm,求offer啊啊啊啊啊啊啊啊啊啊啊啊
7.项目印象深刻的部分和难点。
二面我就不写面经了,就是问了些项目上的问题,解决问题的思路,技术栈,基本情况
自我介绍
项目介绍
你说的你的项目里有个首屏加载特别慢的问题对吧?能说说怎么优化的吗?
一个骰子,5个面,你怎么实现它(一个面你怎么布局)
说说事件循环
假如有个项目加载最开始特别快,后面越来越慢你知道是为什么吗?以及如何第一时间定位(内存泄漏)
1、自我介绍 + 项目介绍(难点)
5、事件委托
6、任务队列
9、一个场景题(关于使用调试工具的)
13、bootstrap中的栅格式
一面我上来就说的微信小程序,然后后边面试官几乎都没问别的(倒是考我几个问题啊,js css啥都不问,得嘞,白准备了),然后说到Vue,说了个v-model感觉不是很满意,自己也觉得虽然自己懂原理,但是没讲清楚。。。整个流程10来分钟,估计gg了

重绘&&回流
vue differ
vue 生命周期
跨域
自我介绍

JavaScript 怎么实现 OOP
原型继承与类继承的区别
闭包的应用场景
关系完整性约束

Cookie & Session 的区别
Session 的实现原理
HTTP 请求方法中哪些是幂等性的
跨域处理方案
JSONP 的缺点以及安全隐患
为什么要做单元测试
黑盒测试与白盒测试的区别
怎样实现测试覆盖率
Async & Await 的使用

块级元素、行内元素、inline-block 的区别
水平居中的方法
String、Array 常用的方法
输入一个 URL 到呈现页面的过程
Vue.js 组件的生命周期
Git 怎么合并提交记录
Linux 常用的命令
HTTP2 新特性

常见的 Web 攻击手段以及防范措施
对 Ajax 的理解
对闭包的理解
对事件机制的理解
对 HTTP 的理解
GET & POST 的区别
HTTP2 和 HTTP1 有什么不同
对 JavaScript 各大框架的理解
对 jQuery 的理解
页面性能优化
计算机网络分层
输入 www.qq.com 到呈现页面的过程
事件机制(W3C 标准)
事件代理
XSS、CSRF 的防范
token 的实现原理
熟练使用JS实现Json、XML格式的数据发送与数据解析;
3、熟悉各种web标准,了解各主流浏览器特性,使页面兼容主浏览器;

自我介绍
事件流
vue nextTick原理
vue react区别
web优化
移动端的优化有特别了解过吗
css flex了解过吗
如何前端监控错误,
koa有学过吗
事件循环说一说
web新技术了解过哪些,最近有去学习哪些东西
PWA你能详细说说吗
service worker
h5 worker
非受控组件 与受控组件
const let var区别
三道题
有自己写过webpack插件吗
webpack loader 和plugin区别
实现promise
大数相加
纯js写一个动画,5s由快到慢,速度自定义
(这里特别感谢以前发过面筋的同学,前两道题因为碰到过,自己下去做了一下 10多分钟给做完了 然后又让我补了一道= =)
自我介绍,说一下怎么学习前端的,以及做的项目的亮点
web优化
缓存(协商,强制说一说)
CDN

1
2
3
4
5
6
7
8
9
10
11
CDN的全称是Content Delivery Network,即内容分发网络。
其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,
使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联
网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、
负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近
的服务节点上。

其目的是使用户可就近取得所需内容,解决Internet网络拥挤的状况,
提高用户访问网站的响应速度。
降低核心系统负载 加速用户访问
CDN做了两件事,一是让用户访问最近的节点,二是从缓存或者源站获取资源

DNS如何查询域名的
node中间件原理
跨域
作用域
一个页面白屏,分析原因
数据结构链表
怎么判断链表有环(当时还问我是不是刷了很多题,我们都笑了笑)
cookie了解吗
cookie的属性,怎么存储
web安全,xss csrf
css响应式布局
token生成过程
前端新技术
PWA讲一讲
serviceworker
h5 worker
智商题
3.45分夹角
两个火车相对而行,知道彼此的速度,中间有一个小鸟来回飞 知道小鸟的速度 求相撞的时候的 小鸟飞行的距离
10瓶药,每瓶药有10颗药片,每片10克,其中一瓶药里的所有药片是坏的 每片重量为11克,现在给你一个秤,如何一次性称出来

三面
自我介绍
web优化
css动画
csrf如何防御
如何生成token
Vue的diff能详细说一说吗
Vue子组件你的子组件方法是放在哪里的
Vue自定义指令
微信小程序接触过吗
微信小程序原理
TCP三次握手第三次失败了 客户端和服务端是如何处理的
301,302状态码区别,以及什么时候会返回这些状态。
node如何升级到webSoket
如何添加header头
DNS迭代和递归区别
前端怎么设置cookie过期
有看过源码吗
看过哪些书
能来实习的时间
智商题
一个班级60%喜欢足球,70%喜欢篮球,80%喜欢排球 求同时喜欢足球和篮球的
算法 最大的回文字符
北森
一面
面试官非常nice,善于引导
自我介绍
你的项目
能说下vue如何收集依赖双向绑定的吗
能说下vue如何更新节点的吗
node如何打印时间与错误
webpack构建流程
webpack如何找到依赖关系的
webpack如何配置
vue和react区别
react生命周期
函数式组件,如何给状态(hook)
原型链,原型知道多少
es6了解哪些
promise.resolve()
http状态码
post请求之前先发送Option条件
get,post,put,delete区别(冥等)
二面
面试官是个女架构师,感觉非常好,还因为迟到了几分钟说道歉之类的
vue,react,你更倾向于哪一个,为什么
es6模块cmd amd 区别
跨域
深拷贝,浅拷贝
post发送Option的条件
输入URL到浏览器会发生什么
TCP为什么三次握手
TCP为什么四次挥手
HTTP为什么基于TCP协议
vue diff过程
vue如果同一个数据,很短的时间内连续更新 会怎么样。
算法题
[0,0,1,1,1,2,3,4,5],不借用辅助空间找到不重复项[2,3,4,5]

三面
面试官是技术总监,问的问题都是基于场景来说的,面试体验还可以
有这样一个数组,你如何扁平化
如果用字符串形式会出现什么问题
跨域你如何处理的
能说说同源策略吗,那如果是直接请求ip会有同源策略吗,如果一个域名对应多个ip的情况呢。
你以前做的项目,如果让你去完善你能说一说完善的细节吗,说三点 (我提到模块化,规范化,可扩展性)
能具体一点说说吗,说一点就可以
你觉得你相比其他实习生的优点和缺点在哪里

前天过了一面。问的有基础的知识和CSS、JS应用的知识,还问了OSI七层网络。其实自我感觉回答的不太好,面试官也说框架知识和项目经验不太足够,没想到过了。
了项目难点,然后还考了osi网络层级,怎么用css实现表格奇偶行不同颜色,怎么根据表格行的颜色拿到行数,还问了vue的生命周期钩子函数,vue-cli不过我没答上来

007bcc9b9629c19abe2d66d4ceb0c0006f9fd8e8