昨天加入了某大厂前端工程师一面,整体面下来感觉偏简略。面试官一脸庄重,搞得我也有点缓和,面试官,你不那么庄重能死啊!😒
先从问答题开始
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);
}
}
}