最近一个月投了好几个简历,只有一家过了初筛,拿到了面试机会,年末找实习好难啊。
今天赶高铁过去面试,到了目标城市准备恰个中饭,顺便查了下高德,看看可以有多少时间恰午饭。一算时间,只有半个小时给我了,吓得我光速点完中饭,胃口也跌了点,吃的还剩1/5就吃不下了。赶去的路上还因为着急,走错了路,我真是一个看地图鬼才。但是!到目的地的时候,居然还剩下40分钟...emmm高德地图呕呕呕(猫猫呕吐.jpg)
面试前,先让我做了一下笔试,笔试题中,我比较在意的是这几道题(因为不会)
1. 使用 js 检测一个字符串中出现次数最多的字符
答案:
const str = "aaaaasdffgacaabbrtbbrr"; // 用于存储每个字符的重复次数 const oChar = {} for(let i=0; i < str.length; i++) { if(!oChar[str.charAt(i)]) { oChar[str.charAt(i)] = 0 } oChar[str.charAt(i)] += 1 } // 用于存储最大的字符 let mostChar; // 用于存储重复最多的字符的重复次数 let maxMostCharSize=0; for (let key in oChar) { if (oChar[key] > maxMostCharSize) { mostChar = key; maxMostCharSize = oChar[key] } } console.log(mostChar)
当时回答:先使用字符串的分割方法,然后 for 循环返回的数组,统计数组中同一字符出现的次数
2. 以下代码会打印出啥
var a = 0; function m1(){ console.log(a) } function m2() { var a = 1; console.log(b); var b = 5; console.log(b) m1() console.log(a) } m1() m2()
答案:0,undefined,5,0,1
当时回答:0,undefined,5,1,1。m1 不会使用 m 2函数中的变量 a 是因为 m1 不是在 m2 中定义的?
3. 以下代码为什么会在打印出undefined
<script> console.log(typeof aa) script> <script> function aa() { console.log('b') } script>
答案:在两个 script 标签中,下面的 script 标签的函数不会提升到上面的 script 标签中
当时回答:不知道,猜测是两个 script 标签的问题
4. promise 中设置一个 settimeout(()=>{},0),在其后设置一个 settimeout(()=>{},0),哪个先执行
答案:promise 的先执行,因为 promise 写在上面,所以它先进入消息队列,按照队列的先进先出原则,当然是 promise 中的 settimeout 先执行
当时回答:写在上面的先执行,不过面试官诧异的表情让我十分怀疑自己理解错了 promise...回来做了下测试,结果是我所说的这个啊,也许是我把题目听错了吧
5. 使用正则检测一个手机号
答案:如果只是简单检查11位是不是都是数字的话,那使用正则还是相对简单的,只需要使用 /^\d{11}$/.test(input.value) 来检测就好了,这条正则的意思是测试的字符串是否从头到尾共11位数字,是就返回 true,不是就返回 false。
当时回答:不熟悉正则,不过可以使用 Number(input.value) + input.value.length 来判断是不是数字。今天又测试了一下,使用 HTML5 的 number 输入框,就可以解决输入限定是数字这件事,在该输入框中,只能输入数字和 +-,且当输入框存在非数字时,输入框的 value 值为空。
6. 讲讲 call、apply、bind的区别
答案:这三者都是用于改变函数的 this 指向。其中 call 和 apply 基本类似,他们的区别在于 call 的参数为 this 的指向 + 参数列表,apply 为 this 的指向 + 参数数组,它们的返回值为使用调用者提供的 this 值和参数调用该函数的返回值,bind 的参数和 call 一致,其与 call、apply 的区别在于其返回一个原函数的拷贝,并拥有指定的 this 值和初始参数。通常,call 用于构造函数的继承,bind 用于绑定函数的 this 指向。
当时回答:call,apply 基本没用过,不大清楚,bind 是用来修改 this 指向的