参考博客>>

Vue

1、React / Vue.js 之类的框架为什么须要给组件增加 key 属性,其作用是什么?
[高频]
key相当于每个节点的id,在render函数执行时,会生成虚构节点,在数据变动的时候,virtual dom将新的虚构节点的key去比照旧的虚构节点数组的key,从而精确找到须要更新的旧节点,将虚构节点映射到视图上。没有key的话,会采纳遍历的办法找到对应的旧节点,一种是利用key的唯一性生成map对象(map映射),一种是遍历查找,相比而言,map映射速度更快。(在大量频繁的数据更新下,virtual dom可能对视图进行正当高效的更新)

2、Vue数据响应式
[高频]
Vue初始化过程中,data通过observer转换成getter/setter的模式,在render函数执行时,会去读取所需对象的值,会触发Object.defineProperty.get办法,实例化Dep将watcher的订阅操作增加到subs进行依赖收集,数据变动时,会触发Object.defineProperty.set办法,外面调用dep.notify(),而后循环调用所有的watcher.update办法,通过watcher执行render函数,从而把数据插入到root节点

3、Vue watch和computed的区别
[高频]
computed由get和set组成,默认只有get,监听的是依赖值,变动的时候从新计算并动静返回内容,相干依赖没有扭转的状况下,拜访的都是缓存的计算结果,只能同步执行
watch监听的是属性值,当属性值发生变化去触发回调,实现一段简单的业务逻辑,能够执行异步操作。也能够监听computed属性。监听简单类型-deep:true。

4、Vue组件通信形式
[高频]
父子 props/$emit:父组件A通过props向子组件B传递数据,子组件$emit向父组件发送音讯,父组件v-on接管
父子 $parent/$children与ref :这两种都是间接失去组件实例,应用后能够间接调用组件的办法或拜访数据

多级 vuex (实用于中大型单页利用):
对vue多个组件的共享状态集中管理,实现了一个单向数据流,领有一个state容器存放数据,通过commit触发mutation来更改state,mutation只能进行同步操作,且办法名是惟一的,所有的异步操作或者批量同步操作都要走action,反对多个同名办法,通过dispatch来触发,而后通过commit触发mutation,间接更新state。getters就相当于对数据的一个过滤和加工,像计算属性一样,getter 的返回值会依据它的依赖被缓存起来,且只有当它的依赖值产生了扭转才会被从新计算。
vuex存储的数据是响应式的,然而并不会保留,在刷新后会回到初始状态,能够在数据发生变化的时候存储一份到localstorage,在页面刷新后,如果locastorage里有寄存的数据,就能够取出来替换store里的state

多级 $emit/$on:通过一个空的Vue实例作为地方事件总线,$emie触发事件,$on监听事件
多级 $attrs/$listeners(实用于仅仅传递数据,不做两头解决) :蕴含父作用域中绑定的非props属性,通过v- bind="$attrs"传入外部组件/ 蕴含父组件中不含.native润饰的非原生事件,通过v-on="$listeners"传入外部组件
多级 provide/inject(实用于子组件获取下级组件状态) :跨级组件建设了一种被动提供和依赖注入的关系,通过provide提供变量,通过inject注入变量

5、 vuex和localStorage的区别
[中高频]

  • 1.本质区别

vuex存的是状态,存储在内存;localStorage是浏览器提供的接口,让你存的是接口,以文件的模式存储到本地
2.利用场景
vuex用于组件之间的传值,localStorage则次要用于页面之间的传值
3.永久性
当刷新页面时,vuex存储的值会失落,localStorage不会
总结
localStorage能够代替vuex,对于不变的数据的确能够,然而当两个组件独特用以数据源,如果其中一个组件中的数据源扭转,心愿另一个组件响应变动,这时候就要抉择用vuex。vuex是vue的状态管理机制,是不便组件之间通信的。一个组件的数据变动是会映射到应用这个数据的其余组件。而localStorage是本地存储,是将数据存储到浏览器的办法,个别在跨页面时应用。

