自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(124)
  • 收藏
  • 关注

原创 二叉树的遍历【先序,中序,后序,层级】(详解)

摘要关于二叉树的遍历也是很常见的问题,而最常用的遍历也是标题中的说的四种方式。先序,中序和后序可以采用递归和迭代的方式来完成,也是深度优先的思想,后面会写出递归和迭代的方法。层级遍历主要是借用队列这种数据结构来进行对二叉树逐层遍历,是广度优先的思想。现在我们来写一下每一种的遍历方法。1.中序遍历先说一下中序遍历的方式是什么。对于二叉树的每个节点,从根节点开始,都要先遍历当前节点的左子节点,再遍历当前节点,然后是当前节点的右子节点。简单来说就是左子树 -> 根节点 -> 右子树。递

2021-09-16 11:42:30 1499 1

原创 JS实现二叉搜索树【增删改查】(详解)

摘要如果说一个数据结构的出现一定是因为它能解决某些问题,我们传统的线性表有数组和链表,前者在改查的优势更大,后者在增删的优势更大。但是往往在应用中这些功能我们是都需要用到的,在对数组或者链表的选择上就有了一些决定性。而二叉搜索树是具备了数组改查快和链表增删快的特点而生的一种数据结构。二叉搜索树具有二叉树的特点,并且,每个节点的左子树中所有节点都是比当前节点的值小的,每个节点的右子树所有节点都是比当前节点的值大的。正是这种特点,使它在数据操作和检索操作上具有很高的效率。OK,这一篇我们主要用JS来

2021-09-14 16:59:30 372 1

原创 JAVA中的HashMap(原理篇)

这一篇呢,是相对于自己的理解,说一说HashMap的底层原理,希望能以简单的方式来说明,便于去理解。。。。一、HashMap特点首先说到表,那一定伴随着数据的增删改查和遍历;那HashMap同样也有着这样的功能;那到底什么是HashMap,我们先说一下他的两个特点;1.存取无序2.键唯一那,HashMap中有两个参数,一个是key,一个是value;这个key是唯一的,也就对应了HashMap的查找方式;二、HashMap的创建我们从创建一个HashMap对象开始说起,当我们创建一个Ha

2020-07-18 15:37:37 5121 5

原创 一篇搞定JS的位运算(公式+力扣真题)--- 持续更新

位操作(Bit Manipulation)是程序设计中对位模式或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。在现代编程语言中,情况并非如此,很多编程语言的解释器都会基本的运算进行了优化,因此我们在实际开发中可以不必做一些编译器已经帮我们做好的优化,而就写出代码本身所要表现的意思。在对位运算的学习过程中,可以锻炼写代码的思路,同时在面试过程中,如果使用位运算来对问题进行解决,也会很加分。

2023-01-13 16:04:47 455

原创 原生JS的拖拽属性draggable(详解)

作为h5新增的属性draggable,它能够给与一切的html元素拖动的效果。而在这个属性之下,也有着关于拖动效果的各个方法。而这一篇文章,主要就是说一下关于draggable属性的使用以及工作场景。

2022-12-02 16:38:55 573

原创 React中ref的使用方法和使用场景(详解)

不管在Vue中还是React,如果我们想使用一个元素的DOM,不需要通过JS中操纵DOM的方法,它们提供了一个专属的API就是ref。而Vue中的ref可能比较简单,这一篇主要讲一下如何在React中使用ref,以及使用ref的场景。

2022-10-27 09:39:53 661

原创 React中如何在事件处理的时候传参(详解)

