快手-效率工程面经 介绍 8月25日(周二)投递,在9月8日上午收到 HR 电话,告知简历通过了,约9月10日上午11点面试,整个面试时间1个小时左右。
一面 面经 1、自我介绍 2、你刚刚提到了项目中防抖 debounce
,你知道实现原理是什么吗?说一说
这个问题是项目中用到过,然后自我介绍提了一下,就说了一下原理,面试官居然不要我手撕…
3、你家乡在哪?面试岗位在北京,有没有城市要求吗?
回答:反正在湖南,去哪都是很远…
4、实现一个函数,以字符串形式(要求字母小写)返回参数类型
1 2 3 function getArgType (arg ){}
实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function getArgType (arg ){ let str = Object .prototype .toString .call (arg).slice (8 ,-1 ) let res = str[0 ].toLowerCase () + str.substr (1 ) return res } console .log (getArgType (null ))console .log (getArgType (undefined ))const a = 1 const b = new Number (1 )console .log (a === b)console .log (getArgType (a))console .log (getArgType (b))console .log (getArgType (new Date (2020 ,9 ,10 )))console .log (getArgType (new RegExp (/^\s+|\s$/g )))
后面终点问了 1
和 new Number(1)
有什么区别,这里没答上来。
对象Number、String、Boolean分别对应数字、字符串、布尔值,可以通过这三个对象把原始类型的值变成(包装成)对象
1 2 3 4 5 6 7 8 9 10 var v1 = new Number (123 );var v2 = new String ('abc' );var v3 = new Boolean (true );typeof v1;typeof v2;typeof v3;v1 === 123 ; v1 == 123 ;
但是要注意 new Boolean
的用法,只有当 new Boolean
的参数值为 null
或者 undefined
时,求值转换的原始的值才是 false
,其他情况都是 true
5、给你一个数组 [1,3,2,5]
你有多少种方法,求得最大值,说一说
一下没 get 到面试官的点,我想着除了遍历比较或排序还能怎么做。但后面不断引导后发现可以用各种数组 api
,然后就答了 sort
,map
,reduce
,for循环
,shift
,pop
,forEach
,Math.max(...arr)
后面面试官说了用 apply
,没使用过,补充一下:
1 2 var arr = [6 , 4 , 1 , 8 , 2 , 11 , 23 ];console .log (Math .max .apply (null , arr))
6、实现如下效果:当你点击 ul
下面某个 li
后(多个 ui
),打印对应索引值(可以为 0
或 1
)
1 2 3 <ul><li > </li > ........</ul> <ul > <li > </li > ........</ul > <ul > <li > </li > ........</ul >
最终实现如下,一开始我是直接 querySelectorAll
所有的 li
,但是会给所有 li
绑定事件,于是面试官说考虑使用事件代理,然后提示 e.target
(当时没写出来,现在补充一下)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 <!DOCTYPE html> <html lang ="en" > <head > <meta charset ="UTF-8" /> <meta name ="viewport" content ="width=device-width, initial-scale=1.0" /> <title > 编程题:ul底下li索引值(多个ul)</title > </head > <body > <ul > <li > 1</li > <li > 2</li > <li > 3</li > <li > 4</li > <li > 5</li > </ul > <ul > <li > 1</li > <li > 2</li > <li > 3</li > <li > 4</li > <li > 5</li > </ul > <script > let list = document .getElementsByTagName ('ul' ) for (let i = 0 ; i < list.length ; i++) { list[i].addEventListener ('click' , (e ) => { let target = e.target if (target.tagName .toLowerCase () === 'li' ) { let liList = list[i].getElementsByTagName ('li' ) let idx = Array .prototype .indexOf .call (liList, target) console .log (liList) console .log (idx) } }) } </script > </body > </html >
7、使用 vue
封装一个组件,实现倒计时的功能
1 2 3 4 5 倒计时(一个 button 按钮,有下述三种状态) (开始-》暂停-》继续) {count} 按钮
参考:vue封装倒计时组件
8、你还有什么想问我的吗?
感受 问了部门是效率工程,然后主要业务是做公司内部系统,比如各种流程处理,请假那些,然后还提到了公司封装内部聊天工具,类似于企业微信那种。然后还问了技术栈,主要用 React + Ts
,然后面试官说了技术栈都不是太大问题,主要还是 js
能力
最后,问了一下多久会有面试结果,面试官说一天之内给结果。
后续
待更新
总结
待更新