<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[echomsy的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/echomsy</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; echomsy]]></copyright><item><title><![CDATA[Koa 洋葱模型]]></title><link>https://blog.csdn.net/echomsy/article/details/121605243</link><guid>https://blog.csdn.net/echomsy/article/details/121605243</guid><author>echomsy</author><pubDate>Mon, 29 Nov 2021 11:11:56 +0800</pubDate><description><![CDATA[Koa 洋葱模型
提到 Node.js，就不得不提目前炙手可热的两大框架 Express 和 Koa，他俩都是 NodeJs 的主流开发框架。
Express 和 Koa：
Express是基于 Node.js 平台，快速、开放、极简的 Web 开发框架。
Koa 是一个新的 web 框架，由 Express 幕后的原班人马打造， 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数，Koa 帮你丢弃回调函数，并有力地增强错误处理。 Koa 并没]]></description><category></category></item><item><title><![CDATA[字节前端面经]]></title><link>https://blog.csdn.net/echomsy/article/details/120440279</link><guid>https://blog.csdn.net/echomsy/article/details/120440279</guid><author>echomsy</author><pubDate>Thu, 23 Sep 2021 18:04:19 +0800</pubDate><description><![CDATA[一面：


IPV4 和 IPV6 区别


IPV4的形式，IPV6的形式


Http2.0与Http1.0的区别


把 1px 缩放为 0.5px


让元素在页面不显示的方法


开启BFC的方法，BFC的特性


输入URL之后发生了什么


前端攻击 XSS


跨域


this指向问题


js为什么是单线程的，为什么这么设计


各种类型转换， [] == 0  [] == {}   [] == (![]) 的结果


进程间通信方法


进程和线程区别


cdn是什么，为什么能加速
]]></description><category></category></item><item><title><![CDATA[JS继承的四种方式]]></title><link>https://blog.csdn.net/echomsy/article/details/108336565</link><guid>https://blog.csdn.net/echomsy/article/details/108336565</guid><author>echomsy</author><pubDate>Tue, 01 Sep 2020 11:51:20 +0800</pubDate><description><![CDATA[继承是面向对象语言中的一个最为人津津乐道的概念。许多面向对象语言都支持继承，JS没有明确的继承机制，而是通过模拟实现的。由于JS语言的灵活性，有下列几种方式可以实现继承：
1. 使用对象冒充实现继承
// 父构造函数
function Parent(name, age) {
    this.name = name;
    this.age = age;
    this.say = function() {
        console.log("my name is " + this.name + ]]></description><category></category></item><item><title><![CDATA[JS原型和原型链，使用原型链实现继承]]></title><link>https://blog.csdn.net/echomsy/article/details/107566574</link><guid>https://blog.csdn.net/echomsy/article/details/107566574</guid><author>echomsy</author><pubDate>Fri, 24 Jul 2020 21:19:45 +0800</pubDate><description><![CDATA[1.为什么要设计JS原型呢？
知道设计者“为什么这样做”远比“怎么做的”重要。
这一个问题我是通过看阮一峰老师的随笔所了解清楚的，有兴趣的可以看一下——Javascript继承机制的设计思想
以下我整理了阮一峰老师的理解：
如果单纯使用new 构造函数生成对象的话，有一个很明显的缺点，即属性和方法不能共享，且浪费大量的内存。
function Star(uname, age) {
  this.uname = uname;
  this.age = age;
  this.sing = function()]]></description><category></category></item><item><title><![CDATA[Flex布局详解]]></title><link>https://blog.csdn.net/echomsy/article/details/107434113</link><guid>https://blog.csdn.net/echomsy/article/details/107434113</guid><author>echomsy</author><pubDate>Sun, 19 Jul 2020 14:50:26 +0800</pubDate><description><![CDATA[1. 认识flex布局
flex布局，也叫做弹性布局，是目前web开发中使用最多的布局方案。
任何元素都可以指定为flex布局

行内元素开启flex布局

.box {
	display: inline-flex;
}


块级元素开启flex布局

.box {
	display: flex;
}

如果是Webkit内核的浏览器，需要加上-webkit前缀。
2. flex布局的重要概念

