昨天参加了某大厂前端工程师一面,整体面下来感觉偏简单。面试官一脸严肃,搞得我也有点紧张, 面试官,你不那么严肃能死啊!😒
先从问答题开始
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. 交互过程
客户端发起请求
- 三次握手建立TCP连接
- 支持的协议版本
- 生成随机数用于生成对话秘钥
- 客户端支持的算法
- sessionID
服务端收到请求然后响应
- 确认加密通道协议版本
- 服务端生成随机数
- 确认使用的加密算
- 响应服务器证书
客户端收到证书并进行验证
- 验证证书是否为CA颁发
- 验证证书是否有效
- 验证通过后会生成随机数并发送给服务器
服务端接收随机数
- 服务端收到加密数据后,会用私钥对密文进行解密,并对比是否符合预期
- 然后发送加密数据给客户端
客户端接收消息
- 客户端验证加密数据是否与预期一致,一致则没收过程结束
- 之后所有通信过程将使用生成的对称秘钥。
算法题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);
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。