练习时长两年半的前端练习生的被暴打日记

211 阅读3分钟

前言

开年第一场篮球赛,目的是想看看自己当前的能力水平,结局不甚理想,但是收获颇丰。

整场面试基于四道手撕展开,没有八股文,完全暴露了自己的基础还有很大的提升空间。

PS: 面试前背了好多八股文都没用上 QAQ

手撕

1.版本号比较

问题:实现一个方法,用于比较两个版本号(version1、version2

如果version1 > version2,返回1;如果version1 < version2,返回-1,其他情况返回0

示例:
compareVersion('0.1', '1.1.1'); // 返回-1
compareVersion('13.37', '1.2 '); // 返回1
compareVersion('1.1', '1.1.0'); // 返回0

思路暴力破解并补全

const compareVersion = (version1, version2) => {
  let v1 = version1.trim().split('.');
  let v2 = version2.trim().split('.');

  let len = Math.max(v1.length, v2.length);
  while (v1.length < len) {
    v1.push('0');
  }

  while (v2.length < len) {
    v2.push('0');
  }

  for (let i = 0; i < len; i++) {
    const num1 = parseInt(v1[i]);
    const num2 = parseInt(v2[i]);

    if (num1 > num2) {
      return 1;
    } else if (num1 < num2) {
      return -1;
    }
  }
  return 0;
}

面试官提问:代码中两个while的目的是什么,如果要你优化这段代码怎么做,提高代码可读性?

一开始其实没反应过来,后来在面试官的引导下思考出,pareseInt中做优化

    const num1 = parseInt(v1[i] || '0');
    const num2 = parseInt(v2[i] || '0');

2.动态插入JS

问题:在head标签最下面插入动态插入一段JS代码,原生JS写法是怎么写的

比较简单的JS基础问题

const head = document.getElementsByTagName('head');

const scrpit = document.createElement('script');

// script 相关具体内容
// ...

head[0].appendChild(scrpit);

面试官:浏览器渲染过程中遇到srcipt标签会怎样,如果在script中有获取dom的操作会怎么样,该怎么解决。

浏览器解析文档时,默认按照排列顺序由上向下解析,当遇到script标签时,和其他标签元素一样,会先解析该script,解析完成后再继续向下走完成剩余文档的解析和渲染。也就是说默认情况下,script脚本会阻塞文档的解析渲染

如果在script中,如果执行获取head之后的dom元素,由于dom还未完成渲染,会导致获取不到以至于报错,并阻塞渲染,以至于页面无法展现。

解决方法:script标签有两个属性,一个是defer,即延迟;二是aync,即异步,这两个属性都可以改变脚本的加载执行方式。

3.对象一致

问题:用原生的js编写比较两个“js对象”是否一致,(深度比较,例如:a = {x:1}和b = {x:1},a和b一致

循环递归

const equals = (a, b) => {
  let arrayA = Object.getOwnPropertyNames(a);
  let arrayB = Object.getOwnPropertyNames(b);

  // 长度判断
  if (arrayA.length !== arrayB.length) {
    return false;
  }

  for (let i = 0; i < arrayA.length; i++) {
    let nameA = arrayA[i];
    let nameB = arrayB[i];

    if (!a.hasOwnProperty(nameB)) {
      return false;
    }

    // 递归判断
    if (a instanceof Object) {
      if (!equals(a[nameA], b[nameB])) {
        return false;
      }
    } else {
      if (a[nameA] !== b[nameB]) {
        return false
      }
    }
  }

  return true
}

面试官:一开始你写了JSON.stringify,这个可以吗,有什么问题?

自己一开始其实是写了JSON.stringify 可以做到,但是题目要求深度比较,于是想到了如果定义对象时key的顺序变化,其实转JSON之后是不一致的,所以还是得循环递归。

4.算法题

问题:找到字符串中单个字符最长的连续循环次数。比如QWERXXXAX => 3

算法菜鸟,思路就是暴力

// 获取从 i起的最长连续
const getImax = (strs, str, strat, len) => {
  let size = 0;
  for (let i = strat; i < len; i++) {
    if (strs[i] == str ) {
      size++
    } else {
        // 当时紧张此处漏掉了,导致结果不是连续最长
        return size
    }
  }
  return size;
}

const getMax = (strs) => {
    let maxCount = 0;
    if (!strs) {
      return 0;
    }
    for (let i = 0; i < strs.length; i++) {
      if (maxCount >= strs.length - 1) {
        return maxCount;
      }
      let max = getImax(strs, strs[i], i, strs.length); 
      maxCount = Math.max(max, maxCount);
      i += max > 0 ? max - 1 : 0;
    }
    return maxCount;
  }
  

整体写题写了快四十分钟,面试官对每道题都做出了提问以及引导,人真的非常nice,因为没办法run,所以基本上也都是写完凭感觉,基于题目中涉及到的点,以及我在写题过程中的点,进行了提问,大概聊了二十种。

简历提问

介绍一下自己的工作内容,以及一些项目经历,整体聊了十多分钟吧,最后就相互闲聊了一些,面试官给了很好的建议,包括自己的简历,包括如何提高自己在业务中去沉底自己的深度。

总得来说道阻且长,难度一般,但是自己的表现并不够好,再接再厉吧~

最后用一段自己喜欢的话勉励一下自己吧

光阴者百代之过客也,唯有奋力奔跑,方能生逢其时,是时代造英雄,英雄存在于时代

ENDING