6、Vue路由传参
[低低频]

  • 用name传递参数:$route.name
  • 通过<router-link> 标签中的to传参:$route.params
  • 利用url传递参数:$route.params
  • 通过path来匹配路由,而后通过query来传递参数:$route.query

7、Vue3.0
[低频]

  • Proxy,它容许框架拦挡针对对象(属性)的操作;
  • 切换到TypeScript将容许咱们主动生成申明文件,从而加重保护累赘;
  • 将大多数全局API和外部帮忙程序挪动到Javascript的module.exports属性上,只有在模板中理论应用某个个性时,该代码才导入该个性的帮忙程序;
  • Composition API,容许用户像编写函数一样自在地表白、组合和重用有状态的组件逻辑,

8、keep-alive
[没问]

  • 使组件保留状态,防止被从新渲染。
  • 当组件被激活时,触发钩子函数 activated,当组件被移除时,触发钩子函数 deactivated。

9、组件中 data 为什么是一个函数
[低频]
-组件是用来复用的,data是函数的话,能够使每个组件保护返回对象的独立拷贝,组件之间的data不会相互影响

10、scoped原理
[低频]
给HTML的DOM节点加一个不反复属性data-v-469af010标记唯一性

11、vue兼容ie
[低频]

  • 应用babel-polyfill插件,将es6转换为es5。
  • vue不反对ie8及以下,换框架,或者提醒用户降级浏览器。微软在2016年已进行对ie8/9/10的技术支持,安全性得不到保障。

12、跨域
[中频]

  • nginx代理

JS

1、运行机制
[中频]
js引擎在解释和执行js代码时的线程只有一个主线程,所有的同步工作在主线程中执行过程中,会造成执行栈。settimeout这类的办法浏览器默认为耗时程序,会将其放入工作队列中,一旦执行栈中所有同步工作执行完结,零碎就会读取工作队列,如果有待处理事件就取出相干事件和回调函数放入执行栈中执行,主线程会反复从工作队列中读取工作、执行工作,这种机制叫事件循环。

2、闭包
[低频]
简略来说,就是一个函数外部的函数,能够拜访内部函数的局部变量
作用:

  • 能够读取函数外部的变量,
  • 能够使变量的值长期保留在内存中
  • 能够用来实现JS模块
  • 闭包应用完了后,要立刻开释资源,将援用变量指向null。

3、原型链
[低频]
每个函数数据类型都会自带一个prototype属性,这个属性指向了函数的原型对象,原型对象就像一个公共区域,同一个类的所有实例都能够拜访到;
每个对象数据类型会自带一个_proto_属性,这个属性指向实例的构造函数的原型;
比方当拜访一个实例对象的属性或者办法时,对象本身找不到的时候,会通过对象的_proto_,也就是对象的构造函数的prototype去找,还找不到就去原型的原型上找,始终到Object为止。Object是js所有对象数据类型的基类,它的原型上没有_proto_属性;

4、判断数据类型
[低频]

  • typeof A- 不能判断null、Array等
  • -A instanceof B-A是否为B的实例,不能判断null、undefined
  • A.constructor-和instanceof相似,能够解决根本数据类型,函数的constructor不稳固,会笼罩之前的constructor
  • Object.prototype.toString.call-最精确罕用

5、模块化
[没问]

  • CommonJs-输出的是值的拷贝,在运行时加载
  • ES6 模块-输出的是值的援用,在编译时输入接口
  • 第一个差别-CommonJs一旦输入一个值,模块外部的变动不会影响到这个值,ES6 模块是动静援用,模块里的变量绑定了其所在模块,不会缓存值
  • 第二个差别-CommonJs加载的是一个对象,在脚本运行完才会生成,ES6 模块的对外接口是一种动态定义,在代码动态解析的时候就会生成