flex container：开启flex布局的元素叫做容器(flex container)
flex item]]></description><category></category></item><item><title><![CDATA[JS 排序算法详解（冒泡排序，选择排序，插入排序，希尔排序，快速排序）]]></title><link>https://blog.csdn.net/echomsy/article/details/107246506</link><guid>https://blog.csdn.net/echomsy/article/details/107246506</guid><author>echomsy</author><pubDate>Sat, 18 Jul 2020 18:59:34 +0800</pubDate><description><![CDATA[JS 排序算法
一、	大O表示法
在进行排序算法之前，我们得先掌握一种对算法效率的表示方法，大O表示法。
我们使用大O表示法来表示算法的时间复杂度，是用来表示算法的速度随着数据量的变化而如何变化的。
常见的大O表示函数：

O(1)：常数的
O(log n)：对数的
O(n)：线性的
O(n*log(n))：线性和对数乘积
O(n^2)：平方
O(2^n)：指数

推导大O表示法的方式：

用 常量1取代运行时间中所有的加法常量
在修改后的运行次数函数中，只保留最高阶项
如果最高存在且不为1，则去除与这个项]]></description><category></category></item><item><title><![CDATA[JS数据结构（10）—— 二叉搜索树的实现]]></title><link>https://blog.csdn.net/echomsy/article/details/107212093</link><guid>https://blog.csdn.net/echomsy/article/details/107212093</guid><author>echomsy</author><pubDate>Thu, 09 Jul 2020 13:48:05 +0800</pubDate><description><![CDATA[JS数据结构（10）—— 二叉搜索树
1.二叉搜索树(BST,Binary Search Tree)是什么？
想要知道什么是二叉搜索树，先得了解什么是树结构，什么是二叉树，可以在我的另外一篇博客   树结构，二叉树     来了解。
二叉搜索树，也叫二叉查找树或二叉排序树。
二叉搜索树的特性：

非空左子树的所有键值小于其根节点的键值。
非空右子树的所有键值大于其根节点的键值。
左、右子树本身也是二叉搜索树。

二叉搜索树的特点就是相对较小的值总是保存在左节点上，相对较大的值总是保存在右节点上。
基于这个特]]></description><category></category></item><item><title><![CDATA[JS数据结构（9）—— 树结构，二叉树]]></title><link>https://blog.csdn.net/echomsy/article/details/107209990</link><guid>https://blog.csdn.net/echomsy/article/details/107209990</guid><author>echomsy</author><pubDate>Wed, 08 Jul 2020 18:12:36 +0800</pubDate><description><![CDATA[JS数据结构（9）—— 树结构
1.什么是树结构
树结构是一种非线性结构，以分层的方式存储数据。
现实中关于树结构的例子有家谱，还有公司的组织架构等。
树结构的抽象：

树结构的优点：
每种数据结构都有自己特定的应用场景，树结合了其他数据结构（数组，链表，哈希表）的优点。在模拟某些场景时，我们使用树结构会更加的方便。
因为树结构是非线性的，可以表示一对多的关系，我们可以使用树表示文件的目录结构。
2.树结构的术语
树（Tree）：n(n&gt;=0)个节点构成的有限集合。
空树：n = 0 时，就称为一个空]]></description><category></category></item><item><title><![CDATA[JS数据结构（8）—— 哈希表]]></title><link>https://blog.csdn.net/echomsy/article/details/107184678</link><guid>https://blog.csdn.net/echomsy/article/details/107184678</guid><author>echomsy</author><pubDate>Wed, 08 Jul 2020 11:30:34 +0800</pubDate><description><![CDATA[JS数据结构（8）—— 哈希表
1.什么是哈希表？
哈希表的复杂之处，就是它不好理解。它的结构就是数组，但是它神奇的地方在于对下标值的一种变换，这种变换我们可以称之为哈希函数，通过哈希函数可以获取到HashCode。
哈希表是一种存储键值对的数据结构，是基于数组来实现的，哈希表内部是使用一个哈希函数把值转换成一个数字，而这个数字作为键值对的key，通过这个key来完成查询，插入，修改等操作。
2.哈希表的一些概念
哈希化：将大数字转化成数组范围内下标的过程。
哈希函数：通常我们会将单词转换成大数字以及大数字]]></description><category></category></item><item><title><![CDATA[JS数据结构（7）——集合  集合（添加，删除，清空等）和集合间操作（并集，交集，差集，子集）]]></title><link>https://blog.csdn.net/echomsy/article/details/107175512</link><guid>https://blog.csdn.net/echomsy/article/details/107175512</guid><author>echomsy</author><pubDate>Tue, 07 Jul 2020 11:44:10 +0800</pubDate><description><![CDATA[JS数据结构（7）——集合
1.什么是集合？
在ES6中提出了 set 这个数据结构，这也就是我们说的集合。
集合是由一组无序的、但不能重复的元素构成的。
我们可以把集合看成一个特殊的数组，特殊之处在于里面的元素，没有顺序，也不能重复。
没有顺序意味着不能通过下标值来进行访问，不能重复意味着相同的对象在集合中只会存在一份。
2.集合类的封装
代码思路：

