
Javascript
进击的Bao
这个作者很懒,什么都没留下…
展开
-
Javascript系列(九):类数组和数组
在JavaScript中,类数组和数组是两个不同的概念,同时也是需要区分清楚的。数组我们都了解,是JavaScript中的一个引用类型,那类数组是什么呢?类数组和数组之间的区别类数组拥有length属性和索引,是object;类数组不具有数组所具有的方法;例如内置对象arguments、DOM方法返回的结果都是类数组;类数组和数组相互转换数组转换为类数组数组转换成类数组,即将数组类型转换成Object类型,调用数组的原生push方法,同时通过apply改变this的执行,将this改为o原创 2021-03-07 14:24:55 · 1001 阅读 · 0 评论 -
Javascript系列(八):关于let和const是否会变量提升?
网上很多博客和资料都写let和const不存在变量提升,只有var会产生变量提升,之前我一直对此深信不疑,直到看到大佬的文章开始对此产生了一点怀疑。在理解这个问题之前,首先看看var let const的定义和区别。var在ES5前声明变量只能用var,且只存在函数作用域:var message = "hi";message = 100; //可以改变变量类型,合法但不推荐age = 18; //不用var声明,代表全局变量var存在变量提升://变量age自动提升到函数作用域原创 2021-03-07 14:07:53 · 4188 阅读 · 0 评论 -
Javascript系列(六):手写call/apply/bind函数
简单介绍共同点:call apply bind 三个函数是Function对象中自带的方法,都是用来改变函数的this对象指向。不同点:第一个参数都是this要指向的对象,也就是想指定的上下文;call的第二个参数以逗号隔开,apply传入的是数组,bind第二个参数以逗号隔开;bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用;手写call函数Function.prototype.myCall = function(thisArg, ...args) {原创 2021-03-07 10:35:56 · 550 阅读 · 0 评论 -
Javascript系列(七):new的原理及手写
new的流程:创建一个新对象将原函数的this指向这个新对象将创建新对象中的__proto__(隐式原型)指向原函数中的prototype(显示原型)判断原函数是否主动返回对象或者function,如果没有则隐式返回this所指向的对象function new(){ //定义空对象 let obj = {}; //取出参数列表的第一个参数(构造函数) let Con = [].shift.call(arguments); //手动指正o原创 2021-03-07 10:30:13 · 522 阅读 · 0 评论 -
Javascript系列(五):关于this指向的总结
在javascript中有关于this的指向判断有时候真的让人头晕,而且很多时候稍微不小心就会看错,我整理了关于this的指向相关问题,做一个总结。全局作用域内全局作用域的this都指向window在函数中箭头函数由于箭头函数本身不绑定this,会捕获其所在上下文的 this 值,所以箭头函数中的this指向包裹箭头函数的第一个普通函数。普通函数f()直接调用f():this指向window通过对象调用:this指向objnew:this指向new出来的实例call/ap原创 2021-03-06 23:11:32 · 485 阅读 · 0 评论 -
Javascript实现几种排序算法
大O表示法:在算法描述中,用来粗略的度量算法的效率常见的大O表示形式 排序算法封装列表 方便测试冒泡排序:效率较低,但思路简单效率:比较次数O(N2),交换次数O(N2)选择排序:改进了冒泡排序选定第一个索引位置和后面的元素依次比较,找到除第一个元素意外以外的剩下元素最小的那个与第一个交换,然后用同样的方法逐个比较剩下的元素(每次选择最小或最大的元素)效率:比较次数O(N2),交换次数O(N)插入排序:插入排序是高级排序(希尔排序/快速排序)的..原创 2021-01-15 09:18:56 · 713 阅读 · 0 评论 -
JS实现数据结构(八):图
图论是一个非常大的话题图论是数学的一个分支,研究事物之间的关系,顶点表示事物,边表示两个食物的关系图有一组顶点和一组边,可以是有向的,也可以是无向的图的术语顶点:图中的一个节点边:顶点和顶点的连线相邻节点:由一条边连接的节点度:是一个顶点的相邻节点的数量简单路径:要求不包含重复的顶点回路:第一个顶点和最后一个顶点相同的路径称为回路无向图:边是有方向的有向图:边是无方向的无权图:边没有携带权重带权图:边有一定的权重图的表示法:邻接矩阵:二维数组邻..原创 2021-01-15 09:18:36 · 738 阅读 · 0 评论 -
JS实现数据结构(七):树
一、树结构是一种非线性结构,可以表示一对多的关系树结构的术语空树:n=0非空树:n>0树中有一个根节点(Root),用r表示其余节点可以分为m个互不相交的有限集T1……Tm,每个集合本身又是一棵树,称为原来树的子树二、二叉树树中每个节点最多只有两个子节点二叉树的5种形态二叉树的特性完美二叉树(满二叉树)除了最下一层的叶节点外,每层节点都有2个子节点完全二叉树除了最下一层的叶节点外,其他层节点数达到了最大个数,且从左往右叶节点连续原创 2021-01-14 16:15:48 · 873 阅读 · 0 评论 -
JS实现数据结构(六):哈希表
一、哈希表基于数组实现提供快速的插入-删除-查找操作插入和删除的时间接近O(1)的时间级哈希表的速度比树还要快,基本可以瞬间找到想要的元素哈希表相对于树来说编码要容易二、 哈希表相对于数组的一些不足哈希表中的数据是无序的,所以不能以某种方式来遍历的元素哈希表中key是不允许重复的三、哈希表的一些概念哈希化:将大数字转化成数组范围内下标的过程哈希函数:通常我们会将单词转成大数字,大数字在进行哈希化的代码实现放在一个函数里哈希表:最终将数据插入到的这个数组,对整个结构的原创 2021-01-14 16:03:18 · 837 阅读 · 0 评论 -
JS实现数据结构(五):集合
集合常见的实现方式是哈希表集合通常是一组无序的,不能重复的元素集合的特殊之处在于里面的元素没有顺序,不能重复;即不能通过下标值来访问,相同的对象在集合中只会存在一份ES6已经有Set类集合类的方法add(value):向集合添加一个新的项remove(value):从集合移除一个值has(value):如果值在集合中,返回true,否则返回falseclear():移除集合中的所有项size():返回集合所包含元素的数量,与数组的length属性类似values (..原创 2021-01-14 15:51:59 · 1722 阅读 · 3 评论 -
JS实现数据结构(四):双向链表
单向链表只能从从遍历到尾,缺点是可以轻松到达下一个节点,但是很难回到上一个节点双向链表可以从头遍历到尾,也可以从尾遍历到头,一个节点既有向前的引用,也有向后的引用双向链表结构- 双向链表方法append(element):向列表尾部添加一个新的项insert(position,element):向列表的特定位置插入一个新的项。get(position):获取对应位置的元素indexOf(element):返回元素在列表中的索引。如果列表中没有该元素则返回-1。update(position.原创 2021-01-14 15:48:23 · 2068 阅读 · 3 评论 -
JS实现数据结构(三):链表
链表也是一种常见的存储数据的线性结构数组的缺点:数组的创建需要申请一段连续的内存空间,大小是固定的,当容量需求不满足时需要扩容在数组开头或中间位置插入数据的成本很高,需要大量元素的位移链表的优势:链表的元素在内存中不必是连续的空间,实现灵活的内存动态管理链表的元素由一个存储元素本身的节点和一个指向下一个元素的引用(指针)链表不必在创建时确定大小,可以无限延伸下去链表在插入和删除数据时,时间复杂度达到O(1),效率较高链表的缺点链表想访问任何一个位置的元素时,都需..原创 2021-01-14 15:43:23 · 812 阅读 · 2 评论 -
JS实现数据结构(二):队列
队列(Queue),也是一种受限的线性结构,先进先出(FIFO)受限之处在于它只允许在表的前端进行删除,在表的后端进行插入操作队列结构有两种常见的方式:基于数组实现基于链表实现队列方法enqueue(element):向队列尾部添加一个(或多个)新的项dequeue():移除队列的第一(即排在队列最前面的)项,并返回被移除的元素front():返回队列中第一个元素-一最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素只返回元素信息一与Stack类的peek..原创 2021-01-14 15:35:42 · 682 阅读 · 0 评论 -
JS实现数据结构(一):栈
数组是一种线性结构,可以在任意位置插入和删除数据栈和队列是受限的线性结构,后进先出或先进先出栈(stack),是一种受限的线性表,后进先出(LIFO)插入新元素,称为进栈删除元素,成为出栈程序中的栈实现:递归函数调用栈:函数之间的相互调用,A调用了B,B调用了C,C又调用了D,栈会把A、B、C、D依次压入栈,然后按相反的顺序弹出栈栈结构有两种常见的方式:基于数组实现基于链表实现栈方法:push(element):添加一个新元素到栈顶位置..原创 2021-01-14 15:32:54 · 863 阅读 · 0 评论 -
Javascript系列(四):Event Loop 事件循环
一、Event Loop是什么?由于Javascript是单线程的,所有的任务在一个线程上完成。这会导致同一时间只能完成一个任务,如果前一个任务比较耗时,将会导致页面卡顿、假死等问题,用户体验极差,这被称之为“同步模式”和“堵塞模式”。为此,Javascript提供了一个叫做Event Loop(事件循环)的机制来解决单线程运行时阻塞的问题。相反,这叫做“异步模式”和“非堵塞模式”。Event Loop在浏览器和Node环境下会略有差异。二、Event Loop原理由于Javascript的单线程特原创 2020-12-10 16:32:11 · 725 阅读 · 0 评论 -
Javascript系列(三):创建对象和继承
对象创建1.工厂模式优点:解决了创建多个相似对象的问题缺点:没有解决对象识别问题;每一个对象都有一套自己的函数,浪费资源function createPerson(name, age, job) { var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function () { alert(this.name); }; return原创 2020-10-11 13:19:42 · 757 阅读 · 0 评论 -
Javascript系列(二):值传递
ECMAScript中所有函数的参数都是按值传递的红宝书P70的这句话不是很理解,看了网上很多资料和博客,感觉都讲的云里雾里的,干脆自己整理一篇。整理的过程中发现这个概念其实有点文字游戏,用文字去解释文字所以很晕,其实画一个图就会很清楚了。值传递和引用传递值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。以上关于值传递与引用传.原创 2020-10-09 15:01:17 · 1029 阅读 · 0 评论 -
Javascript系列(一):布尔操作符的短路操作
布尔操作符一般具有短路原理:若第一操作数能决定结果,就不会判断第二操作数在Javascript中,由于布尔操作符可以应用于任何类型的操作数,所以返回的结果不仅仅是布尔值,这对优化代码提供了一些方法。合理使用布尔操作数能够减少if…else等语句的使用,大大减少了代码量,增强了代码的简洁性,但也在一定程度降低了可读性。所以,在实际使用中要有所取舍。各类操作数的布尔值前面提过,在Javascript中的逻辑操作数可以是任意类型的,下表列举各类操作数的布尔值:类型布尔值对象t原创 2020-10-08 14:57:17 · 867 阅读 · 0 评论