cvte前端实习生笔试
刚考完试,印象比较深的两道错题,记录一下
new Promise((resolve)=>{
console.log("1")
resolve(2)
}).then((a)=>{
console.log(a)
})
setTimeout(()=>{
console.log("3")
})
console.log("4")
这道题错的实在是不应该,当时把setTimeout是创建了一个宏任务,promise.then是创建微任务记反了,正确的输出结果应该是promise中的”1”立即执行,然后执行“4“,主线程(宏任务)执行完毕,执行该宏任务产生的微任务,所以执行”4“,最后执行下一个宏任务,输出”3“
这是一道编程题,题目大意是(实现一个Event类(发布订阅模式))
class Event{
strFnMap=new Map()
on=function (str,fn){
let myMap=this.strFnMap
if(!myMap.get(str)){
let temp=[]
temp.push(fn)
myMap.set(str,temp)
//上面这三行代码考试时写的是myMap.set(str,[].push(fn))
//没注意到Array.push()返回值是数组长度
}
else{
let temp=myMap.get(str)
temp.push(fn)
myMap.set(str,temp)
}
}
emit=function (str,arg1,arg2) {
let myMap=this.strFnMap
if(myMap.get(str)){
for(let i=0;i<myMap.get(str).length;i++){
myMap.get(str)[i].call("",arg1,arg2)
//考试时这里写的apply,但是运行报错了(CreateListFromArrayLike called on non-object)
//很迷惑,我记得调用的函数不依赖对象值的情况下apply第一个参数也是可以为任意值的呀
}
}
}
off=function (str) {
let myMap=this.strFnMap
if(myMap.get(str)){
myMap.delete(str)
}
}
}
function fn1(name,city){
console.log(`欢迎${name}来到${city}`)
}
function fn2(name){
console.log(`欢迎${name}`)
}
var a=new Event()
a.on("Say1",fn1)
a.on("Say1",fn2)
//a.off("Say1")
a.emit("Say1","小明","广州")