在ES6中已经提出了 set 类，但是为了明确集合的内部实现机制，在这里我自己封装一个 Set 类。
在集合中，添加一个属性，用于保存之后添加到集合中的元]]></description><category></category></item><item><title><![CDATA[JS数据结构（6）——双向链表]]></title><link>https://blog.csdn.net/echomsy/article/details/107168383</link><guid>https://blog.csdn.net/echomsy/article/details/107168383</guid><author>echomsy</author><pubDate>Tue, 07 Jul 2020 00:52:36 +0800</pubDate><description><![CDATA[JS数据结构（6）——双向链表
1.什么是双向链表？
单向链表
要知道什么是双向链表，我们首先得了解单向链表。
单向链表的详细解释在这里：    JS单向链表
单向链表的特点：

只能从头遍历到尾
链表的连接过程是单向的
实现的原理是上一个链表结点中有一个指向下一个结点的next
单向链表的结构：

单向节点的缺点：
可以轻松到达下一个节点，但是回到前一个节点是非常困难的。

双向链表
双向链表的特点：

既可以从头遍历到尾，也可以从尾遍历到头
链表连接的过程时双向的
实现原理是一个链表结点，既有指向前一个]]></description><category></category></item><item><title><![CDATA[JS数据结构（5）——单向链表]]></title><link>https://blog.csdn.net/echomsy/article/details/106919921</link><guid>https://blog.csdn.net/echomsy/article/details/106919921</guid><author>echomsy</author><pubDate>Mon, 06 Jul 2020 21:16:54 +0800</pubDate><description><![CDATA[JS数据结构（5）——单向链表
链表和数组的区别：
数组的优缺点：

数组是最常用的数据结构，它用来存储多个元素。
几乎每一种编程语言中都有默认实现数组结构，并且有很多关于数组的操作方法。
数组的修改和查找操作，时间复杂度低。
数组的创建通常需要申请一段连续的内存空间，并且大小是固定的，所以当当前的数组不能满足容量需求的时候，就需要扩容（一般情况下会申请一个更大的数组，比如说原数组的2倍，然后将原数组中的元素再复制过去）,这对空间造成了大量浪费。
而且在数组开头或者中间插入数据的成本非常高，需要进行大量元素]]></description><category></category></item><item><title><![CDATA[JS数据结构（4）——优先级队列]]></title><link>https://blog.csdn.net/echomsy/article/details/106917973</link><guid>https://blog.csdn.net/echomsy/article/details/106917973</guid><author>echomsy</author><pubDate>Tue, 23 Jun 2020 11:37:03 +0800</pubDate><description><![CDATA[JS数据结构（4）——优先级队列
优先级队列（Priority Queue）：

普通的队列是插入一个元素，该元素会被放在队尾，必须等到该元素前面的所有元素都处理之后才会处理该元素。
但是优先级队列，在插入一个元素的时候要考虑该数据的优先级。
优先级队列，在插入一个元素的时候会先和其他数据的优先级进行比较，比较完成后，得到这个元素在队列中的正确的位置，然后入队。
优先级队列的其他操作，比如删除，查看队列长度等，和 普通的队列操作相同。

