JS核心面试题(obsoleted)
@HTTP协议相关
URL回车后发生什么?
- URL解析: 协议段 + 域名/IP段 + 端口段(HTTP协议默认端口80/HTTPS协议默认端口443)+ 路径段 + 查询参数段 + 哈希段;浏览器执行URL解析;
- DNS查询:域名映射为IP+端口;IP=宇宙中的唯一主机(host);端口=该主机上的唯一进程(应用程序);
- TCP连接:宗旨稳定连接+可靠传输;三次握手实现稳定连接;四次挥手实现可靠传输;稳定连接=服客双方确保彼此能发能收;可靠传输=服客双方确保对方数据发送完毕才能断开连接;三次挥手图形=客户端出发的N字形;四次挥手=客户端出发的V字形+服务端出发的V字形;
- HTTP请求发送:请求报文的构成=请求行+请求头+空行+请求体;
- HTTP响应返回:响应报文的构成=状态行+响应头+响应体;
- TCP连接断开:要经历四次挥手;
- 浏览器渲染页面:要会画渲染示意图;
简述TCP原理
- 宗旨稳定连接+可靠传输;
- 三次握手实现稳定连接;
- 四次挥手实现可靠传输;
- 稳定连接=服客双方确保彼此能发能收;
- 可靠传输=服客双方确保对方数据发送完毕才能断开连接;
- 三次挥手图形=客户端出发的N字形;
- 四次挥手=客户端出发的V字形+服务端出发的V字形;
- PS:一蹴而就原则:三次握手和四次挥手都必须一次性完成,否则作废重来;
- PS:UDP=没有握手加挥手=连接+收发+断开=注重性能;
- PS:TCP/UDP工作在OSI七层网络模型的传输层;
- PS:OSI七层网络模型=物数网(IP)传(TCP/UDP)会表应(HTTP/FTP/SMTP)
GET请求与POST请求异同
- 数据携带方式:GET只能是查询参数;POST/PUT/PATCH还可以请求体携带数据;
- 数据量:查询参数K级别;请求体携带数据量理论上无限;
- 安全性:查询参数(完全暴露)不能携带敏感数据;请求体中的数据相对安全;
- 安全性:HTTPS协议接近绝对安全;HTTPS协议的通信数据全部使用加密;
- PS: HTTPS协议使用非对称加密; 服务器持有公钥(网站证书),客户端给服务器发送的数据使用该公钥加密;服务端用自己配对的私钥解密;
HTTP常见的状态码有哪些?
什么是事件委托
- 概念:子元素委托事件给父元素去处理;
- 好处:节约内存+方便管理+防内存泄漏;
- 节约内存:事件监听器的数量少;
- 方便管理:无需考虑子元素动态增减时事件监听器的动态增减问题;
- 防内存泄露:子元素被删除时无需删除其对应的事件监听器;
- PS:追问=哪些情形会造成内存泄露?
ES6有哪些新特性?
变量层面:
- let:var弊病=变量提升+重复声明+作用域穿透;
- const:通常将不希望修改地址的对象声明为常量;
数据结构层面
- 数组:解构+展开;
- 对象:解构+展开+简写;
- 字符串:模板字符串;
- Map:方便增删改产的键值对存储器;
- Set: 有序且不重复的元素集;
函数层面
- 箭头函数:this从父级作用域继承;
- PS:this的可能情形;
类层面
- class系列语法:class(构造函数+原型属性) + constructor(构造函数) + static静态成员 + super调用父类方法;super(name)调用父类构造器; super.xxx()调用父类实例方法;
请说出10个请求头
请说出10个响应头
@JS基础
什么是深拷贝/浅拷贝
什么是值传递/引用传递
this的所有可能情形
- 普通函数的this就是调用者;(显式主语+无主语时为window+DOM事件监听器的主语恒为事件源e.currentTarget)
- 箭头函数的this从父级作用域继承;
- 普通函数可以通过 fn.call/apply/bind 绑定this
- 构造器里的this为正在构建的实例
- 实例方法中的this为当前实例
- 静态方法中的this为当前类
谈谈对事件传播/派发机制的理解
画出浏览器渲染示意图
内存泄露的可能情形有哪些?
- 用完的事件监听器:DOM元素删除时忘记删除其事件监听器;
- 用完的事件监听器:离开页面时没有释放各种事件监听器;(div.onclick=null,div.removeEventListener...)
- 用完的定时器:定时器用完没有clear;
- 用完的全局变量:用完没释放的全局变量(obj=null)
- 用完的闭包:用完未释放的闭包(innerFn = null)
- 总结:【用毕未释放】的【事件监听器】+【定时器】+【全局变量】+【闭包】;
谈谈对闭包的理解