昨天参加了某大厂前端工程师一面,整体面下来感觉偏简单。面试官一脸严肃,搞得我也有点紧张, 面试官,你不那么严肃能死啊!😒

先从问答题开始

1、 说一下const和let的区别

声明方式变量提升作用域初始值重复定义
const块级作用域需要不允许
let块级作用域不需要允许
var函数级作用域不需要允许

变量提升

  • const和let不存在变量提升,var存在变量提升
  • 使用let和const定义全局变量不再设置为顶层对象(window)的属性,有效避免全局变量污染

初始值

  • cosnt定义变量必须给初始值,且不能重复赋值

2、 一个http请求主要包括哪些部分

HTTP请求主要包括:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成

http请求

请求行(request line)

如图所示,请求行包括请求方法,URL,协议版本。请求方法主要有:GET、POST、PUT、DELETE、OPTIONS、HEAD等。协议版本有1.0,1.1,2.0等。

请求头

请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

  • User-Agent:产生请求的浏览器类型。
  • Accept:客户端可识别的内容类型列表。
  • Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
    当然除了这些数据之外还有回车符和换行符

请求体

根据应用场景的不同,HTTP请求的请求体有三种不同的形式

  • 任意类型
  • 文件分割
  • Encoding:编码

HTTPS交互过程

由于http无状态的明文协议,所以很容易被人截取后篡改,为了解决http的安全问题,出现了https协议。https是一种加密的超文本传输协议,http和https都是处于tcp协议之上,https相对于http增加了一层SSL/TLS安全层传输协议以实现加密通道。

1. 初始化过程

服务端需要先申请证书并保存公私钥,然后需要把公钥、国家、城市、域名、签名算法等信息发给CA机构。
CA机构会把传过来的公钥加密,用客户端的私钥加密服务端的公钥,并生成证书存储到浏览器。

2. 交互过程

客户端发起请求

  1. 三次握手建立TCP连接
  2. 支持的协议版本
  3. 生成随机数用于生成对话秘钥
  4. 客户端支持的算法
  5. sessionID

服务端收到请求然后响应

  1. 确认加密通道协议版本
  2. 服务端生成随机数
  3. 确认使用的加密算
  4. 响应服务器证书

客户端收到证书并进行验证

  1. 验证证书是否为CA颁发
  2. 验证证书是否有效
  3. 验证通过后会生成随机数并发送给服务器

服务端接收随机数

  1. 服务端收到加密数据后,会用私钥对密文进行解密,并对比是否符合预期
  2. 然后发送加密数据给客户端

客户端接收消息

  1. 客户端验证加密数据是否与预期一致,一致则没收过程结束
  2. 之后所有通信过程将使用生成的对称秘钥。

算法题1: 求最长非重复子串

先来一个笨方法,时间复杂度为o(n方)
function longestUniqueSub(str) {
  const len = str.length;
  let result = "";
  for (let i = len - 1; i >= 0; i--) {
    for (let j = i; j < len; j++) {
      const subLen = [...new Set(str.slice(i, j + 1))].length;
      if (subLen === j - i + 1) {
        result = subLen > result.length ? str.slice(i, j + 1) : result;
      }
    }
  }
  return result;
}
再来一个比较高端的方法,时间复杂度为o(n)
function longestSubStr(str) {
  const strArr = [];
  let result = "";
  for (let i = 0; i < str.length; i++) {
    if (strArr.indexOf(str[i]) === -1) {
      strArr.push(str[i]);
    } else {
      strArr.splice(0, strArr.indexOf(str[i]) + 1);
    }
    result = strArr.length > result.length ? strArr.join("") : result;
  }
  return result;
}

算法题2: leetCode第一道题:两数之和

这道题实现起来很简单,主要考察的是如何提高代码执行的效率。
同样是有o(n方)和o(n)两种时间复杂度的算法,这里仅提供时间复杂度为o(n)的实现算法
function twoSum(arr, target) {
  const map = new Map();
  for (let i = 0; i < arr.length; i++) {
    const subValue = target - arr[i];
    if (map.has(subValue)) {
      return [map.get(subValue), i];
    } else {
      map.set(arr[i], i);
    }
  }
}

参考链接

  1. Https:深入浅出HTTPS的交互过程。
  2. 菜鸟教程-http消息结构
  3. JavaScript ES6中const、let与var的对比详解

不羁的风
35 声望4 粉丝

天下事有难易乎? 为者,则难者亦易已;不为,则易者亦难矣!