优先级队列的实现：


实现优先级队列相对于普通队列有两方面需要考虑：]]></description><category></category></item><item><title><![CDATA[JS数据结构（3）——队列]]></title><link>https://blog.csdn.net/echomsy/article/details/106873674</link><guid>https://blog.csdn.net/echomsy/article/details/106873674</guid><author>echomsy</author><pubDate>Sun, 21 Jun 2020 00:50:31 +0800</pubDate><description><![CDATA[JS数据结构（3）——队列


]]></description><category></category></item><item><title><![CDATA[JS数据结构（2）——栈]]></title><link>https://blog.csdn.net/echomsy/article/details/106872057</link><guid>https://blog.csdn.net/echomsy/article/details/106872057</guid><author>echomsy</author><pubDate>Sat, 20 Jun 2020 15:59:35 +0800</pubDate><description><![CDATA[JS数据结构（2）——栈
栈(stack)是一种** LIFO(Last-In-First-Out，后进先出）** 的数据结构。
它是一种受限的线性表，它的限制是仅允许在表的一端进行插入和删除运算，这一端就被称为栈顶，另外一端就是栈底。
向一个栈添加一个新元素叫做进栈、入栈或者压栈，它是把新元素放到栈顶元素的上面，成为新的栈顶元素。
从一个栈中删除元素叫做出栈或者退栈，它是把栈顶元素删除掉，使其相邻的元素成为新的栈顶元素。
创建栈
function Stack(){
  this.items = [];//]]></description><category></category></item><item><title><![CDATA[JS数据结构（1）——数组]]></title><link>https://blog.csdn.net/echomsy/article/details/106870521</link><guid>https://blog.csdn.net/echomsy/article/details/106870521</guid><author>echomsy</author><pubDate>Sat, 20 Jun 2020 13:51:58 +0800</pubDate><description><![CDATA[JS数据结构（1）——数组
数据结构就是 在计算机中，存储和组织数据的方式。
在编码中，我们会用到数据结构，其中数组是最简单的数据结构。
数组的创建

使用Array构造函数

var arr1 = new Array();  //创建空数组
var arr2 = new Array(1,2,3); //创建元素为1，2，3的数组
var arr3 = new Array(5);  //创建长度为5的数组

使用Array构造函数，需要使用new关键字。

使用方括号[]

var arr1 = [] ; ]]></description><category></category></item><item><title><![CDATA[JavaScript 正则表达式总结]]></title><link>https://blog.csdn.net/echomsy/article/details/106865815</link><guid>https://blog.csdn.net/echomsy/article/details/106865815</guid><author>echomsy</author><pubDate>Sat, 20 Jun 2020 00:39:44 +0800</pubDate><description><![CDATA[JS正则表达式
正则表达式就是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。
修饰符
修饰符用于执行区别大小写和全局匹配
i： 执行对大小写不敏感的匹配
g：执行全局匹配，查找从字符串开始到结束的所有匹配
gi：执行对大小写不敏感且全局匹配
m：执行多行匹配
方括号
方括号用于查找在某个范围内的字符
[abc]    查找abc中任意字符
[^abc]  查找除了abc以外的任意字符
[0-9] 查找任意0-9的数字
[a-z] 查找任意a-z的字符
[one|two|three] 查找]]></description><category></category></item><item><title><![CDATA[js构造函数的实例成员和静态成员]]></title><link>https://blog.csdn.net/echomsy/article/details/103426260</link><guid>https://blog.csdn.net/echomsy/article/details/103426260</guid><author>echomsy</author><pubDate>Fri, 06 Dec 2019 16:56:40 +0800</pubDate><description><![CDATA[js构造函数的实例成员和静态成员
构造函数是一种特殊的函数，主要用来初始化对象，也就是为对象成员（属性，方法）赋初始值。
Js的构造函数中可以添加一些成员，可以在构造函数本身上添加，也可以在构造函数内部的this 上添加，这两种添加方式所添加的就是静态成员和实例成员。
1.实例成员
实例成员就是在构造函数内部添加的成员，只能由实例化的对象来访问
function Star(uname,age){
...]]></description><category></category></item></channel></rss>