乐趣区

关于前端:某大厂前端工程师一面面试题整理三年

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

先从问答题开始

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);
    }
  }
}
退出移动版