奇葩面试之经历

168 阅读4分钟

昨天面试了一家公司,今天我就来总结一下有关昨天的面试经历及心得

说实话这是我截止到目前第一家让写笔试题的线下面试,当时挺崩溃的,我拿到填写个人信息的表格和面试题,首先填写了个人的相关信息,然后大概看了一下笔试题的内容,说实话我是真的没有写完整的能力,这种纯js的代码题,真的是难为我了,我就写了第二题和第三题,一个是考察大数相加另一个是考察宏任务和微任务的,就写了两道题。后边的我真的写不下去,就直接跟前台小姐姐说不好意思,可能不太合适。前台小姐姐就问我要不要约面试,还说来都来了,我想也是,大老远的。就让前台小姐姐帮忙安排一下。然后就进入了面试环节,因为之前面试带过一次简历,但当时去面试发现面试官都会打印简历,之后就没有带简历的习惯了,昨天就相当尴尬,我没有带简历,面试官也没有打印简历,整个面试都是面试官直接用电脑看着我的电子版的简历面试的,真的是挺奇葩的。 整个面试笔试部分相当惨烈,面试部分面试官的问题回答得还算可以,面对面试官的一些较深入的问题,我可能不太清楚,我说完我的思路之后会反问面试官他会如何解决,当然面试官也一一解答了,其实也算是在面试中学到了一些东西。

笔试

1.查看下面代码,请说出输出是什么?

var myObject = {
      foo:'bar',
      func:function(){
        var self = this;
        console.log("outer func:this.foo ="+this.foo);
        console.log("outer func: self.foo="+self.foo);
        (function(){
          console.log("inner func: this.foo ="+this.foo);
          console.log("inner func: self.foo="+self.foo)
        }());
      }
    };
    myObject.func()

输出结果:

              outer func:this.foo =bar
11.15.html:16 outer func: self.foo=bar
11.15.html:18 inner func: this.foo =undefined
11.15.html:19 inner func: self.foo=bar

解析: 1.第一个this.foo输出bar,因为当前this指向对象myObject。

2.第二个self.foo输出bar,因为self是this的副本,同指向myObject对象。

3.第三个this.foo输出undefined,因为这个IIFE(立即执行函数表达式)中的this指向window。

4.第四个self.foo输出bar,因为这个匿名函数所处的上下文中没有self,所以通过作用域链向上查找,从包含它的父函数中找到了指向myObject对象的self。

原文链接:blog.csdn.net/YXB413/arti…

2.查看下面代码,请问输出是什么?

    console.log(0.1+0.2);
    console.log(0.1+0.2==0.3);

输出结果:

0.30000000000000004
false

解析详见: juejin.cn/post/697177…

3.查看下面代码,按照顺序,输出的是

(function () {
      console.log(1);
      setTimeout(function () {
        console.log(2)
      }, 1000);
      setTimeout(function () {
        console.log(3)
      }, 0);
      console.log(4)
    })()

输出结果: 1 4 3 2 解析:主要考察EventLoop事件循环,宏任务和微任务的执行顺序:

  • script全局代码是一个宏任务;
  • 先执行完成宏任务,并且执行一个宏任务,就去执行微任务;
  • 执行宏任务之前必须保证微任务队列里面为空;
  • Promise的回调函数是同步代码是立即执行。

具体详见: www.jianshu.com/p/b5677c51c…

4.查看下面代码,输出是什么?

var a={},
    b={key:'b'},
    c={key:'c'};
    a[b]=123;
    a[c]=456;
    console.log(a[b]);

输出:456

解析如下:当一个对象的属性即key值是一个对象的时候,会调用原型上的toString方法将其转化为字符串,所以a[c]也被转化了,然后key值就是一个字符串[object Object],所以a[b]就变覆盖了,得出答案为456 blog.csdn.net/THINK_OF_/a…

5.实现sum函数,满足下面要求

console.log(sum(2,3));//Outputs 5
console.log(sum(2)(3));//Outputs 5

