<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[kangyi158的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/kangyi158</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; kangyi158]]></copyright><item><title><![CDATA[模板转为js结构的loader]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/126773828</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/126773828</guid><author>kangyi158</author><pubDate>Fri, 09 Sep 2022 01:03:09 +0800</pubDate><description><![CDATA[。]]></description><category></category></item><item><title><![CDATA[虚拟DOM，diff]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/126098821</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/126098821</guid><author>kangyi158</author><pubDate>Mon, 01 Aug 2022 12:24:40 +0800</pubDate><description><![CDATA[。]]></description><category></category></item><item><title><![CDATA[7.30复盘]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/126080362</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/126080362</guid><author>kangyi158</author><pubDate>Sun, 31 Jul 2022 01:30:37 +0800</pubDate><description><![CDATA[复盘]]></description><category></category></item><item><title><![CDATA[TypeScript]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/122281657</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/122281657</guid><author>kangyi158</author><pubDate>Sun, 02 Jan 2022 22:14:26 +0800</pubDate><description><![CDATA[TypeScript通过TypeScript编译器或Babel转译为JavaScript代码，可运行在任何浏览器，任何操作系统。
ts的基本类型
string   number  boolean
使用 ：
let a:string='kang'
let b:number=1
let c:boolean=true

使用字面量来标注类型
let a: 11 | 12   //联合类型，此时的a只能是11或者12
a = 12

any 任意类型,any或者没有声明类型的变量都是任意类型
let name
le]]></description><category></category></item><item><title><![CDATA[webpack和node 相关]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/121581536</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/121581536</guid><author>kangyi158</author><pubDate>Sat, 27 Nov 2021 19:25:41 +0800</pubDate><description><![CDATA[对webpack的了解
静态模块打包工具
他会在内部构建一个依赖图，这个依赖图反应模块之间的依赖关系，
并生成一个或者多个bundle文件(打包生成的文件就是bundle)
webpack本身可以解析打包各种符合模块规范的JS代码
核心概念：
mode  模式（生产模式 开发模式）区别是压不压缩文件
entry  入口 打包开始的入口js文件
output 出口 在哪输出打包好的bundle
loader 加载器  loader让webpack可以用来处理除了js以外的文件格式，因为webpack他只能对于]]></description><category></category></item><item><title><![CDATA[计算机网络相关]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/121408910</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/121408910</guid><author>kangyi158</author><pubDate>Fri, 19 Nov 2021 00:15:04 +0800</pubDate><description><![CDATA[HTTP状态码304是多好还是少好
服务器为了提高网站访问速度，对之前访问的部分页面指定缓存机制，当客户端在此对这些页面进行请求，服务器会根据缓存内容判断页面与之前是否相同，若相同便直接返回304，此时客户端调用缓存内容，不必进行二次下载。状态码304算不上是一种错误，他是在客户端有缓存的情况下，服务器向客户端发出的一种响应
304不一定多了好
网络爬虫会通过一段时间内网站返回的状态码来判断网页的质量，如果304缓存多了，就会降低蜘蛛对网站的抓取频次。相反，如果网站更新频率快，长此以往，回访率就会多
产生3]]></description><category></category></item><item><title><![CDATA[Vue、React]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/121321537</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/121321537</guid><author>kangyi158</author><pubDate>Sun, 14 Nov 2021 22:46:27 +0800</pubDate><description><![CDATA[Vue双向数据绑定
vue是通过数据劫持和发布订阅者模式来实现双向数据绑定的
就是利用oberver来监听module数据的变化，通过compile来解析模板，最终通过watcher来建立oberver和module之间的通信桥梁
创建一个vue对象，分为el模板和data数据

使用Object.definePropertype来劫持data中的每个属性的getter和setter,在数据发生变化的时候发布消息给订阅者，触发相应的回调。（vue3使用proxy劫持数据）也就是observer的功能
com]]></description><category></category></item><item><title><![CDATA[html相关]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/121295324</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/121295324</guid><author>kangyi158</author><pubDate>Fri, 12 Nov 2021 22:29:49 +0800</pubDate><description><![CDATA[src和href的区别
都是对外部资源的引用

src是用来请求下载资源并应用到当前文档中的（比如请求js脚本），请求到的资源会替换掉当前的这个元素，浏览器解析到这个地方会先暂停对文档的处理，下载完所要请求的资源后再继续处理当前文档（所以一般js脚本会放在最底下）
href是超文本引用，他是用来建立当前元素和外部资源的一种联系，通常指向一些网络资源，当浏览器解析到这个地方的时候会并行下载资源，不会暂停对当前文档的处理（比如css资源的引入）

对HTML语义化的理解
语义化的标签对开发者更加友好，让代码可读]]></description><category></category></item><item><title><![CDATA[css相关]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/121237819</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/121237819</guid><author>kangyi158</author><pubDate>Tue, 09 Nov 2021 22:34:15 +0800</pubDate><description><![CDATA[css选择器及权重
！important修饰的权重最高
行内元素 1000
id选择器   100
类、伪类、属性选择器  10
标签选择器  1
通配符、相邻、父子  0
可以继承的属性
1，字体相关：font-size  font-family
2,文本  text-align  text indent
3,鼠标的形态 cursor
4,列表的布局  list-style
display的属性值及作用
none:让元素在文档流中移除
block:块级元素，独占一行，可设置宽高，有m,p
line:行内元]]></description><category></category></item><item><title><![CDATA[js的基础]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/121089771</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/121089771</guid><author>kangyi158</author><pubDate>Tue, 02 Nov 2021 18:04:46 +0800</pubDate><description><![CDATA[setTimeout不准时怎么办
使用web worker,它为js创造了多线程环境，当js主线运行时，worker在后台运行，两者互不干扰，当worker运行出结果后，会把结果交给主线程
   // worker 解决方案
   let worker = new Worker('worker.js');

判断一个变量是null,undefined
undefined:
1,
var exp = undefined;
if (typeof(exp) == "undefined")
{
    alert(]]></description><category></category></item><item><title><![CDATA[js 中的== 和===]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/121088995</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/121088995</guid><author>kangyi158</author><pubDate>Mon, 01 Nov 2021 21:24:51 +0800</pubDate><description><![CDATA[==
在相等运算中，应注意以下几个问题：
如果操作数是布尔值，则先转换为数值，其中 false 转为 0，true 转换为 1。
如果一个操作数是字符串，另一个操作数是数字，则先尝试把字符串转换为数字。
如果一个操作数是字符串，另一个操作数是对象，则先尝试把对象转换为字符串。
如果一个操作数是数字，另一个操作数是对象，则先尝试把对象转换为数字。
如果两个操作数都是对象，则比较引用地址。如果引用地址相同，则相等；否则不等。
NaN与任何值都不相等，包括它自己。null 和 undefined 值相等，但是它.]]></description><category></category></item><item><title><![CDATA[js垃圾清除机制（标记清楚，引用计数）]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/121087803</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/121087803</guid><author>kangyi158</author><pubDate>Mon, 01 Nov 2021 20:56:14 +0800</pubDate><description><![CDATA[内存泄漏
不再使用到的内存，没有及时释放，就是内存泄露
所以为了避免手动的释放内存，就有了垃圾请除机制
代码回收规则如下：
1.全局变量不会被回收。
2.局部变量会被回收，也就是函数一旦运行完以后，函数内部的东西都会被销毁。
3.只要被另外一个作用域所引用就不会被回收 (闭包中引用的变量不会被回收)
垃圾回收的方法
1，标记清除
垃圾回收器会给在内存中的变量都做上标记，然后它会去除在环境中的变量和被环境中变量引用的变量(闭包)的标记，在这之后的被标记的变量就是需要清除的变量了。之后垃圾回收器将会回收这些变量]]></description><category></category></item><item><title><![CDATA[js手写题]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/121085075</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/121085075</guid><author>kangyi158</author><pubDate>Mon, 01 Nov 2021 19:47:39 +0800</pubDate><description><![CDATA[1，函数防抖和函数节流
防抖和节流都是处理处理频繁调用的函数时的一个优化
函数防抖
在规定是一段时间内，只执行最后一次的函数调用，前面的不生效
场景：在搜索框发请求时，避免用户打字幅度较快而发送太多没有必要的请求
function debounce(func, wait) {
        var timer = null
        return function () {
            var ctx = this
            var args = arguments
   ]]></description><category></category></item><item><title><![CDATA[js二分查找]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/121070299</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/121070299</guid><author>kangyi158</author><pubDate>Sun, 31 Oct 2021 21:30:46 +0800</pubDate><description><![CDATA[二分查找
就是在一个有序数组里，找到目标数，具体做法是：1，找到有序数组中的最终关键的数    2，用中间数跟目标数比较，如果目标数比中间数大，则在中间的右侧序列继续进行以上步骤，直到找到这个目标数；如果目标数比中间数小，则在中间的左侧序列继续进行以上步骤，直到找到这个目标数
（用递归实现）
    function binarySearch(arr, left, right, findVal) {
        if (left &gt; right) {
            return -1
 ]]></description><category></category></item><item><title><![CDATA[js排序算法]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/121058937</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/121058937</guid><author>kangyi158</author><pubDate>Sun, 31 Oct 2021 00:43:52 +0800</pubDate><description><![CDATA[以从小到大顺序排列为例
1，快速排序
思想（分治）：先在数组中选取一个基准数，然后将小于这个基准的数放在基准左边，将大于基准的数放在右边，这时这个基准的位置就是他最终应该在的位置，然后对于左边的序列和右边的序列继续进行以上操作（递归），最终的得到排序好的序列
  function quickSort(arr) {
        if (arr.length &lt; 1)
            return arr
        var index = Math.floor(arr.length / ]]></description><category></category></item><item><title><![CDATA[在js中 var let const 的区别]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/121025701</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/121025701</guid><author>kangyi158</author><pubDate>Thu, 28 Oct 2021 23:47:38 +0800</pubDate><description><![CDATA[一，var

用var声明的变量是函数作用域（在函数内部声明的变量只能在函数作用域内部使用，在函数外部不能访问。但是，在函数内部可以访问函数外部的全局作用域中的变量。）
var声明的变量会有变量提升（在var 之前就可以使用，未赋值时是undefined）
全局作用域中的var声明的变量是挂载在全局对象windows上
在同一作用域下，var可以声明相同名字的变量

二， let

用let声明的变量是块级作用域下的（块级作用域是用{}来界定的，块与块之间不能访问变量）
用let声明的变量没有变量提升（也就]]></description><category></category></item><item><title><![CDATA[js 事件冒泡_事件捕获_事件委托]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/121024809</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/121024809</guid><author>kangyi158</author><pubDate>Thu, 28 Oct 2021 23:06:01 +0800</pubDate><description><![CDATA[事件流
事件流描述的是从页面中接收事件的顺序，有两种：事件冒泡和事件捕获
事件冒泡
事件由最具体的元素向上传播到不具体的元素
取消冒泡：
1,W3C标准 event.stopPropagation()
2,IE谷歌: event.cancelBubble = true;

事件捕获
事件捕获与事件冒泡正好相反，是从最顶层向下传递的，（从最不具体的元素到最具体的元素传播

可以自己选择绑定事件时采用事件捕获还是事件冒泡，方法就是绑定事件时通过addEventListener函数，它有三个参数，第三个参数若是t]]></description><category></category></item><item><title><![CDATA[js基本类型和引用类型]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/121023775</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/121023775</guid><author>kangyi158</author><pubDate>Thu, 28 Oct 2021 21:54:48 +0800</pubDate><description><![CDATA[1，基本类型
Number ,String,Boolean,Undefined,Null
2,引用类型
Object, Array,Function,Date
3,两者的区别
1,内存分配方式不同
基本类型存储在栈的数据段中，因为他们占据的空间是固定的，也方便迅速查询变量的值
引用类型存储在堆中，变量是引用了他的指针来进行访问，因为他们的值的大小会改变，所以分配在堆中
2，两种类型在添加属性时候的区别
引用类型可以动态的给添加属性
基本类型的值是不可变
（值不可变比如说）
var name = 'jozo']]></description><category></category></item><item><title><![CDATA[js执行过程]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/121021799</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/121021799</guid><author>kangyi158</author><pubDate>Thu, 28 Oct 2021 20:15:27 +0800</pubDate><description><![CDATA[js的执行过程？
javascript是由浏览器解释执行的脚本语言，js执行过程分为预编译期和执行期（以代码块为单位，边解释边执行），在预编译的时候，会有这几个步骤

创建执行上下文
找形参和变量的声明，值赋为undefined
统一形参和实参
找到函数声明，赋予函数体
例：

    function fn(a) {
        console.log(a);   //fa(){}
        var a = 123;
        console.log(a);   //123
       ]]></description><category></category></item><item><title><![CDATA[javascript闭包]]></title><link>https://blog.youkuaiyun.com/kangyi158/article/details/121018844</link><guid>https://blog.youkuaiyun.com/kangyi158/article/details/121018844</guid><author>kangyi158</author><pubDate>Thu, 28 Oct 2021 18:04:46 +0800</pubDate><description><![CDATA[什么是闭包？
「函数」和「函数内部能访问到的变量」的总和，就是一个闭包。
闭包是 JS 函数作用域的副产品。换句话说，正是由于 JS 的函数内部可以使用函数外部的变量，才有了闭包。
比如：这里local和bar就形成了一个闭包
function foo(){
  var local = 1
  function bar(){
    local++
    return local
  }
  return bar
}
var func = foo()
func()

闭包的特点？
①函数嵌套函数（函数套函]]></description><category></category></item></channel></rss>