开始是一道笔试题,开始我写的代码其实并不好,连class语法都写错了hhh😬😬😬😬😬
//实现一个发布订阅模块,subscribe,unsubscribe,publish接口分别用来实现订阅,取消订阅,和发布事件的功能 //代码尽可能设计考虑更多的边界条件 class Pubsub { constructor(){ this.events = {} } subscribe(event,action){ if(!event||!action){ return; //参数为空这个当时也没写 } //这里我原来只写的是 this.events[event],但这样确实可能会访问到原型上的方法,不妥 if(!this.events.hasOwnProperty(event)){ this.events[event] = [action] return } this.events[event].push(action) return action } unsubscribe(event,action){ if(!event&&!action){ this.events = {} return } if(!action) { this.events[event] = [] return } // if(!action.name){ 这个部分是hr后提的额外需求,取消匿名函数,但我这个方法可能定是错的,正确方法见下: // //通过action.name判断是否为匿名函数,匿名函数的话就通过将其转化为字符串进行比较 // this.events[event] = this.events[event].filter(fn=>fn.toString().trim()!==action.toString().trim()) // return // } this.events[event] = this.events[event].filter(fn=>fn!==action) } publish(event){ if(this.events.hasOwnProperty(event)) { this.events[event].forEach(fn=>fn()) } } } let ob = new Pubsub(); ob.subscribe('add', (val) => console.log(123)); ob.subscribe('add', (val) => console.log(123)); // ob.unsubscribe('add',(val) => console.log(123)) //正确方法,给subscribe添加返回值,为函数应用 let temp = ob.subscribe('add', (val) => console.log(123)); ob.unsubscribe('add',temp) ob.publish('add'); //结果,123,123阿里的笔试是在线进行的,他们有一套在线编码视频应用,有的笔试官会要求你和他视频,有的不会,然后你也可以请求自己在本地编辑运行测试后再把代码贴上去,但我这次是让我直接在阿里的编辑器里写,
还是挺不方便,主要是没语法提示了哈哈,看来还是平时太依赖webstorm,真大佬都用记事本(逃
写完后还问了一些技术问题。
建议大家准备笔试最基本最重要的还是要熟悉各种数组和字符串的操作方法呀!这种考察很多的!
全部评论
(2) 回帖