自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

旧忆时光的博客

前端技术学习记录,如有你所遇到的问题,希望我的记录能给你帮助

  • 博客(98)
  • 收藏
  • 关注

原创 软考论文框架

论文由背景+过渡+论点论述+总结组成论点论述:有理论和实践组成,说明论点定义、作用+项目中对该论点的实际应用进行说明。能画图就画图,可加分。双拼论文以一个主题为主论点,然后在每个主论点中,插入后面主题的论点。

2024-02-26 15:18:58 926

原创 学习JS闭包

【代码】学习JS闭包。

2023-10-20 17:50:33 179

原创 js数据类型和判断数据类型的方法

2.引用数据类型也称合成类型的值(多个原始类型的值的合成):object。typeof 判断数据类型。

2023-10-20 15:23:28 171

原创 JS学习笔记(二)

结构型值的不可变(闭包和对象)

2023-04-17 14:23:31 210 1

原创 JS学习笔记(一)

JS 原型

2023-04-17 10:03:25 400

原创 303. 区域和检索 - 数组不可变

给定一个整数数组 nums,处理以下类型的多个查询:计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中 left <= right实现 NumArray 类:NumArray(int[] nums) 使用数组 nums 初始化对象int sumRange(int i, int j) 返回数组 nums 中索引 left 和 right 之间的元素的 总和 ,包含 left 和 right 两点(也就是 nums[left] + num.

2022-03-16 10:44:20 123

原创 228. 汇总区间

给定一个 无重复元素 的 有序 整数数组 nums 。返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。列表中的每个区间范围 [a,b] 应该按如下格式输出:“a->b” ,如果 a != b“a” ,如果 a == b示例1输入:nums = [0,1,2,4,5,7]输出:["0->2","4->5","7"]解释:区间范围是:[0,2.

2022-03-16 09:35:53 149

原创 283. 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。示例1输入: nums = [0,1,0,3,12]输出: [1,3,12,0,0]示例2输入: nums = [0]输出: [0]题解1 var moveZeroes = function(nums){ let len = nums.length,left=0,right = 0; for(let i =0;i<.

2022-03-15 13:46:35 364

原创 219. 存在重复元素 II

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。示例1输入:nums = [1,2,3,1], k = 3输出:true示例2输入:nums = [1,0,1,1], k = 1输出:true示例3输入:nums = [1,2,3,1,2,3], k = 2输出:false题解.

2022-03-14 16:46:46 71

原创 448. 找到所有数组中消失的数字

给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。示例1输入:nums = [4,3,2,7,8,2,3,1]输出:[5,6]示例2输入:nums = [1,1]输出:[2]题解var findDisappearedNumbers = function(nums) { nums.sort((a,b)=>a-b) let l.

2022-03-14 10:27:49 373

原创 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例1输入:strs = ["flower","flow","flight"]输出:"fl"示例2输入:strs = ["dog","racecar","car"]输出:""解释:输入不存在公共前缀。题解var longestCommonPrefix=function(strs){ if(strs.length===0) return '' let prefix = strs[0].

2022-03-02 17:40:58 128

原创 对角线遍历

给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。示例1输入:mat = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,4,7,5,3,6,8,9]示例2输入:mat = [[1,2],[3,4]]输出:[1,2,3,4]题解 var findDiagonalOrder = function(mat){ let backArr = [],l=0,k=0,rowLen = mat.length-1,.

2022-03-01 15:34:41 113

原创 力扣零矩阵

编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零示例1输入:[ [1,1,1], [1,0,1], [1,1,1]]输出:[ [1,0,1], [0,0,0], [1,0,1]]示例2输入:[ [0,1,2,0], [3,4,5,2], [1,3,1,5]]输出:[ [0,0,0,0], [0,4,5,0], [0,3,1,0]]题解var setZeroes = function(m.

2022-03-01 10:08:25 99

原创 力扣旋转矩阵

给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。不占用额外内存空间能否做到?示例1给定 matrix = [ [1,2,3], [4,5,6], [7,8,9]],原地旋转输入矩阵,使其变为:[ [7,4,1], [8,5,2], [9,6,3]]示例2给定 matrix =[ [ 5, 1, 9,11], [ 2, 4, 8,10], [13, 3, 6, 7], .

2022-02-28 13:48:31 165

原创 二维数组合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。示例1输入:intervals = [[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例2输入:intervals = [[1,4],[.

2022-02-28 10:03:14 518

原创 Vue学习(二)

响应式原理defineProperty API(Vue2实现响应式的原理)针对属性监听,不能监听数组,实际上能监听到数组下标变化,但由于性能代价较大被放弃。let getDouble = n=>n*2let obj ={}let count = 1let doubule = getDouble(count)Object.defineProperty(obj,'count',{ get(){ return count } set(val){ count =.

2022-02-22 19:18:44 196

原创 柯里化实现

什么是柯里化函数柯里化(curry)是函数式编程里面的概念:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。每次调用函数时,只接受一部分参数,并返回一个函数,直到传递所有参数为...

2022-02-21 13:32:17 342

原创 防抖节流手动实现

什么是防抖(debounce)所谓防抖,就是指触发事件后n秒后才执行函数,如果n秒内又触发了事件,则会重新计算函数执行时间(类似死歌放大招~)。本质是:某一时间段只执行一次,主要应用场景:大多应用于search搜索联想和window触发resize的时候,不断调整浏览器窗口大小会不断触发这个事件,用防抖来让其只触发一次。节约请求资源。funtion debounce(func,delay){ let timer = null return (..args)=>{ clearTi.

2022-02-17 16:23:34 464

原创 vue3学习(一)

数据发生变化后,如何通知页面更新?Angular1:脏检查,在对数据变化的检查上,遵循每次用户交互时都要检查一次数据是否变化,有变化就去更新DOM。这一方法是数据驱动页面早期的实现。后期Angular引入TypeScipt、RxJS等新内容,但是不支持向前兼容导致Angular这个框架国内没有大面积推广。Vue1:响应式,初始化的时候,Watcher监听数据的每个属性,这样数据发生变化的时候,就能精确地知道数据的哪个key变了,去针对性修改对应的DOM。在网页中使用{{}}渲染一个变量,Vue1就.

2022-02-17 09:23:43 382

原创 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。示例1输入: nums = [1,3,5,6], target = 5输出: 2示例2输入: nums = [1,3,5,6], target = 2输出: 1示例3输入: nums = [1,3,5,6], target = 7输出: 4示例4输入: nums = [1,3,5,6], ta.

2022-02-15 16:25:10 224

原创 寻找数组的中心索引

给你一个整数数组 nums ,请计算数组的 中心下标 。数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。示例1输入:nums = [1, 7, 3, 6, 5, 6]输出:3解释:中心下标是 3 。左侧数之和 sum = nums[0.

2022-02-15 15:34:35 150

原创 数据结构与算法学习(二)

如何实现随机访问数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。线性表:线性表就是数据排成一条线一样的结构。每个线性表上的数据最多只有前后两个方向。 数组、链表、队列、栈等也是线性表结构。非线性表:数据之间并不是简单的前后关系。比如二叉树、堆、图。连续的内存空间和相同类型的数据:这2个限制让数组具有随机访问的特性,但也让数组的许多操作变得非常低效。计算机会给每个内存单元分配一个地址,计算机通过地址来访问内存中得数据。当计算机需要随机访问数组中的某.

2022-02-15 13:41:25 209

原创 数据结构与算法学习(一)

什么是数据结构?什么是算法?广义上:数据结构是一组数据的存储结构,算法是操作数据的一组方法。数据结构与算法是相辅相成得:数据结构是为算法服务的,算法要作用在特定的数据结构之上。数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法、孤立存在的数据结构就是没用的。数据结构和算法解决的是如何更省、更快地存储和处理数据的问题。10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树。10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、.

2022-02-14 17:18:50 645

原创 浏览器工作原理学习(二十二)

网络安全协议HTTPS中间人攻击:在HTTP传输过程总,截取传输内容,伪造和篡改传输内容。数据会经过用户电脑、WiFi路由器、运营商和目标服务器。每个环节数据都有可能被窃取或篡改。在HTTP协议栈中引入安全层:所有经过安全层的数据都会被加密或者解密。即对发起HTTP请求的数据进行加密操作和对接收到HTTP的内容进行解密操作。HTTPS第一版对称加密加密和解密都使用相同的密钥。安全层握手协商:浏览器发起加密套件列表(加密方法)+client-random给服务器;服务器返回加密套件+.

2022-02-11 15:02:05 323

原创 浏览器工作原理学习(二十一)

浏览器安全分为三大块:Web页面安全、浏览器网络安全和浏览器系统安全。Web页面安全什么是同源策略如果两个URL的协议、域名和端口都相同,我们就称这两个URL同源。浏览器默认两个相同的源之间是可以相互访问资源和操作DOM的。如果两个不同的源之间若想要相互访问资源或者操作DOM,那么会有一套基础的安全策略的制约,这就是同源策略。同源策略主要表现在DOM、Web数据和网络这个三个层面。DOM层面:同源策略限制来自不用源的JS脚本对当前DOM对象的读写操作。数据层面:同源策略限制了 不.

2022-02-10 18:23:24 1974

原创 浏览器工作原理学习(二十)

HTTP/0.9HTTP是浏览器最重要且使用最多的协议,是浏览器和服务器之间的通信语言。HTTP/0.9:用于网络之间传递HTML超文本的内容,被陈伟超文本传输协议。超文本传输协议HTTP/0.9的请求过程HTTP基于TCP协议,所以客户端先要根据IP地址、端口和服务器建立TCP连接,而建立连接的过程就是TCP协议三次握手的过程。建立好连接之后,会发生一个GET请求行的信息,如GET/index.html用来获取index.html。服务器接收请求信息之后,读取对应的HTML文件,.

2022-02-10 14:30:31 938

原创 浏览器工作原理学习(十九)

浏览器的三大进化路线应用程序Web化Web应用移动化Web操作系统化渐进式网页应用(PWA)PWA是一套理念,渐进式增强Web的优势,并通过技术手段渐进式缩短和本地应用或者小程序的距离。Web应相对于本地应用缺少了什么Web应用缺少离线使用能力,在离线或者弱网环境下基本上是无法使用的。而用户需要的是沉浸式的体验,在离线或者弱网环境下能够流程地使用时用户对一个应用的基本要求。Web应用缺少了消息推送能力。Web缺少一级入口,也就是将Web应用安装到桌面,在需要的时候直接.

2022-02-09 17:53:55 73

原创 浏览器工作原理学习(十八)

DOM的缺陷JS操作DOM时会影响到整个渲染流水线的。DOM提供了一组JS接口用来遍历或者修改节点,这会引发重排或者重绘。强制同步布局和布局抖动问题也大大降低渲染效率。复杂的页面,DOM结构也就复杂,没触发一次重排或者重绘都是非常耗时的。什么是虚拟DOM将页面改变的内容应用到虚拟DOM上,而不是直接应用到DOM上。变化被应用到虚拟DOM上时,虚拟DOM不是去渲染页面,而是调整虚拟DOM的内部状态,这样操作虚拟DOM的代价就变得很轻。在虚拟DOM收集到足够的改变时,再把这些变化一.

2022-02-09 15:50:12 49

原创 浏览器工作原理学习(十七)

1.显示器是如何显示图像的每个显示器都有固定的刷新频率,通常是60HZ,也就是每秒更新60张图片,更新的图片都来自于显卡中一个叫前缓冲区的地方,显示器就是每秒固定读取60次前缓冲区中的图像,并将读取的图像显示到显示器上。显卡的职责就是合成新的图像,并将图像保存到后缓冲区中,一旦显卡把合成的图像写到后缓冲区,系统就会让后缓冲区和前缓冲区互换,这样就能保证显示器都能读取到最新显卡合成的图像。一般情况下显卡的更新频率和显示器的刷新频率是一致的,但有时候复杂的场景中,显卡处理成一张图片的速度会变慢,这样就会

2022-02-09 14:29:04 1827

原创 浏览器工作原理学习(十六)

请求陷入排队的几种情况页面中的资源是有优先级的,比如CSS、HTML、JS等哦都是页面中的核心文件,所以优先级最高。而图片、视频、音频这类资源就不是核心资源,优先级就比较低,通常当后者遇到前者时,就需要让路,进入待排队状态。浏览器会为每个域名最多维持6个TCP连接,如果发起一个HTTP请求时,这6个TCP连接都处于忙碌状态,那么这个请求就会处于排队状态。网络进程在为数据分配磁盘空间时,新的HTTP请求也需要短暂地等待磁盘分配结束。优化实践线上耗时项排队实践过久,可以让一个站点下面的资.

2022-02-09 10:10:34 753

原创 浏览器工作原理学习(十五)

微任务与宏任务宏任务为了协调任务在主线程上执行,页面进程引入消息队列和事件循环机制,渲染进程内部会维护多个消息队列,主线程从这些任务队列中取出任务执行,这写消息队列种的任务称为宏任务。微任务第一种:把异步回调函数封装成一个宏任务,添加到消息队列尾部,当循环系统执行到该任务的时候执行回调函数。第二种:在主函数执行结束后,当前宏任务结束之前执行回调函数,这通常都是以微任务形式体现。本质是:微任务就是一个需要异步执行的函数,执行时机是在主函数执行结束之后、当前宏任务结束之前。每个宏.

2022-02-08 13:59:06 211

原创 浏览器工作原理学习(十四)

WebAPI:setTimeout浏览器如何实现setTimeout执行一段异步任务,需要先将任务添加到消息队列中。为了保证回调函数能在指定时间内执行,定时任务的回调函数不能直接添加到消息队列。延迟队列:维护消息队列中需要延迟执行的任务列表。...

2022-02-07 11:05:36 262

原创 浏览器工作原理学习(十三)

消息队列和事件循环系统消息队列消息队列是一种数据结构,可以存放要执行的任务。它符合队列先进先出的特点。IO线程中的产生的新任务会添加进消息队列尾部。渲染主线程会循环地从消息队列头部中读取任务,执行任务。由于多个线程操作同一个消息队列,所以在添加任务和取出任务时还会加上一个同步锁。渲染进程专门有一个IO线程用来接收其他进程传进来的消息,接收到消息后,会将这些消息组成任务发送渲染主线程。消息队列中的任务类型:输入事件、微任务、文件读写、webSocket、JS定时器、JS执行、解析DOM.

2022-01-18 16:54:11 380

原创 浏览器工作原理学习(十二)

编译器和解释器按语言的执行流程,可以把语言划分为编译型语言和解释型语言。编译型语言:在程序执行前,需要经过编译器的编译过程,并且编译之后会直接保留机器能读懂的二进制文件,这样每次运行程序时,都可以直接运行该二进制文件,而不需要重新编译。解释性语言:在程序运行时每次都需要通过解释器对程序进行动态解释和执行。编译器工作流程:编译器依次对源代码进行词法分析、语法分析,生成抽象语法树(AST)——>词义分析生成中间代码——>代码优化生成二进制文件——>直接执行。解释器工作流程:解释.

2022-01-18 14:03:51 77

原创 浏览器工作原理学习(十一)

语言类型在使用前需要确认其变量数据类型的称为静态语言©,运行过程中需要检查数据类型的语言称为动态语言(js)。在赋值时,语言回进程隐式类型转换,这类语言被称为弱类型语言,不支持隐式类型转换额语言称为强类型语言。JS数据类型JS是一种弱类型的、动态的语言:弱类型即不需要声明变量类型JS引擎在运行代码的时候会自己计算出来,动态即可以使用一个变量保存不同类型的数据。原始类型:Boolean、Null、Undefined、Number、Sybmol、String、BigInt。引用类型:O.

2022-01-17 16:17:10 300

原创 浏览器工作原理学习(十)

this在对象内部的方法中使用对象内部的属性是一个非常普遍的需求。但JS的作用域机制并不支持这一点,为此,JS高出了this机制。this 和作用域链是2套不同的系统。什么是this?this是和执行上下文绑定的, 每个执行上下文中都有一个this。分三种类型:全局执行上下文中的this,函数中的this,eval中的this。全局执行上下文中的this是指向window对象的,这是this合作用域链唯一的交点,作用域链的最底端包含了window对象,全局执行上下文中的this也是.

2022-01-17 11:13:06 328

原创 浏览器工作原理学习(九)

作用域链什么是作用域链?每个执行上下文的变量环境中,都包含了一个外部引用,用来指向外部的执行上下文,我们把外部引用称为outer。JS引在执行全局上下文中查找,这个查找的链条就是被称为作用域链。什么是词法作用域?词法作用域是指作用域是由代码中函数声明的位置来决定的,所以词法作用域是静态的作用域,通过它就能够预测代码在执行过程中如何查找标识符。词法作用域是代码编译阶段就决定好的,和函数怎么调用没关系。块级作用域中变量查找:块级作用域内词法环境——>块级作用域变量环境——&.

2022-01-12 16:52:47 194

原创 浏览器工作原理学习(八)

作用域全局作用域中的对象在代码中的任何地方都能访问,其生命周期伴随着页面的生命周期。函数作用域就是在函数内部定义的变量或者函数,并且定义的变量或函数只能在函数内部访问,函数执行结束后,函数内部定义的变量会被销毁。块级作用域就是使用一对大括号包裹的一段代码,比如函数、判断语句、循环语句甚至是单独的一个{}都会被是为一个块级作用域,JS在ES6之后引入块级作用域。变量提升所带来的问题变量容易在不被察觉的情况下被覆盖掉:JS在执行上下文时,先使用函数执行上下文里面的变量。本应销毁的变量没.

2022-01-12 10:39:43 158

原创 浏览器工作原理学习(七)

在执行前就进行编译并创建执行上下文的三种情况当JS执行全局代码得时候,会编译全局代码并创建全局执行上下文,而且在整个页面的生存周期内,全局执行上下文只有一份。当调用一个函数的时候,函数体内的代码会被编译,并创建函数执行上下文,在函数执行结束后,会被销毁。当使用eval函数的时候,eval的代码也会编译,并创建执行上下文。调用栈(用来管理函数调用关系的一种数据结构)什么是函数调用?本质是,就是运行一个函数,在执行函数前,JS引擎会为代码创建全局执行上下文,包含了声明的函数和变量。.

2022-01-11 17:37:15 130

原创 浏览器工作原理学习(六)

JS执行上下文在执行过程中,若使用未声明的变量JS会报错。在一个变量定义前使用它,不会出错,但是该变量的值为undefined,而不是定义时的值。在一个函数定义前使用它,不会出错,且函数能正确执行。变量提升(Hoisting)JS代码在执行过程中,JS引擎会把变量的声明部分和函数的声明部分提升到代码开头,这一行为被称为变量提升。变量提升后,会给变量设置默认值undefined。//变量提升 // 函数声明 function showName (){ console.log.

2022-01-11 14:20:05 144

空空如也

空空如也

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

TA关注的人

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