前言
我是歌谣 最好的种树是十年前 其次是现在 微信公众号关注前端小歌谣带你进入氛围极好的前端巅峰人才交流群
url参数解析成一个对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var url="geyao?key0=0&key1=1&key2=2&key3=3"
function parseQueryString(url){
var str=url.split("?")[1]
var items=str.split("&")
var result=[]
var arr=[]
for(var i=0;i<items.length;i++){
arr=items[i].split("=")
result[arr[0]]=arr[1]
}
return result
}
var obj=parseQueryString(url)
console.log(obj,"obj")
//[key0: '0', key1: '1', key2: '2', key3: '3'] 'obj'
</script>
</body>
</html>
weakMap
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>WeakMap</title>
</head>
<body>
<script>
//WeakMap 对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。
//WeakMap 的 key 只能是 Object 类型。 原始数据类型 是不能作为 key 的(比如 Symbol)
const wm1 = new WeakMap(),
wm2 = new WeakMap(),
wm3 = new WeakMap()
const o1 = {},
o2 = function () {},
o3 = window
wm1.set(o1, 37)
wm1.set(o2, 'azerty')
wm2.set(o1, o2) // value可以是任意值,包括一个对象或一个函数
wm2.set(o3, undefined)
wm2.set(wm1, wm2) // 键和值可以是任意对象,甚至另外一个WeakMap对象
wm1.get(o2) // "azerty"
wm2.get(o2) // undefined,wm2中没有o2这个键
wm2.get(o3) // undefined,值就是undefined
wm1.has(o2) // true
wm2.has(o2) // false
wm2.has(o3) // true (即使值是undefined)
wm3.set(o1, 37)
wm3.get(o1) // 37
wm1.has(o1) // true
wm1.delete(o1)
wm1.has(o1) // false
</script>
</body>
</html>
weakMap的应用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>weakMap</title>
</head>
<body>
<script>
//ES6语法 利用weakMap避免内存泄露
const oBtn1 = document.querySelector('#btn1');
const oBtn2 = document.querySelector('#btn2');
const oBtnMap = new WeakMap();
//弱引用
oBtnMap.set(oBtn1, handleBtn1Click);
oBtnMap.set(oBtn2, handleBtn2Click);
oBtn1.addEventListener('click', oBtnMap.get(oBtn1), false);
oBtn2.addEventListener('click', oBtnMap.get(oBtn2), false);
function handleBtn1Click() {}
function handleBtn2Click() {}
oBtn1.remove();
oBtn2.remove();
</script>
</body>
</html>
webpackload和plugin区别
loader: loader从字面的意思理解,是 加载 的意思。 由于webpack 本身只能打包commonjs规范的js文件,所以,针对css,图片等格式的文件没法打包,就需要引入第三方的模块进行打包。 loader虽然是扩展了 webpack ,但是它只专注于转化文件(transform)这一个领域,完成压缩,打包,语言翻译。loader是运行在NodeJS中。 仅仅只是为了打包,仅仅只是为了打包,仅仅只是为了打包,重要的话说三遍! 如:css-loader和style-loader模块是为了打包css的 babel-loader和babel-core模块时为了把ES6的代码转成ES5 url-loader和file-loader是把图片进行打包的。 plugin是做什么的 plugin完成的是loader不能完成的功能,这是废话,没有说清楚。 plugin也是为了扩展webpack的功能,但是 plugin 是作用于webpack本身上的。而且plugin不仅只局限在打包, 资源的加载上,它的功能要更加丰富。从打包优化和压缩,到重新定义环境变量,功能强大到可以用来处理各种各样的任务。webpack提供了很多开箱即用的插件: CommonChunkPlugin主要用于提取第三方库和公共模块,避免首屏加载的bundle文件,或者按需加载的bundle文件体积过大,导致加载时间过长,是一把优化的利器。而在多页面应用中, 更是能够为每个页面间的应用程序共享代码创建bundle。 插件可以携带参数,所以在plugins属性传入new实例。
三次握手
第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN(c)。此时客户端处于 SYN_SEND 状态。 首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号。 第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s)。同时会把客户端的 ISN + 1 作为ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_RCVD 的状态。 在确认报文段中SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y。 第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时,双方已建立起了连接。 确认报文段ACK=1,确认号ack=y+1,序号seq=x+1(初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号
不使用代理模式预加载图片
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>不使用代理模式预加载图片</title>
</head>
<body>
<script>
// 不使用代理的预加载图片函数如下
var myImage = (function () {
var imgNode = document.createElement("img");
console.log(imgNode,"imgNode")
document.body.appendChild(imgNode);
var img = new Image();
console.log(img,"img")
img.onload = function () {
imgNode.src = this.src;
};
return {
setSrc: function (src) {
console.log(imgNode,"imgNodetest")
imgNode.src = "http://img.lanrentuku.com/img/allimg/1212/5-121204193Q9-50.gif";
img.src = src;
}
}
})();
// 调用方式
myImage.setSrc("https://img.alicdn.com/tps/i4/TB1b_neLXXXXXcoXFXXc8PZ9XXX-130-200.png");
</script>
</body>
</html>
事件冒泡
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>事件冒泡</title>
</head>
<body>
<!-- 开始时由最具体的元素接收,然后逐级向上传播到到 DOM 最顶层节点。 -->
<div class="father">
<div class="son">son</div>
</div>
<script>
// 常见事件对象的属性和方法
// 阻止冒泡 dom 推荐的标准 stopPropagation()
var son = document.querySelector('.son')
son.addEventListener(
'click',
function (e) {
console.log('son')
e.stopPropagation() // stop 停止 Propagation 传播
e.cancelBubble = true // 非标准 cancel 取消 bubble 泡泡
},
false
)
var father = document.querySelector('.father')
father.addEventListener(
'click',
function () {
console.log('father')
},
false
)
document.addEventListener('click', function () {
console.log('document')
})
//只打印出son
</script>
</body>
</html>
总结
标签:function,知识点,记录,wm2,报文,SYN,loader,React,var From: https://blog.51cto.com/u_14476028/6445808我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣学习前端知识