美团前端手写面试题总结
Promise
查找字符串中出现最多的字符和个数
例: abbcccddddd -> 字符最多的是 d,出现了 5 次
实现数组的 push 方法
手写 Promise.race
该方法的参数是 Promise 实例数组, 然后其 then 注册的回调方法是数组中的某一个 Promise 的状态变为 fulfilled 的时候就执行. 因为 Promise 的状态只能改变一次, 那么我们只需要把 Promise.race 中产生的 Promise 对象的 resolve 方法, 注入到数组中的每一个 Promise 实例中的回调函数中即可.
模拟 Object.create
Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。
实现数组的 filter 方法
手写 instanceof 方法
instanceof 运算符用于判断构造函数的 prototype 属性是否出现在对象的原型链中的任何位置。
实现步骤:
首先获取类型的原型
然后获得对象的原型
然后一直循环判断对象的原型是否等于类型的原型,直到对象原型为
null
,因为原型链最终为null
具体实现:
验证是否是身份证
实现简单路由
参考:前端手写面试题详细解答
实现 apply 方法
apply 原理与 call 很相似,不多赘述
将数字每千分位用逗号隔开
数字有小数版本:
数字无小数版本:
实现数组元素求和
arr=[1,2,3,4,5,6,7,8,9,10],求和
arr=[1,2,3,[[4,5],6],7,8,9],求和
递归实现:
实现防抖函数(debounce)
防抖函数原理:在事件被触发 n 秒后再执行回调,如果在这 n 秒内又被触发,则重新计时。
那么与节流函数的区别直接看这个动画实现即可。
手写简化版:
适用场景:
按钮提交场景:防止多次提交按钮,只执行最后提交的一次
服务端验证场景:表单验证需要服务端配合,只执行一段连续的输入事件的最后一次,还有搜索联想词功能类似
生存环境请用 lodash.debounce
Array.prototype.map()
查找文章中出现频率最高的单词
使用 Promise 封装 AJAX 请求
实现数组的 flat 方法
将 js 对象转化为树形结构
代码实现:
用正则写一个根据 name 获取 cookie 中的值的方法
获取页面上的
cookie
可以使用document.cookie
这里获取到的是类似于这样的字符串:
可以看到这么几个信息:
每一个 cookie 都是由
name=value
这样的形式存储的每一项的开头可能是一个空串
''
(比如username
的开头其实就是), 也可能是一个空字符串' '
(比如user-id
的开头就是)每一项用
";"
来区分如果某项中有多个值的时候,是用
","
来连接的(比如user-roles
的值)每一项的结尾可能是有
";"
的(比如username
的结尾),也可能是没有的(比如user-roles
的结尾)
所以我们将这里的正则拆分一下:
'(^| )'
表示的就是获取每一项的开头,因为我们知道如果^
不是放在[]
里的话就是表示开头匹配。所以这里(^| )
的意思其实就被拆分为(^)
表示的匹配username
这种情况,它前面什么都没有是一个空串(你可以把(^)
理解为^
它后面还有一个隐藏的''
);而|
表示的就是或者是一个" "
(为了匹配user-id
开头的这种情况)+name+
这没什么好说的=([^;]*)
这里匹配的就是=
后面的值了,比如poetry
;刚刚说了^
要是放在[]
里的话就表示"除了^后面的内容都能匹配"
,也就是非的意思。所以这里([^;]*)
表示的是除了";"
这个字符串别的都匹配(*
应该都知道什么意思吧,匹配 0 次或多次)有的大佬等号后面是这样写的
'=([^;]*)(;|$)'
,而最后为什么可以把'(;|$)'
给省略呢?因为其实最后一个cookie
项是没有';'
的,所以它可以合并到=([^;]*)
这一步。
最后获取到的
match
其实是一个长度为 4 的数组。比如:
第 0 项:全量
第 1 项:开头
第 2 项:中间的值
第 3 项:结尾
所以我们是要拿第 2 项match[2]
的值。
为了防止获取到的值是
%xxx
这样的字符序列,需要用unescape()
方法解码。
实现 Array.of 方法
Array.of()
方法用于将一组值,转换为数组
这个方法的主要目的,是弥补数组构造函数
Array()
的不足。因为参数个数的不同,会导致Array()
的行为有差异。Array.of()
基本上可以用来替代Array()
或new Array()
,并且不存在由于参数不同而导致的重载。它的行为非常统一
实现
评论