2020.5.15记一次阿里电话面试经历
2020.5.15记一次阿里电话面试经过
自我介绍,然后问了vue2的源码,有什么缺点,为啥存在缺点,vue2的官方有什么对策,还问了vue3使用Proxy为啥就修复了这些缺点,使用了Proxy,为啥就能拦截到这些行为?
然后给了两道笔试题,是线上的那种,我平时这种题目很少涉及,然后突然一来吧,心里发毛,然后他又盯着看着,我就没发挥好,丢脸丢大了,不过自己确实是眼高手低,平时看到之后确实会,上手写确实费劲。。。,写下这篇文章,算是让自己长个记性吧,也是给自己敲个警钟!!!
1. 请使用 JavaScript 实现名为 flatten(input) 的函数,可以将传入的 input 对象(Object 或者 Array)进行扁平化处理并返回结果。 // 具体效果如下: // const input = { // a: 1, // b: [ 1, 2, { c: true }, [ 3 ] ], // d: { e: 2, f: 3 }, // g: null, // } // function flatten(input) { // // 需要实现的代码 // } flatten(input); // 返回 // { // "a": 1, // "b[0]": 1, // "b[1]": 2, // "b[2].c": true, // "b[3][0]": 3, // "d.e": 2, // "d.f": 3, // "g": null, 值为null或者undefined,丢弃 // }; ------------简单实现------------
function getType(obj) { return Object.prototype.toString.call(obj).slice(8, -1) } function flatten(input, result, preKey, keyType) { result = result || {} for (let key in input) { const val = input[key] if (preKey && keyType) { if (keyType === 'Object') { key = `${preKey}.${key}` } else if (keyType === 'Array') { key = `${preKey}[${key}]` } } if (typeof val === 'object') { if (getType(val) == 'Object') { flatten(val, result, key, 'Object') } else if (getType(val) == 'Null') { result[key] = val } else if (getType(val) == 'Array') { flatten(val, result, key, 'Array') } } else { result[key] = val } } return result }
// 2. 实现一种自定义事件机制: class EventEmitter { /* 在此处填写实现 */ } const emitter = new EventEmitter(); const handler = function(evt) { console.log(1, evt); }; emitter.on('foo', handler); emitter.once('foo', function(evt) { console.log(2, evt); }); emitter.fire({ type: 'foo', value: 'hello' }); emitter.fire({ type: 'foo', value: 'world' }); emitter.off('foo', handler); emitter.fire({ type: 'foo', value: 'test' }); // 实现如下方法: // 1. on,添加事件,可以给某个事件添加多个处理函数,这些函数可以被多次触发 // 2. once,添加一次性事件,在触发过一次之后不再触发 // 4. fire,触发特定事件 // 5. off,移除特定的事件处理函数