昨天加入了某大厂前端工程师一面,整体面下来感觉偏简略。面试官一脸庄重,搞得我也有点缓和, 面试官,你不那么庄重能死啊!

先从问答题开始

1、 说一下const和let的区别

申明形式变量晋升作用域初始值反复定义
const块级作用域须要不容许
let块级作用域不须要容许
var函数级作用域不须要容许

变量晋升

  • const和let不存在变量晋升,var存在变量晋升
  • 应用let和const定义全局变量不再设置为顶层对象(window)的属性,无效防止全局变量净化

初始值

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

2、 一个http申请次要包含哪些局部

HTTP申请次要包含:申请行(request line)、申请头部(header)、空行和申请数据四个局部组成

申请行(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);    }  }}