美团前端一面手写面试题
实现斐波那契数列
判断是否是电话号码
查找数组公共前缀(美团)
题目描述
答案
请实现 DOM2JSON 一个函数,可以把一个 DOM 节点输出 JSON 的格式
实现代码如下:
字符串最长的不重复子串
题目描述
答案
实现千位分隔符
参考 前端进阶面试题详细解答
数组中的数据根据 key 去重
给定一个任意数组,实现一个通用函数,让数组中的数据根据 key 排重:
实现
使用
实现事件总线结合 Vue 应用
Event Bus
(Vue、Flutter 等前端框架中有出镜)和Event Emitter
(Node 中有出镜)出场的“剧组”不同,但是它们都对应一个共同的角色—— 全局事件总线 。
全局事件总线,严格来说不能说是观察者模式,而是发布-订阅模式。它在我们日常的业务开发中应用非常广。
如果只能选一道题,那这道题一定是
Event Bus/Event Emitter
的代码实现——我都说这么清楚了,这个知识点到底要不要掌握、需要掌握到什么程度,就看各位自己的了。
在 Vue 中使用 Event Bus 来实现组件间的通讯
Event Bus/Event Emitter
作为全局事件总线,它起到的是一个沟通桥梁的作用。我们可以把它理解为一个事件中心,我们所有事件的订阅/发布都不能由订阅方和发布方“私下沟通”,必须要委托这个事件中心帮我们实现。
在 Vue 中,有时候 A 组件和 B 组件中间隔了很远,看似没什么关系,但我们希望它们之间能够通信。这种情况下除了求助于 Vuex
之外,我们还可以通过 Event Bus
来实现我们的需求。
创建一个 Event Bus
(本质上也是 Vue 实例)并导出:
在主文件里引入EventBus
,并挂载到全局:
订阅事件:
发布(触发)事件:
大家会发现,整个调用过程中,没有出现具体的发布者和订阅者(比如上面的
PrdPublisher
和DeveloperObserver
),全程只有bus
这个东西一个人在疯狂刷存在感。这就是全局事件总线的特点——所有事件的发布/订阅操作,必须经由事件中心,禁止一切“私下交易”!
下面,我们就一起来实现一个Event Bus
(注意看注释里的解析):
在日常的开发中,大家用到
EventBus/EventEmitter
往往提供比这五个方法多的多的多的方法。但在面试过程中,如果大家能够完整地实现出这五个方法,已经非常可以说明问题了,因此楼上这个EventBus
希望大家可以熟练掌握。学有余力的同学
实现 reduce 方法
初始值不传怎么处理
回调函数的参数有哪些,返回值如何处理。
对象数组如何去重
根据每个对象的某一个具体属性来进行去重
解析 URL Params 为对象
实现数组的乱序输出
主要的实现思路就是:
取出数组的第一个元素,随机产生一个索引值,将该第一个元素和这个索引对应的元素进行交换。
第二次取出数据数组第二个元素,随机产生一个除了索引为 1 的之外的索引值,并将第二个元素与该索引值对应的元素进行交换
按照上面的规律执行,直到遍历完成
还有一方法就是倒序遍历:
实现 getValue/setValue 函数来获取 path 对应的值
实现
使用 promise 来实现
创建 enhancedObject
函数
使用 enhancedObject
函数
以上代码运行后,控制台会输出以下代码:
通过观察以上的输出结果可知,使用
enhancedObject
函数处理过的对象,我们就可以方便地访问普通对象内部的深层属性。
Promise 并行限制
就是实现有并行限制的 Promise 调度器问题
用 Promise 实现图片的异步加载
实现数组元素求和
arr=[1,2,3,4,5,6,7,8,9,10],求和
arr=[1,2,3,[[4,5],6],7,8,9],求和
递归实现:
类数组转化为数组的方法
实现防抖函数(debounce)
防抖函数原理:把触发非常频繁的事件合并成一次去执行 在指定时间内只执行一次回调函数,如果在指定的时间内又触发了该事件,则回调函数的执行时间会基于此刻重新开始计算
防抖动和节流本质是不一样的。防抖动是将多次执行变为最后一次执行
,节流是将多次执行变成每隔一段时间执行
eg. 像百度搜索,就应该用防抖,当我连续不断输入时,不会发送请求;当我一段时间内不输入了,才会发送一次请求;如果小于这段时间继续输入的话,时间会重新计算,也不会发送请求。
手写简化版:
适用场景:
文本输入的验证,连续输入文字后发送 AJAX 请求进行验证,验证一次就好
按钮提交场景:防止多次提交按钮,只执行最后提交的一次
服务端验证场景:表单验证需要服务端配合,只执行一段连续的输入事件的最后一次,还有搜索联想词功能类似
实现防抖函数(debounce)
防抖函数原理:在事件被触发 n 秒后再执行回调,如果在这 n 秒内又被触发,则重新计时。
那么与节流函数的区别直接看这个动画实现即可。
手写简化版:
适用场景:
按钮提交场景:防止多次提交按钮,只执行最后提交的一次
服务端验证场景:表单验证需要服务端配合,只执行一段连续的输入事件的最后一次,还有搜索联想词功能类似
生存环境请用 lodash.debounce
评论