6、ES6
[高频]

  • 箭头函数:缩减代码;扭转this指向-指向函数应用时所在的作用域,而不是定义时所在作用域;
  • 块级作用域:避免内层变量笼罩外层变量;防止变量泄露,成为全局变量;
  • 数组的扩大:find() 、findIndex()-用于找出第一个符合条件的数组成员/下标;includes()-示意某个数组是否蕴含给定的值;
  • 扩大运算符:将数组宰割,并将各个项作为拆散的参数传给函数;
  • 模板字符串
  • Promise
  • 模块化

7、深浅拷贝
[中频]

浅拷贝:只遍历一层 - Object.assign()-连贯对象    var obj = {a:{name:"kaiqin",age:19}};    var obj1 = Object.assign({},obj,obj2);     - concat、slice、扩大运算符 深拷贝: - 只实用于纯数据json对象的深度克隆-JSON.parse(JSON.stringify(obj))   会把函数或 undefined失落   obj外面有工夫对象,工夫将只是字符串的模式。而不是工夫对象; - $.extend -为true为深拷贝,为false,则为浅拷贝    let a=[0,1,[2,3],4],    b=$.extend(true,[],a);

8、promise和async await
[中频]

  • promise
let p = new Promise((resolve,reject) => {    //...    resolve('success')});p.then(result => {    console.log(result);//success});
  • async
async function demo() {    let result = await Promise.resolve(123);    console.log(result);}demo();
  • 在错误处理方面,async函数更容易捕捉异样谬误

9、不借助v-model实现双向绑定
[低频]

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title></head><body>    <input type="text" id="ip">    <span id="sb"></span>    <script>        // 数据劫持        var obj = {};        Object.defineProperty(obj,'hello',{            set: function(newValue){                document.getElementById('ip').value = newValue                document.getElementById('sb').innerHTML = newValue            }        });        document.addEventListener('keyup',function(e){            obj.hello = e.target.value // 监听事件 批改hello的值,触发set函数  执行set函数内的内容         })    </script></body></html>

10、防抖和节流
[低频]

  • 防抖和节流的作用都是避免函数屡次调用。区别在于,假如一个用户始终触发这个函数,且每次触发函数的距离小于wait,防抖的状况下只会调用一次,而节流的状况会每隔肯定工夫(参数wait)调用函数。
  • 防抖(debounce)

search搜寻联想,用户在一直输出值时,用防抖来节约申请资源。

 window触发resize的时候,一直的调整浏览器窗口大小会一直的触发这个事件,用防抖来让其只触发一次
  • 节流(throttle)

鼠标一直点击触发,mousedown(单位工夫内只触发一次)
监听滚动事件,比方是否滑到底部主动加载更多,用throttle来判断

### 浏览器
[没问]
1、HTTP

  • 申请行
  • 申请头:Accept-通知服务端,客户端接管什么类型的响应,Accept-Encoding-接管什么类型的编码和压缩模式
  • 响应头:Access-Control-Allow-Origin-指定哪些站点能够参加跨站资源共享,Date-音讯发送的日期和工夫
  • 共有:Cache-Control,Connection-keeplive长久连贯,一个连贯能够发多个申请,content-type-设置申请体的类型,Content-Length-设置申请体的字节长度。
  • 状态码:

1xx-提示信息-申请已接管,持续解决
2xx-胜利-申请已胜利接管、了解
3xx-重定向-在实现申请前必须做进一步操作
4xx-客户端谬误-
5xx-服务端谬误
403:禁止拜访申请页面; 404:申请资源不存在

2、存储
[中高频]

  • Cookie-个别由服务器生成,携带在Http申请头中,能够设置生效工夫;若在浏览器端生成,默认是在浏览器敞开后生效

主要参数有:

  (1)expires 过期工夫

  (2)path cookie寄存门路

  (3)domain 可拜访该Cookie的域名

  (4)Set-Cookie: name value
  

  • localStorage-永恒保留,生效须要被动革除
  • sessionStorage-存储在以后会话中,敞开标签或浏览器会生效

3、从URL输出到页面展示到底产生什么
[没问]

  • 输出URL后,浏览器会向DNS服务器发送域名,DNS服务器会返回和域名统一的IP;
  • 浏览器向服务器发送申请前会进行TCP三次握手;
  • 完结后发送HTTP申请报文,服务器解决并返回HTTP响应报文;
  • 浏览器拿到响应内容后,依据HTML解析出DOM树,依据CSS解析出CSS规定树,联合DOM树和CSS规定树解析出渲染树,依据渲染树计算每个节点的信息,依据计算信息绘制页面;
  • 数据传送结束,会断开TCP连贯,发动四次挥手

三次握手

  • 浏览器通知服务器,我要发送申请了;
  • 服务器通知浏览器,我筹备接管了,你连忙发吧;
  • 浏览器通知服务器,我马上就发了,筹备接管吧

四次挥手

  • 浏览器通知服务器,我申请报文发送完了,你筹备敞开吧;
  • 服务器通知浏览器,我申请报文接管完了,我筹备敞开了,你也筹备吧;
  • 服务器通知浏览器,我响应报文发送完了,我筹备敞开了,你也筹备吧;
  • 浏览器通知服务器,我响应报文接管完了,我筹备敞开了,你也筹备吧;

布局

响应式布局
[中高频]

  • 百分比-实用于挪动端和 PC 端专用一套代码
  • 媒体查问-利用特定的款式
  • rem-实用于挪动端-document.documentElement.style.fontSize=(屏幕宽度/设计稿宽度)*100+"px";绝对于html根元素的字体尺寸

em-绝对于以后行内文本的字体尺寸,会继承父级元素的字体尺寸

CSS

革除浮动
[中频]

  • 给父元素增加after伪元素,实现元素开端增加一个看不见的块元素革除浮动
  • overflow:hidden-触发BFC原理

-br标签 增加 clear="all"

程度居中
[中频]

  • text-align:center;
  • margin:0 atuo
  • display:flex,align-item:center;

程度垂直居中
[中高频]

  • position: absolute;;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    margin: auto;
  • position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  • display: flex;
    justify-content: center;
    align-items: center;

左侧固定右侧自适应;
[低频]

  • 左侧float: left;右侧margin-left
  • 左侧flex:0 0 200px;右侧flex:1

box-sizing
[中高频]

  • content-box
  • border-box-宽高不蕴含padding/margin/border

Less
[没问]

  • @变量存储专用的款式、门路、选择器等
  • 混合应用,引入一个类到另一个类,应用extend伪类来实现款式的继承
  • &嵌套
  • 函数&运算
  • 命名空间和作用域

### 优化
压缩代码:
[高频]

  • 路由懒加载
  • vue我的项目和部署nginx同时开启Gzip
  • 将公共依赖库挂到 CDN 上,通过script引入
  • 第三方插件的按需引入
  • 图片压缩并上传到云服务器
  • 浏览器缓存

查看打包大小

  • 剖析工具webpack-bundle-analyzer

Webpack优化
构建速度优化
代码品质压缩

其余

Git:回滚
[低频]

  • checkout - 未执行git add,舍弃以后所有改变
  • reset - 重置缓存区
  • revert - 撤销曾经公布到仓库的提交

MVVM和MVC
[中频]

  • 把Model和View关联起来的就是ViewModel。ViewModel负责把Model的数据同步到View显示进去,还负责把View的批改同步回Model
  • 每一层互相独立,变更数据不必批改其余层

前端工程化当初的长处
[低频]

  • 规范化-编码标准、目录构造的制订、前后端接口标准
  • 模块化-JS的模块化、css的模块化、资源的模块化
  • 组件化-每个蕴含模板(HTML)+款式(CSS)+逻辑(JS)性能齐备的结构单元
  • 自动化-构建、部署、测试
  • 组件化≠模块化。模块化只是在文件层面上,对代码或资源的拆分;而组件化是在设计层面上,对UI(用户界面)的拆分。