/执行代码 } button onClick = {但是如果有Vue的基础,可以很清楚的看到二者的区别。在Vue中,我们可以直接给fn传递参数。//执行代码 console . log(value) } button onClick = {你会发现,在页面加载的时候,2222已经被打印出来了。但是点击按钮的时候并没有效果。这说明,该方法并没有被绑定在按钮上,而是在按钮加载的时候直接调用了。

2022-09-09 17:01:33 784 2

原创 React中this.setState方法原理解析(详解)

而这一篇文章,主要是简单的实现一下this.setState方法,为了实现该方法,就要知道this.setState方法具有什么特点。

2022-08-30 19:50:47 433

原创 React.createElement方法源码解析(原理详解)

而这一篇文章,主要是讲一下React.createElement是如何创建React元素的。

2022-08-22 19:14:20 584

原创 React中的JSX --- { }的使用

在做react开发的时候,我们知道最后要通过render方法来将React元素挂载到真实的DOM上。而创建一个React元素,可以通过两种方式创建。

2022-08-18 19:50:27 463

原创 HTTP的报文(详解)

摘要我们对于http的了解,应该在于,我们如果想请求一个资源或者访问一个页面,客户端(我们)应该向服务器发送一个http请求,然后得到响应,才能出现我们想要的资源。但是,我们在发送http请求的时候,到底给服务器发送了什么,服务器又给我们响应了什么。而这就是http报文,所以它也分为了两种,http的请求报文和http的响应报文。顾名思义,也就是客户端发送的就是http请求报文,服务器响应的就是http响应报文。...

2022-03-02 21:16:17 2375

原创 Http的各种请求方法(详解)

摘要我们知道,当我们访问各种网页的时候,之所以能够看到页面,根本原因是发送了http请求然后得到了响应,从而页面才会弹出来。再或者我们上传一些照片和视频时,之所以可以上传成功也是因为我们通过http请求来进行上传,从而将资源放在了网上。当客户端像服务端发送请求的时候,针对于不同意图的请求,我们分成了不同的http请求方法。1.GET请求GET方法是最常见也是最简单的http请求方法,它主要用作于获取资源。也就是说我客户端请求什么,你服务器就原样给我返回什么。我请求的是文本,你就保持原样返回;我请

2022-02-12 20:48:17 9707 1

原创 Http缓存 --- 强缓存和协商缓存(详解)

摘要关于缓存,在性能优化上有着很重要的意义,或者说缓存的存在是就是为了提升性能。而缓存也分为强缓存和协商缓存,而这一篇文章。我们在最后介绍二者的区别,前面主要来说一下缓存的过程,加深理解。1.为什么要有缓存?我们设想一下,如果没有缓存,那么浏览器是怎么向服务端请求资源的。不管服务端的资源是否更新,只要我们刷新页面,就一定会向服务器发送请求。但是这次请求的资源和上次的资源并没有什么区别,这就造成了资源的浪费。所以我们引入了缓存的概念,在第一次向服务器请求资源的时候,把资源保存在本地的磁盘,下次

2021-10-20 18:16:55 1070

原创 弹性盒模型(详解)

摘要关于弹性盒模型,属性也是比较多,属性的值也是比较杂,所以看起来也是比较吃力,总是学习的时候似乎已经掌握了,慢慢不用的话一些属性又不会了。这一篇文章,只去理解弹性盒模型的属性,而不会列出所有属性的值。重点在于理解,而非去死记硬背。1.创建弹性盒子所有人应该都知道我们应该使用display:flex来创建一个弹性盒子。但是其实还有另一种创建方式:display:inline-flex。乍一看这个属性和display:block , display:inline-block是不是有一点点像。其

2021-10-18 16:44:24 3065

原创 原生JS实现call,apply,bind方法(详解)

摘要我们知道如果想改变this的指向,我们有三种方法可以实现。call和apply是直接调用,而bind是返回一个方法,不会直接调用。如果我们想了解它更深的话,那么就自己实现出来吧。首先我们想一下,这三个方法的调用者是方法,是任何方法。那既然是这样,所有的方法都可以再次调用这三个方法,所以我们自己写出来的这三个方法一定是写在Function的原型下的。有了这个思路我们就可以进行实现了:call方法首先我们来回顾一下call方法是如何调用的:let p1 = { name: 'lisi'

2021-08-17 10:02:30 518

原创 原生JS实现Promise(详解)

摘要首先呢,Promise是异步中比较重要的知识点,学习的最好方法就是掌握它的基本原理。所以这一篇主要说一下如何用JS来实现一个自己的promise。构造函数首先我们来看一下我们是如何使用promise的,我们在实例化对象是这么使用的: let p1 = new Promise((resolve, reject) => { let random = Math.floor(Math.random() * 10); if (random > 4) {

2021-08-16 14:41:08 1973 1

原创 使用原生JS封装Vue-Router

摘要前段时间对Vue-router里面的一些方法原理进行了实现,在这里进行整理一下,相比于上一篇实现的axios,这次实现的路由显得更复杂一些。实现的方法主要有push,go,replace以及beforeEach和afterEach的钩子函数。实现的原理主要有URL和页面的响应,以及router-view和router-link。1.hash和history在写之前我们要了解hash和history的区别,主要的区别还是在于hash模式更改路由不需要重新请求,并且URL中路由前面有#。his

2021-08-11 15:53:19 408

原创 使用原生js封装axios(详解)

摘要在vue中,我们调用接口使用的都是axios,使用之前我们也会进行一定的封装,然后再进行使用。在这里,我们主要说一下axios的实现原理,以及如何使用原生的js来自己封装出一个axios。这里实现出几个主要的方法,包括post请求方法,create配置方法,以及拦截器的方法。1.post方法在我们写方法之前,肯定是要先自己写一个类出来,里面的内容先不用写。然后再在类的下面写出post的方法:function iaxios () {}iaxios.prototype.post = f

2021-07-21 17:35:53 4875

原创 JS的事件类型(详解)

摘要Web浏览器可能发生的事件有很多种类型,而这一篇我们针对于不同的浏览器的事件类型来说明一下,我们从DOM3级事件中总结了一下几种类型的事件:事件 类型作用意义UI事件当用户在页面上的元素进行交互时触发焦点事件当元素获得或失去焦点时触发鼠标事件当用户通过鼠标在页面上执行操作时触发滚轮事件当使用鼠标滚轮时触发文本事件当在文档中输入文本时触发键盘事件当用户通过键盘在页面上执行操作时触发当然除了这些类型我们还有一些其他类型的事件,不过在这里

2021-06-02 20:59:24 1621

原创 详解onclick和addEventListener的区别

摘要当我们想要给某个DOM元素绑定事件的时候,最常用的方法是通过on + 事件名字的方式。而在DOM2级事件定义了两个方法,用于处理指定和删除事件处理程序的操作:addEventListener()和removeEventListener().并且它们都接受三个参数:要处理的事件名,作为事件处理的一个函数,一个布尔值。最后的布尔值如果为false,表示在冒泡阶段调用事件处理函数,如果是true,表示在捕获阶段调用事件处理程序。区别1:同时绑定多个事件我们来想一个问题,我们使用onclick方法可

2021-05-25 12:10:08 747 2

原创 一篇文章搞懂JS的事件流

摘要当浏览器发展到第四代时,浏览器开发团队遇到了一个很有意思的问题:页面的那一部分会拥有某一个特定的事件。要明白这个问题是什么意思,我们来看一个例子。当我们点击内部的蓝色圆圈的时候,我们点击的不是一个圆圈,而是页面中的所有圆圈。而事件流描述的就是从页面接收事件的顺序。现在我们来介绍一下三种事件流的情况。1.事件冒泡IE的事件流叫做事件冒泡,即事件开始时由最具体的元素(文档中嵌套最深的那个节点)接收,然后逐级向上传播到较为不具体的节点。 <div id="div1">

2021-05-25 11:39:27 196

原创 DOM扩展(详解)

摘要尽管DOM作为API已经非常完善了,但为了实现更多的功能,仍然会有一些标准或专有的扩展。这一篇主要来说一下对于DOM1的不足之处的扩展。1.选择符API虽然DOM已经在docement类型下有了几个选择元素的方法,但似乎还是不能满足我们的需求,所以就延伸除了JavaScript库中最常用的一项功能,就是根据CSS选择符选择与某个模式匹配的DOM元素。(1) querySelector()方法该方法接收一个CSS选择符作为参数,返回与该模式匹配的第一个元素,如果没有找到匹配的元素,则返回nul

2021-05-10 21:45:01 211

原创 DOM(文档对象模型详解)

摘要DOM是针对于HTML和XML文档的一个API(应用程序编程接口)。DOM描绘了一个层次化的节点树,允许开发人员添加,移出和修改页面的某一部分。尽管现在我们可以应用各种框架来实现需求,但对于原生的DOM操作还是有必要好好掌握的,这一篇主要就来说一下DOM的重点。1.Node类型DOM1级定义了一个Node接口,该接口将由DOM中所有节点类型实现。这个接口在Javascript中是以Node类型实现的。也就是说,在文档中任何一个部分都可以看成一个节点。(1) 属性nodeType : 用于表

2021-05-09 19:13:21 228

原创 BOM(浏览器对象模型详解)

摘要如果想在Web中使用JavaScript,那么BOM无疑是真正的核心。BOM提供了许多对象用于访问浏览器的功能,这些功能与任何网页内容无关。这一篇就来说一下BOM对象的核心内容。1.Window 对象BOM的核心对象是window,它表示浏览器的一个实例。在浏览器中,window对象有双重角色,它既是通过JavaScript访问浏览器窗口的一个接口,又是ECMAscript规定的Global对象。(1)全局作用域这意味着在网页中定义的任何变量,方法和对象,都是在以window为Global对

2021-05-07 21:26:08 732 5

原创 JS实现类的继承

OK,有了上一节的基础,我们就可以用ES5来实现一个手写的继承了。这里继承的实现方法也是面试中比较常见的问题,我们从写一个最简单的模式,然后通过分析问题所在从而进行改善,最终实现一个比较完美的继承。1.创建一个父类我们如果想创建一个父类,用方法的模式来写,给类添加成员变量和方法,最简的就是这样写。function People(name,age){ this.name = name; this.age = age; this.sayHello = function(){

2021-04-24 13:16:57 232

原创 JS中的原型对象

OK,这一篇我们来说一下原型的这个问题。1.理解原型对象也是面试中比较常见的问题,我们结合实际来说一下,JS中的原型到底是做什么的。无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。在默认情况下,所有原型对象会自动获得一个constructor属性,这个属性指向prototype属性所在函数的指针。当用构造函数创建一个新实例后,该实例的内部包含一个属性(__proto __),指向该构造函数的原型对象。那我们来举个例

2021-04-23 21:28:28 1746

原创 Object.defineProperty方法(详解)

OK,这一篇主要想说一下Object.defineProperty这个方法。这个方法也是Vue数据双向绑定原理的常见面试题所以也是有必要好好掌握的哦首先我们知道JS中是支持面向对象编程的,也是有着对象和类这样的概念。我们常见创建对象的方法应该是这样:var p1 ={ name:"lisi",}那我们Object.defineProperty这个方法有什么用呢?这个方法接收三个参数:1.属性所在的对象2.属性的名字3.一个描述符对象这个描述符对象是个什么东西呢?他可以

2021-04-20 18:15:06 49914 24

原创 JS实现桶排序(代码+讲解)

OK,最后再说一种排序,这一个篇章就结束了。说到桶排序,它的思想就是把分治用到极致,把一个序列分为一个个同,然后对每个桶进行排序,最后再进行整合。我们还是先用图解来进行对原理的解释,然后再用代码实现。OK,桶排序的思想有了,我们来说一下原理:第一步:确定这个序列要分为几个桶第二步:把每个元素放到对应的桶里面第三步:对每个桶进行排序第四步:对所有的桶进行整合现在我们用图来看一下,倘若我有这样一个序列现在我们要确定桶的数量,如和确定呢,这里面有一个计算公式桶的数量 = (最大值 - 最小

2021-04-19 12:31:18 666 6

原创 JS实现快速排序(代码+讲解)

OK,排序这一个篇章也快要结束了。这一篇主要说的是快速排序,说的方式主要还是先说原理,然后再用代码来进行实现。所谓快速排序,就是分为三步走:第一步:选择第一个数字分离出来为基数第二步:然后将序列中大于基数的放在基数右边,小于基数的放在基数的左边第三步:然后对基数的左边和右边两个序列重复第二步和第三步这样就能形成一个有序的序列,那么重点是我们如何来实现第二步这个过程呢?我们用图解来说明一下。倘若我们有这样一个序列现在我们按步骤来,先把第一个元素4储存起来。然后定义两个指针分别指向第一

2021-04-19 09:55:20 5532 2

原创 JS实现归并排序(代码+讲解)

OK,最后还有三个排序了。这一篇来说一下归并排序。归并排序,顾名思义,就是把两个已经排好序的数组进行归并,成为一个新排序好的序列。如图所示假如我们有这样的两个已经排序好的序列我们怎么能够把这两个序列合并成一个新的有序序列呢?我们用两个变量i个j分别指向两个数组的第一个变量。然后比较这两个变量的大小。如果 arr【i】< arr【j】 : 那么就把arr【i】放在新数组里面,然后i向下移动一位。然后再比较arr【i】和arr【j】的值,现在4比3大。这样以此类推,总会有一个

2021-03-20 14:27:49 700 4

原创 JS实现希尔排序(代码+讲解)

这一篇我们说一下希尔排序,当然了如果学习希尔排序那么就要知道插入排序的原理,因为希尔排序算的上是插入排序的进化版如果没有学习过插入排序那么就给一个传送门!https://blog.csdn.net/weixin_46726346/article/details/112912649?spm=1001.2014.3001.5501学习了插入排序我们就可以对希尔排序进行讲解原理并实现了。我们假设一下我们有这样一个数组首先我们要确定一个增量,这里面我们一般用数组长度的一半为初始值。那这里我们的增

2021-03-10 22:48:45 675 1

原创 JS实现堆排序(代码+讲解)

OK,说到第四种排序,今天我们说一下堆排序。堆排序,顾名思义,就是使用堆这个数据结构对无序数组进行排序。那我们就先来说一下什么是堆。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如图所示,这就是一个大顶堆。如果我们可以每次将堆定的元素放到最后面,然后再重新形成堆结构。重复地再将堆顶的元素放到最后面,一直到堆只有一个元素,那么这个堆就变成了一个有序的数组。所以我们如果想要完成堆排序,就要先写一

2021-01-21 23:15:40 792

原创 JS实现插入排序(讲解+代码)

OK,现在我们说第三种排序,插入排序,并且用JS语言来实现一下。所谓插入排序,就是把最小的(或者最大的),一次次插入到最前面,从而达到排序的效果。通俗易懂!!!现在我们来解释一下怎么插,插成一个有序的数组。原理就是,我们从第二个开始,比较当前元素前面的所有元素。找到一个比他大的元素,就把这个元素向后移一位。然后直到没有比他大的元素了,这个位置就是它的归宿。现在我们用画图来解释一下。如果我们有一个数组【4,3,2,1,0】。我们从第二个开始,由于4比他大,就要向后移,然后没有了,3就去4

2021-01-20 22:39:51 2334

原创 JS实现选择排序及优化(代码+讲解)

OK,说到第二种最简单的排序。除了冒泡就是选择排序了,如果光实现出一个选择排序,倒是一件很简单的事情。原理就是我们用两层for循环进行遍历,每次遍历都找到一个最小的,把这个最小的元素和未排序数组的第一个进行互换。这样就得到了一个排好序的数组了,很简单吧。附上代码。 <script> //原版 function sort(arr) { for (var i = 0; i < arr.length; i++) { l

2021-01-19 23:49:38 426

原创 JS排序--冒泡排序(实现及优化)

首先我们用JS实现冒泡排序的话,最常见的应该是这种。基础版: <script> function sort(arr) { for (var i = 0; i < arr.length - 1; i++) { for (var j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) {

2020-12-17 20:07:07 633 1

原创 JS实现集合Set(代码+测试)

代码 <script> //定义集合类 function Set() { this.dataStore = []; } //添加方法(不能允许元素重复) Set.prototype.add = function (element) { if (this.dataStore.indexOf(element) < 0) { th

2020-12-16 10:42:31 143

原创 JS实现散列函数(代码+测试)

代码 <script> //创建散列函数类 function HashTable() { this.table = new Array(137); } //用霍纳算法计算哈希值 HashTable.prototype.betterHash = function (string) { const H = 37; var totle = 0;

2020-12-14 17:17:21 253

原创 JS实现字典(代码+测试)

代码<script> //用数组是因为数组也是Object类 function Dictionary(){ this.datastore = new Array(); } //添加方法(数组的key为字符串时,length不会变) Dictionary.prototype.add = function(key,value){ this.datastore[key] =

2020-12-14 14:40:25 338

原创 JavaScript实现单链表(最全方法版)

代码 <script> //Node节点类 function Node(element, index) { this.element = element; this.next = null; this.index = index; } //链表类 function List() { this.first = new No

2020-12-10 15:32:38 181 2

原创 JavaScript实现队列(代码+测试)

代码<script> function Queue() { this.dataStore = []; } Queue.prototype.enqueue = function (data) { this.dataStore.push(data) } Queue.prototype.dequeue = function () { if (!th

2020-12-09 20:45:16 86

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除