# Just For interView
# 1. 什么是闭包
引用外部函数数据的内部函数,优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在js中,函数即闭包,只有函数才会产生作用域的概念
闭包有三个特性:
函数嵌套函数、函数内部可以引用外部的参数和变量、参数和变量不会被垃圾回收机制回收
# 2. 什么是原型链
# 3. ES6新语法
let/const/var
箭头函数,解构赋值,展开运算符
set/map
import/export
for of / forEach / map
# 4. 数组有哪些方法
Push添加至尾部 pop移除最后一个 reverse颠倒 shift移除第一个 slice剪切返回部分
Sort排序 splice删除或插入 unshift头部插入tostring转字符串 join转字符串 index of 查找
Filter 过滤满足条件的 concat拼接 map计算新数组 for each每一个元素调用指定函数
# 5. Get和post的区别
get传参方式是通过地址栏URL传递,是可以直接看到get传递的参数,post传参方式参数URL不可见,get把请求的数据在URL后通过?连接,通过&进行参数分割。psot将参数存放在HTTP的包体内
.get传递数据是通过URL进行传递,对传递的数据长度是受到URL大小的限制,URL最大长度是2048个字符。post没有长度限制
.get后退不会有影响,post后退会重新进行提交
.get请求可以被缓存,post不可以被缓存
.get请求只URL编码,post支持多种编码方式
.get请求的记录会留在历史记录中,post请求不会留在历史记录
.get只支持ASCII字符,post没有字符类型限制
# 6. ES6的继承和ES5的继承有什么不同
ES5的继承时通过 prototype 或构造函数机制来实现。
ES5的继承实质上是先创建子类的实例对象,然后再将父类的方法添加到 this 上(Parent.apply(this))。
ES6 的继承机制完全不同,实质上是先创建父类的实例对象 this(所以必须先调用父类的 super()方法),然后再用子类的构造函数修改this。
具体的:ES6 通过 class 关键字定义类,里面有构造方法,类之间通过 extends 关键字实现继承。子类必须在 constructor 方法中调用 super 方法,否则新建实例报错。因为子类没有自己的 this 对象,而是继承了父类的 this 对象,然后对其进行加工。如果不调用 super 方法,子类得不到 this 对象。
注:super 关键字指代父类的实例,即父类的 this 对象。在子类构造函数中,调用 super 后,才可使用 this 关键字,否则报错。
# 7. 深拷贝,浅拷贝
# 8. Event Loop(事件循环机制)
Js是单线程为了模仿多线程进行并发执行,js引擎划分除了两种内存空间,一种是可执行栈,用来存放同步任务(注意是栈,先进后出);另一种是任务队列,用来存放异步任务(注意时队列,先进先出)
# 9. 什么是BFC
IFC 行内格式化上下文
BFC (块级格式化上下文),是一个独立的渲染区域,让处于 BFC 内部的元素与外部的元素相互隔离,使内外元素的定位不会相互影响。
# 10. 浏览器渲染html页面的一般过程
1.浏览器解析html源码,然后创建一个 DOM树。并行请求 css/image/js在DOM树中,每一个HTML标签都有一个对应的节点,并且每一个文本也都会有一个对应的文本节点。DOM树的根节点就是 documentElement,对应的是html标签。
2.浏览器解析CSS代码,计算出最终的样式数据。构建CSSOM树。对CSS代码中非法的语法它会直接忽略掉。解析CSS的时候会按照如下顺序来定义优先级:浏览器默认设置 < 用户设置 < 外链样式 < 内联样式 < html中的style。
3.DOM Tree + CSSOM --> 渲染树(rendering tree)。渲染树和DOM树有点像,但是是有区别的。
DOM树完全和html标签一一对应,但是渲染树会忽略掉不需要渲染的元素,比如head、display:none的元素等。而且一大段文本中的每一个行在渲染树中都是独立的一个节点。渲染树中的每一个节点都存储有对应的css属性。
4.一旦渲染树创建好了,浏览器就可以根据渲染树直接把页面绘制到屏幕上。
以上四个步骤并不是一次性顺序完成的。如果DOM或者CSSOM被修改,以上过程会被重复执行。实际上,CSS和JavaScript往往会多次修改DOM或者CSSOM。
# 11. 清除浮动的多种方式
::after /
/ clear: both
创建父级 BFC(overflow:hidden)
父级设置高度
触发条件:根元素position: absolute/fixed display: inline-block / table
float 元素ovevflow !== visible
规则:
属于同一个 BFC 的两个相邻 Box 垂直排列属于同一个 BFC 的两个相邻 Box 的 margin 会发生重叠BFC 的区域不会与 float 的元素区域重叠计算 BFC 的高度时,浮动子元素也参与计算文字层不会被浮动层覆盖,环绕于周围
# 12. 继承的几种方式及优缺点
借用构造函数继承,使用call或apply方法,将父对象的构造函数绑定在子对象上
原型继承,将子对象的prototype指向父对象的一个实例
组合继承
原型链继承的缺点
字面量重写原型会中断关系,使用引用类型的原型,并且子类型还无法给超类型传递参数。
借用构造函数(类式继承)
借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起。
组合式继承
组合式继承是比较常用的一种继承方法,其背后的思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又保证每个实例都有它自己的属性
# 13. GC垃圾回收机制
# 14. 回流重绘
回流(重排 reflow):对DOM树进行渲染,只要修改DOM或修改元素的形状大小,就会触发reflow,reflow的时候,浏览器会使已渲染好受到影响的部分失效,并重新构造这部分,完成reflow后,浏览器会重新绘制受影响的部分到屏幕中.
重绘(repaint):当我们对DOM的修改导致的样式变化,但未影响几何属性时,浏览器不需要重新计算元素的几何属性,直接可以为该元素绘制新的样式,跳过了回流环节,这个过程就叫重绘.
****回流必定会发生重绘,重绘不一定发生回流********,****能用重绘就不要用回流了
# 15. 跨域
域名端口号协议有一个不一样即为跨域,
解决方法有:Jsonp ,webpack/ nginx反向代理, websocket ,cors
# 16. 什么是mvvm什么是mvc
MVC是模型-视图-控制器,MVC是单向通信,数据和视图通过controller承上启下
MVVM是Model-View-ViewModel模型-视图-视图模型。m是后端传递的数据,v是所看到的页面,vm视图模型有两个方向,一是将【模型】转化成【视图】,即将后端传递的数据转化成所看到的页面,实现的方式是:数据绑定。二是将【视图】转化成【模型】,即将所看到的页面转化成后端的数据。实现的方式是:DOM 事件监听。这两个方向都实现的,我们称之为数据的双向绑定。
总结:在MVVM的框架下视图和模型是不能直接通信的。它们通过ViewModel来通信,ViewModel作为observer观察者,当数据发生变化,能够监听到数据的这种变化,然后通知到对应的视图做自动更新,而当用户操作视图,ViewModel也能监听到视图的变化,然后通知数据做改动,这实际上就实现了数据的双向绑定。