JavaScipt和Vue面试常见题

203 阅读4分钟

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

JavaScipt

set
去重复 基本用法 [..new Set()]

map 键值对. 基本用法 -map.set -map.get -map.hase -map.delete

promise 异步编程, 目前用于网络请求与加载图片
缺点为: 1.无法中途取消 2.无法获知进度情况 (必须等它执行完毕后,因为状态只有完成,失败,进行中) 3.必须设置回调函数,否则错误不会外漏

symbol

  const PROP_NAME = Symbol() 

1.字段唯一 2.对内操作,对外选择性输出

let obj = {
   [Symbol('name')]: '一斤代码',
   age: 18,
   title: 'Engineer'
}

Object.keys(obj)   // ['age', 'title']

for (let p in obj) {
   console.log(p)   // 分别会输出:'age' 和 'title'
}

Object.getOwnPropertyNames(obj)   // ['age', 'title']

Generator 关键字 yiled 执行时,只有看到 next(); 才会运行下一个语句,类似于C的指针 例如:

function* getData(){
	yield test1();
	yield test2();
	yield test3();
}
var go=getData();
go.next();   //看到该方法时才会执行下条语句

let 只用于块级作用域,必须有大括号,不然报错

test(){
	let test=5;
	if(true){
		let test=10;
	}
	console.log(test);
}

const 类似于static,意指静态变量,不可修改

JS原型链 函数有 prototype对象,而protoType的上层则为_proto_
对象也是有_proto_这一属性的 所有函数与对象都是有 _proto_这一属性的,源头皆为null

例如: instanceOf 在进行左边是否来源于右边的属性时, 比较的则就是原型proto,如果相等就是true

只要定义了一个对象,那么就可以找到他的原型.就可以构成一个对象的序列.这被称为原型链

闭包 通俗点就是 方法里return了一个函数方法 闭包就是能读取本作用域中其它方法的函数 建议使用完后,对闭包函数进行null处理,将函数置为null 优点:避免全局变量污染 变量长期存储在内存中
缺点:内存泄漏 常驻内存

浅拷贝与深拷贝 浅拷贝 拷贝的只是内存空间,并类似于数据绑定,修改2会影响到1 深拷贝 拷贝的是数据的所有属性,相当于是定义的一个新的数组

数组去重的方法

set
去重复 基本用法  [..new Set()]
 
reduce 累加器
let arr = [1,1,2,3,4,5,5,6]
let arr2 = arr.reduce(function(ar,cur) {
if(!ar.includes(cur)) {
ar.push(cur)
}
return ar},[])

filter 过滤器
let arr = [1,1,2,3,4,5,5,6]
let arr2 = arr.filter(function(item,index) {
// indexOf() 方法可返回某个指定的 字符串值 在字符串中首次出现的位置
return arr.indexOf(item) === index
})

宏任务和微任务 宏任务: settimeout setinterval script 微任务: promise ,process 优先执行宏任务,在执行微任务,但是输出的时候, event Queue(消息队列)优先执行微任务, 也就是先进后出

async和await await存在于async之中, 相当于是把异步变成了同步, await会等待异步程序执行完毕之后返回值. 每次都会等待计算完毕才会走其它的方法

function async getData(){
	var ww=await 5+6;
}

requestAnimationFrame 和 setTimeout requestAnimationFrame 由系统进行调拨,智能节流, 网页缩小后,会暂停运行,打开后继续运行 setTimeout 会一直执行

常见的内存泄漏 1.定时器 2.闭包 3.dom的引用 4.全局变量未定义

性能优化 1.图片优化 2.webpack压缩 3.减少请求量 4.优化资源加载 5.减少重绘

VUE

vue双向绑定原理

    采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫持各个属性的 setter
getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
    通俗点就是 Observer去监听所有对象的属性,并为他们建立setter和getter,当检测到变化时,便通知订阅者
Compile去扫描每个元素节点,根据模板指令去替换数据
    Watcher的作用就是沟通Observer和compile的桥梁,订阅每个变动的通知,并执行更新命令,从而更新对应的视图

Vue为什么还需要虚拟DOM进行diff检测差异 因为vue的响应式系统最大的优点是Watcher,缺点也是Watcher, 因为知道哪里需要修改,但是会给每个属性建立一个Wacther,造成内存与依赖追踪的开销,所以需要虚拟dom diff来获取更具体的差异

v-for 绑定Key值得作用 数据顺序未变的情况下,去复用每个元素, 更高效更快的去更新Dom

Vue的通信方式

 1.props/$emit   //父子组件通信
 2.$emit/$on (订阅者)   //任意组件通信,但是维护麻烦
 3.$attrs/$listenter(子组件可引用父组件的所有属性,class,style)//将父类基本属性传至子级组件或孙级组件
 4.provide/inject(像是依赖注入,父组件提供实例,子组件注册使用) 
 5.ref //通过ref获取子组件的实例

Vue重置data 使用object.assign(this.data,this.$options.data());

   this.$options.data()  中包含所有页面初始化时的元数据

Vue组件加name选项的作用 1.keep-alive时,搭配组件name进行过滤选择 //exclude 2.可以递归自己组件 3.调试工具dev-tool可以看见name

Vue的首屏加载优化 1.将不常改变的库放置到 index.html 并用cdn方式引入, 然后在build/webpack.base.conf.js 中进行去除操作 2.路由懒加载,不要直接import,使用componet=>require() 3.不生成map文件,改为productionSourceMap: false 4.组件不要全部引入.例如elementUi,只引入用到的 5.前端开启gzip压缩,后端开启gzip