标签:继承 family 调用链 基本 微软 bsp llb 解决方案 命名
1、原型如何实现继承?Class 如何实现继承?Class 本质是什么?
组合继承、
寄生继承核心就是将父类的原型赋值给子类,并将构造函数设为子类,这样既解决了无用的父类属性问题,还能正确的找到子类的构造函数。
class本质就是函数
class实现继承的核心在于使用extends表明继承自那个父类,并且在子类构造函数中必须调用super
2、为什么要使用模块化?都有哪几种方式可以实现模块化,各有什么特点?
解决命名冲突,提供复用性,提高代码可维护性
立即执行函数、AMD\CMD、commonjs
3、Proxy 可以实现什么功能?
可以用来自定义对象操作 let p = new Proxy(target, handler)
如果需要实现一个 Vue 中的响应式,需要我们在 get
中收集依赖,在 set
派发更新,之所以 Vue3.0 要使用 Proxy
替换原本的 API 原因在于 Proxy
无需一层层递归为每个属性添加代理,一次即可完成以上操作,性能上更好,并且原本的实现有一些数据更新不能监听到,但是 Proxy
可以完美监听到任何方式的数据改变,唯一缺陷可能就是浏览器的兼容性不好了。
4、map, filter, reduce 各自有什么作用?
map作用时生成一个新数组,遍历原数组,将每个元素拿出来做一些改变然后放入到新的数组之中,另map接收三个参数,索引元素、索引、原数组
filter的作用也是生成一个新数组,在遍历数组的时候将返回值放入新数组中,利用这个函数删除一些不需要的原素
reduce通过回调函数将所有的元素最终转换为一个值
5、并发与并行的区别?
并发是宏观概念,我分别有任务 A 和任务 B,在一段时间内通过任务间的切换完成了这两个任务,这种情况就可以称之为并发。
并行是微观概念,假设 CPU 中存在两个核心,那么我就可以同时完成任务 A、B。同时完成多个任务的情况就可以称之为并行。
6、什么是回调函数?回调函数有什么缺点?如何解决回调地狱问题?
回调地狱,多个请求存在耦合性一但改动,嵌套一多,就难处理错误
通过Generator控制函数执行
7、你理解的 Generator 是什么?
通过function*
来定义的函数称之为“生成器函数”(generator function),它的特点是可以中断函数的执行,每次执行yield
语句之后,函数即暂停执行,直到调用返回的生成器对象的next()
函数它才会继续执行
8、:Promise 的特点是什么,分别有什么优缺点?什么是 Promise 链?Promise 构造函数执行和 then 函数执行有什么区别?
Promise意思时承诺,分为三个状态:等待中(pending)、完成了(resolved)、拒绝(rejected)
承诺一旦从等待状态变成其他状态永远不能改变,一旦转态变为resolved就不不能改变
pomise实现链式调用,也就时说每次用then之后返回的都是一个Pomise,并且时全新的pomise,原因也是因为状态不可变,如果你在then中使用了return那么return的值就会Pomise.resolve包装
缺点:无法取消 Promise
,错误需要通过回调函数捕获。
9、async 及 await 的特点,它们的优点和缺点分别是什么?await 原理是什么?
async就是将函数返回值使用pomise.resolve()包裹了下,和then中处理返回值一样
async 和await 可以说时异步终极解决方案了,相比直接使用pomise来说,优势在于处理then的调用链,能够准确的写出代码,并且也能优雅地解决回调地狱问题
缺点await将异步代码改成同步代码,如果多个异步代码没有依赖性却使用了await会导致性能上的降低
10、setTimeout、setInterval、requestAnimationFrame 各有什么特点?
很多人认为 setTimeout
是延时多久,那就应该是多久后执行。
其实这个观点是错误的,因为 JS 是单线程执行的,如果前面的代码影响了性能,就会导致 setTimeout
不会按期执行。当然了,我们可以通过代码去修正 setTimeout
,从而使定时器相对准
setInterval
,其实这个函数作用和 setTimeout
基本一致,只是该函数是每隔一段时间执行一次回调函数。
requestAnimationFrame
自带函数节流功能,基本可以保证在 16.6 毫秒内只执行一次(不掉帧的情况下),并且该函数的延时效果是精确的,没有其他定时器时间不准的问题,当然你也可以通过该函数来实现 setTimeout
11、实现出一个简易版的 Promise
const PENDING = ‘pending‘
const RESOLVE = ‘resolve‘
const REJECTED = ‘rejected‘
function MyPomise(fn){
const that =this
that.state = PENDING
that.value = null
that.resolvedCallbacks = []
that.rejectedCallbacks = []
function resole(value){
that.state = REJECTED
that.value=value
that.resolvedCallbacks.map(cd=>{
that.value
})
}
function reject(value) {
if (that.state === PENDING) {
that.state = REJECTED
that.value = value
that.rejectedCallbacks.map(cb => cb(that.value))
}
}
}
try{
fn(resole,reject)
}catch(e){
reject(e)
}
MyPomise.prototype.then=function(onFulfilled,onRejected){
const that = this
onFulfilled = typeof onFulfilled === ‘function‘?onFulfilled:v=>v
onRejected = typeof onRejected ===‘function‘?onRejected:r=>{
throw r
}
if(that.state == PENDING){
that.resolvedCallbacks.push(onFulfilled)
that.rejectedCallbacks.push(onRejected)
}
if(that.state == RESOLVE){
onFulfilled(that.value)
}
if(that.state===REJECTED){
onRejected(that.value)
}
}
Promise.resolve(4).then().then((value) => console.log(value))
new MyPomise((resolve, reject)=>{
seTimeout(()=>{
resolve(1)
},0)
}).then(value=>{
console.log(value)
})
标签:继承 family 调用链 基本 微软 bsp llb 解决方案 命名
原文地址:https://www.cnblogs.com/shuls/p/10527492.html