两种方法,具体如下:

    //方法一
     function sum(x) {
      if (arguments.length === 2) {
        return arguments[0] + arguments[1];
      } else {
        return function (y) {
          return x + y
        }
      }
    }
    //方法二
    function sum2(x, y) {
      if (y !== undefined) {
        return x + y;
      } else {
        return function (y) {
          x + y;
        }
      }
    }
    console.log(sum(2)(3))
    console.log(sum(2,3))
    console.log(sum2(2,3))

6.查看下面代码,分别输出什么

value =1;
    var o ={
      value: 2,
      change:function(x){
        this.value = x;
      }
    }

    var o1 = {
      value:3
    }
    o1.change = o.change;
    var o2 = o;

    o.change(4);
    o.change.call(this,5);
    o1.change(6);
    o2.change(7);

    console.log(value);
    console.log(o.value);
    console.log(o1.value);
    console.log(o2.value);

输出结果: 5 7 6 7

7.查看下面代码,输出是

 console.log((function f(n){return ((n>1)?n*f(n-1):n)})(10))

输出: 3628800 解析: 相当于是计算10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 blog.csdn.net/weixin_3050…

8.查看下面代码,输出是什么,为什么?

    for(var i=0;i<5;i++){
      setTimeout(function(){
        console.log(i);
      },i*1000);
    }

输出:全是5 解析参考具体如下: blog.csdn.net/huakaiwuxin…

9.查看下面代码,输出是什么,为什么?

   var b=1;
    function outer(){
      console.log("first b:",b);
      var b = 2
      function inner(){
        b++;
        console.log("second b:",b);
        var b =3;
        console.log("third b:",b)
      }
      inner();
    }
    outer();

输出结果:

first b: undefined;

second b: NaN;

third b3

10.实现一个duplicate函数,输入一个字符串数组,返回该字符数组中重复次数最多的字符串和重复次数;如果没有重复,则返回null

function duplicate(strArray);

var strArray1=["1","2","1","4","4","1"];

var result = duplicate(strArray1)//返回字符串“1”和重复次数3

var startArray = ["1","2"];

result = duplicate(strArray2)//返回空

实现方法:

js代码:
 function findNum(a) {
      var result = [0, 0];
      for (var i = 0; i < a.length; i++) {
        for (var j = 0, count = 0; j < a.length; j++) {
          if (a[i] == a[j]) {
            ++count;
          };
        };
        if (count > result[0]) {
          result[0] = count;
          result[1] = a[i];
        } else if (count == result[0] && result[1] < a[i]) {
          result[1] = a[i];
        }

      }
      alert("数" + result[1] + "重复了最多次,为" + result[0]);
    }
    var arr = [2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 43, 3];
    findNum(arr);

11.实现一个有序数组的二分查找函数,对于一个给定的目标值,如果在数组中找到该元素,则返回其所在数组的索引,否则返回-1。 二分法查找的原理如下: (1)首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,返回元素在该数组的位置,则搜索过程结束,否则执行下一步; (2)如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作; (3)如果某一部数组为空,则表示找不到目标元素,返回-1. 如果用javascript写,可以被认为Number类型的数据,只做整数运算,并向下取整。 比如: var i = 1,j=2,k=5; var n = (i+j)/2 ==> n=1 var n = (i+k)/2 ==>n=3 var n= (j+k)/2 ==> n=3;

  function binarySearch(Numbers,target);
  
  Numbers = [1,20,34,38,55,90,200,256];
  binarySearch(Numbers,20)//返回 1;
  binarySearch(Numbers,89)//返回-1,表示未找到
  binarySearch(Numbers,55)//返回4

代码如下:

var search = function(nums, target) {
    if(nums[0]==target) return 0
    var lo=0,hi=nums.length-1
    while(lo<hi){
        var mid=Math.ceil((lo+hi)/2)
        if(nums[mid]==target){
            return mid
        }else if(nums[mid]>target){
            hi=mid-1;
        }else{
            lo=mid
        }
    }
    return -1
};
//方法二:
var search = function(nums, target) {
    if(nums[0]==target) return 0
    var lo=0,hi=nums.length-1
    while(lo<=hi){
        var mid=Math.ceil((lo+hi)/2)
        if(nums[mid]==target){
            return mid
        }else if(nums[mid]>target){
            hi=mid-1;
        }else{
            lo=mid+1
        }
    }
    return -1
};

原文链接:blog.csdn.net/sphinx1122/…