http与https的区别
什么是HTTP?
互联网应用最广泛的网络协议
作用:浏览器和服务器之间传输文档
什么是HTTPS?
是以安全为目标的HTTP通道
安全版的的HTTP
HTTPS = HTTP + SSL层
作用:1建立信息安全通道,保证传输安全2确认网站的真实性
区别:
1 https需要到ca申请证书(免费证书少,需要一定费用)
2 信息传输方式不同:
http是超文本传输协议,信息明文传输
https具有安全性的SSL加密传输协议
3 默认端口不同:
http:80;https:443
(什么是默认端口:
是web服务默认的端口
比如我们访问http://www.baidu.com的时候,
实际上是访问http://www.baidu.com:80 是一个标准,与浏览器无关,是服务器端的配置 )
4连接方式不同:
http:无状态的简单连接
https: 由http协议+SSL构建 可进行加密传输、身份认证的协议
变量提升与函数提升
变量提升
将 变量声明 提升到它所在作用域最开始的部分
a = 7; //初始化
console.log(a); //输出7
var a // 变量声明
*只提升变量声明,不会提升变量赋值
函数提升
将整个函数提升到最开始的部分
*只有函数声明才能够被提升,函数字面量不会进行函数提升
变量提升与函数提升的优先级:
函数提升 > 变量提升
且函数提升不会被变量声明覆盖,但是会被字面量赋值后覆盖
从输入url到页面呈现发生了什么?
整体流程
1.浏览器根据url查询ip
2.建立TCP连接
3.发送HTTP请求
4.服务器处理并返回http报文
5.浏览器解析渲染页面
6.关闭连接
浏览器根据url查询ip
DNS的定义:
域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。
--维基百科
- 1.浏览器查询自己的DNS缓存
- 2.查询操作系统中的DNS缓存(存储在系统运行内存中的缓存)
- 3.查询操作系统的hosts文件(存储在本地硬盘中的hosts文件)
- 4.查询路由器缓存(部分路由器会将访问过的域名缓存)
- 5.查询ISP DNS缓存(互联网服务提供商)
- 6.操作系统将域名发送到本地域名服务器(LDNS)进行DNS解析:
DNS解析就是查询当前url需要的资源在哪台机器上的过程
DNS解析实现了url->ip地址的转换
DNS解析是一个递归查询的过程
ex:www.baidu.com.
逐级查询,首先在本地域名服务器查询ip地址 ,如果没有
-> 本地服务器向.根域名服务器发送请求 , 如果没有
-> 本地服务器向com顶级域名服务器发送请求 , 如果没有
-> 本地服务器向baidu.com域名服务器发送请求 ->获取ip返回本地域名服务器
网址的解析是从右到左的过程:.->com->baidu.com->www.baidu.com
ps:
理论上所有域名查询都必须先查询根域名
关于根域名查询:.com .net .cn等顶级域名由不同机构管理,通过询问根域名列表可以得知某顶级域名由谁托管,从而继续进行查询。
根域名列表很少变化,大多数DNS服务商都会提供缓存
参考文档
建立TCP连接
发送HTTP请求
构建HTTP请求报文并通过tcp协议发送到服务器指定端口
http请求报文 = 请求行 + 请求头 + 空行 + 请求主体
- 请求行:
= 请求方法 + 请求路径 + 协议版本 (method + request-url + http-version) - 请求头:
一般以键值成对存在,包含了请求的附加信息(如声明浏览器语言,请求正文长度等) - 空行:
协议中规定请求头和请求主体间必须用一个空行隔开 - 请求主体:
对于post请求,所需要的参数都不会放在url中,这时候就需要一个载体了,这个载体就是请求主题。
服务器处理请求并返回http报文
服务器指定端口收到请求后,根据url匹配到的路径做相应的处理,最后返回浏览器需要的资源。
浏览器会接收到一个响应报文,而所需要的资源就就在报文主体上。
响应报文 = 响应行 + 响应头 + 空行 + 响应主体
响应行:
同样包含了协议版本,同时包含的还有状态码和状态码的原因短语
浏览器解析渲染页面
手撕柯里化
add(x,y) {
return x + y;
}
function curry(fn) {
var outerargs=Array.prototype.slice.call(arguments,1);
var outerargs = [...arguments];
return function(){
var innerargs=Array.prototype.slice.call(arguments);
var finalargs=outerargs.concat(innerargs);
fn.apply(null,finalargs)
console.log(fn.arguments);
}
}
var cur1 = curry(add, 8);
console.log(cur1(6)); //14
手撕函数节流防抖
目的:在不影响用户体验的前提下,将频繁出发的回调函数进行次数缩减,避免大量计算导致的页面卡顿
防抖
将多次执行变为最后一次执行
通俗理解:公交车,不断有人上车就不开车,一旦五分钟内都没有人再上车,就开车
应用场景:
频繁触发的事件且用户只关心最后一次操作所返回的结果
如:搜索联想,在用户不停输入时可用防抖节约资源
用户疯狂点击某个按钮,如点赞等 只生效最后一次即可
代码
window.onsize = () => fangdou();
var fangdou = debounce(func, 3000);
function debounce(func, timeout) { //要防抖的函数 延迟时间
var timeout;
return function() {
clearTimeout(timeout);
timeout = setTimeout(()=>{
func.apply(this,arguments);
}, timeout)
}
}
节流
什么是节流?
将多次执行变为规定时间内只执行一次
通俗理解:公交车,五分钟发车一次
应用场景:
懒加载要监听计算滚动条的位置,使用节流按一定时间的频率获取。
用户点击提交按钮,假设我们知道接口大致的返回时间的情况下,我们使用节流,只允许一定时间内点击一次。
代码
window.onresize =()=> jieliu();
var jieliu = throttle(func,3000);
function throttle(func, timeout) {
var doSomething = true;
return function() {
if(!doSomething)
return;
doSomething = false;
setTimeout(() => {
func.apply(this,arguments);
doSomething = true;
}, timeout);
};
}
跨域问题
什么是跨域?
浏览器的同源策略导致-> 不能执行其他网站的脚本 -> 产生跨域问题
同源策略
是浏览器对JavaScript施加的安全限制
同源是指, 域名, 协议, 端口相同。
域名的组成
http://www.baidu.com :80 /dir/other.html ? xxxxx
协议 主机名 端口 文件路径 参数
跨域的方法
1.Jsonp
Jsonp是一种非正式传输协议
Jsonp = json + padding
利用