最近一个月投了好几个简历,只有一家过了初筛,拿到了面试机会,年末找实习好难啊。

今天赶高铁过去面试,到了目标城市准备恰个中饭,顺便查了下高德,看看可以有多少时间恰午饭。一算时间,只有半个小时给我了,吓得我光速点完中饭,胃口也跌了点,吃的还剩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先执行,因为在ES6中,promise执行优先度比settimeout高,js会在执行完所有promise之后再执行settimeout

  当时回答:写在上面的先执行,不过面试官诧异的表情让我十分怀疑自己理解错了 promise...回来做了下测试,结果是我所说的这个啊,也许是我把题目听错了吧

  5. 使用正则检测一个手机号

/^\d{11}$/.test(input.value)

  当时回答:不熟悉正则,不过可以使用 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 指向的