码迷,mamicode.com
首页 > Web开发 > 详细

js基础知识2

时间:2019-03-14 00:38:03      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:继承   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)
})

 

js基础知识2

标签:继承   family   调用链   基本   微软   bsp   llb   解决方案   命名   

原文地址:https://www.cnblogs.com/shuls/p/10527492.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!