- 博客(122)
- 收藏
- 关注
原创 JS手写代码篇---手写sleep
sleep功能可以通过Promise封装setTimeout实现,用于在代码中引入延迟。该方法接收毫秒参数,在指定时间后resolve Promise,从而支持异步等待。相比直接使用setTimeout,Promise封装提供了更好的可读性、链式调用和错误处理能力,使异步流程更易管理。这种实现方式兼顾了灵活性和代码维护性。
2025-06-12 17:51:16
43
原创 React---Hooks深入
今天学习了React的几个核心Hook:useEffect用于处理副作用操作(如DOM更新、网络请求),可通过返回值实现清除逻辑;useContext简化了Context的值获取;useReducer作为useState的替代方案,适合复杂状态逻辑;useCallback和useMemo则用于性能优化,分别记忆化函数和值。这些Hook极大地简化了React的功能实现方式。
2025-06-12 17:49:17
650
原创 JS手写代码篇---手写深拷贝
今天学习了深拷贝函数的实现,其实深拷贝与浅拷贝最大的不同就是对于嵌套的对象,浅拷贝是直接复制引用,这样的话修改值也会修改原来的值,这就不算是真正的复制了。深拷贝新建了有个对象,这样的话新建的和之前的就是独立的了,做法就是在浅拷贝的基础上面对于嵌套的都西昂进行递归!
2025-06-11 18:58:10
130
原创 React---Hooks初步
React Hooks让函数式组件开发更加简洁高效,解决了this绑定问题。通过useState可以轻松管理组件状态,包括基本数据类型、数组和对象等复杂数据结构。真的太好用了!!!
2025-06-11 18:53:41
33
原创 JS手写代码篇---手写浅拷贝
今天手写了浅拷贝,浅拷贝很简单,就是对浅层的复制,遍历循环判断自身属性就可以了,随之而来的是如果对象的属性是嵌套对象,浅拷贝只会复制引用,而不是新对象。
2025-06-10 17:32:33
339
原创 React---day12
今天学习了react里面的路由,学习了里面的很多API,比如Link,Navlink,Route,我跟的课程版本有点老了,switch变成了routes,redirect变成了navigate,路由的嵌套也发生了很大的变化,摈弃了config的方法
2025-06-10 17:28:58
484
原创 JS手写代码篇----使用Promise封装AJAX请求
Promise封装AJAX请求,和上面的封装ajax大部分相同,就是多了promise自带的resolve和reject函数,这样就不用写成功和失败的回调函数啦!
2025-06-09 19:49:50
289
原创 React---day11
今天有深入了一下redux中的异步请求,因为reducer处理的是同步的action,异步的需要通过中间件将异步action转化为同步action,有两种方案:redux-thunk和redux-saga,它们最大的不同就是耦合性的问题
2025-06-09 19:44:47
730
原创 JS手写代码篇---手写ajax
AJAX请求允许网页异步获取服务器数据而不刷新整个页面。实现步骤包括:创建XMLHttpRequest对象,设置超时和回调函数,监听请求状态,处理网络/超时错误,设置请求头和响应类型后发送请求。示例代码展示了完整的AJAX实现流程:定义成功/失败回调,检查HTTP状态码,处理响应数据或错误信息。该方法通过异步通信提升了用户体验,避免了页面重载。
2025-06-08 22:42:45
401
原创 JS手写代码篇---手写函数柯里化
函数柯里化是将多参数函数转换为单参数链式调用的技术,我写的存在参数收集不完整、逻辑复杂等问题,后面进行了改进判断参数数量决定执行函数或继续收集参数,符合柯里化的通用实现。主要问题包括结构复杂、参数收集不完整、递归使用不当等。改进后的方案通过apply合并参数,实现了更优雅的链式调用。
2025-06-06 18:51:27
252
原创 React---day10
今天把transition学完了,然后学习了一点redux,Redux 是一个用于 JavaScript 应用程序的状态管理库,主要用于解决复杂应用中的状态管理问题。它的核心思想是提供一种可预测的状态管理机制,通过集中式存储(Store)来管理应用的所有状态,从而简化状态更新和组件间的数据共享。
2025-06-06 18:44:53
933
原创 JS手写代码篇---bind手写
今天手写了bind,通过前两天的手写call和apply对于改变this指向我已经是很熟悉了,唯一不同的就是bind返回一个新的函数,函数也是要执行参数的,这一点没有太注意。
2025-06-05 15:44:37
180
原创 React---day9
今天主要学习了react里面的style写法中的styled-components、axios封装、react-transition-group中的CSSTransition,我发现我用的19一般都会有很大的问题,版本不兼容之类的,都要把19的版本修改为18,好头疼!!!
2025-06-05 15:12:39
753
原创 JS手写代码篇---手写apply方法
apply方法允许调用函数时设置this值并以数组形式传递参数,与call方法的主要区别在于参数传递方式。手写实现时需要注意三点:1)验证调用对象是否为函数;2)处理this值为null或undefined的情况;3)对参数数组进行特殊处理,当参数为null/undefined时需单独处理。文中还对比了手写apply和call的区别,指出apply必须对参数数组进行判断,而call则不需要。
2025-06-04 16:52:28
870
原创 React---扩展补充
今天学习了一些拓展内容:React高阶组件、转发ref和Portal,太多内容啦,脑子有时候有点接收不过来,在实际应用的时候要多多使用,写了一下高阶组件的案例,感觉它就是很组件化哈哈哈哈,让代码优雅不少呢!
2025-06-04 16:48:19
529
原创 JS手写代码篇---手写call函数
今天主要手写了call方法:改变函数的 this 指向并立即执行该函数大概思路就是:通过将函数作为对象的方法调用来改变 this 指向手写代码最麻烦的就是有很多的边界需要考虑:- 检查调用者是否为函数- 处理 null/undefined 上下文的情况- 确保不污染传入的对象
2025-06-03 17:13:54
247
原创 React---day8
今天主要学习了不可变数据、全局事件传递和受控组件。在不可变数据部分,强调不能直接修改state,推荐使用新数组替代原数组来维护数据不可变性。通过EventEmitter实现跨组件事件通信,也直接敲了事件监听与触发的完整流程。最后学习了受控组件的实现方式,即表单元素值由React state控制。
2025-06-03 17:10:17
618
原创 JS手写代码篇---手写类型判断函数
先使用typeof判断输入对象的类型,如果是值类型就直接返回typeof识别到的类型,如果不是就要使用Object.prototype.toString.call()返回表示对象类型的字符串。
2025-06-02 21:36:01
189
原创 JS手写代码篇---手写节流函数
节流函数是一种性能优化技术,它控制函数在指定时间间隔内只能执行一次。与防抖函数延迟执行不同,节流函数直接限制执行频率。示例代码通过记录上一次执行时间,确保在等待时间内不再重复执行。适用于滚动事件等高频触发的场景。防抖则更适合如搜索输入框等需要等待用户停止输入的场景。
2025-05-30 22:51:39
609
原创 React---day5
React组件分为函数组件和类组件,依据状态可分为无状态和有状态组件,按职责分为展示型和容器型组件。React生命周期包括挂载(Mount)、更新(Update)和卸载(Unmount)阶段,关键方法如componentDidMount、componentDidUpdate和componentWillUnmount分别处理初始加载、更新和清理逻辑。组件间数据传递主要通过props实现父传子通信。
2025-05-30 22:49:45
1225
原创 React---day4
今天学习了一下react的脚手架,有了脚手架还是会轻松很多噢,但是我发现我的react版本太新了何老师的很多都不一样,看来之后需要ai加文档学习了。
2025-05-29 11:26:03
771
原创 JS手写代码篇---Pomise.race
今天学习了手写promise.race,和promise.all嘴不停的就是他是只要有应该promise结束就要返回了,所以和all也有很大的不一样。哦哦哦~学到了一个小tips,Promise.resolve可以将每个元素转换为Promise,以处理非Promise的情况。
2025-05-28 15:47:49
624
原创 React---day3
今天学习了jsx的本质,之前我一直阶段学习本质没有什么必要,但是我发现学习完底层原理之后写代码会清晰很多。然后今天还进行了应该阶段小练习,也是写了很久,也深深明白了setState里面是不允许改变原有的数据的,还有就是调用函数哪一个地方,真的是深有感悟,一辈子都记得了哈哈哈哈哈
2025-05-28 15:44:38
568
原创 JS手写代码篇---手写promise.all
promise.all方法主要是处理多个异步的调用问题,传入一个数组,返回的是新的promise对象,它是静态方式。所以传入数组后我们循环遍历了这个数组,如果它是普通值,如果是就要直接添加到结果数组里卖弄,如果不是,then等待结果,只要有一个错误,那么就直接reject,最后当结果数组的长度和传入数组的长度相同的时候就要resolve啦~~
2025-05-27 23:01:13
336
原创 React---day2
嗨嗨嗨!!!从南京gap回来啦,南京真的是很美很有历史底蕴的城市呢,好想再去一次哈哈。今天主要学了一些jsx的核心语法,和vue有一些相似也有很多不同。主要讲了嵌入、绑定以及渲染三个方面,具体在下方,明天也要继续加油!!!
2025-05-27 14:18:35
767
原创 React---day1
啦啦,今天对react有了一点点新的认识捏,从react的基本框架到绑定数据最后再到编写函数改变数据的值,让我一步一步揭开react的面纱,它的语法确实要灵活很多,组件化也体现了出来,很期待接下来的学习内容。
2025-05-21 20:52:26
705
原创 JS手写代码篇---手写Promise
手写 Promise 的核心在于实现状态管理、异步回调和链式调用。首先,Promise 有三种状态(pending/fulfilled/rejected),通过构造函数接收执行器函数,并用 `resolve` 和 `reject` 更新状态。
2025-05-21 20:50:09
760
原创 力扣算法---哈希表总结篇
一般来说哈希表都是用来快速判断一个元素是否出现集合里。对于哈希表,要知道哈希函数和哈希碰撞在哈希表中的作用。哈希函数是把传入的key映射到符号表的索引上。哈希碰撞处理有多个key映射到相同索引上时的情景,处理碰撞的普遍方式是拉链法和线性探测法。
2025-05-21 20:47:41
245
原创 Vue.js---立即执行的watch与回调执行时机
Vue.js中watch有两个关键特性:立即执行的回调函数和回调函数的执行时机。首先,当immediate选项为true时,watch会在创建时立即执行一次回调函数。通过封装scheduler调度函数,可以在初始化和数据变更时执行回调。其次,flush选项用于指定调度函数的执行时机,当flush为'post'时,回调函数会被放入微任务队列,等待DOM更新后执行;否则,回调函数会同步执行。
2025-05-19 16:22:15
282
原创 力扣算法ing(73 / 100)
四数相加就体现了map的好处,受到之前两数相加的启发,我选择了先计算前面两个数进入map,后遍历后两个数求和看看是否存在与map当中,如果存在我直接ans++,但是第一次提交的时候答案错误了,ans++代表的是map里面只有一个sum,但是有的时候可能会有多个,所以正确方法一个是将次数也要存起来,直接用ans加次数就可以了。
2025-05-17 17:47:59
927
原创 Vue.js---watch 的实现原理
这一次接触到了平时使用的watch属性,它的底层实现其实就是effect以及options.scheduler,为了更加通用watch 使用 traverse 函数递归遍历对象的所有属性。然后我们也实现了传入getter函数,主要是对source进行判断,函数就赋值给getter直接执行,参数就traverse 递归遍历,最后我们通过懒加载 effect 实现了新旧值的对比,确保回调函数能够获取到变化前后的值。
2025-05-17 17:46:28
361
原创 JS手写代码篇---手写 new 操作符
new的手写主要通过它实现的四个步骤进行一一实现,创建一个原型被设置为构造函数的 prototype 属性的对象,改变this的指向,判断新对象的类型最后进行对应的处理。
2025-05-17 17:41:27
355
原创 力扣算法ing(72 / 100)
本文介绍了两个与哈希表相关的算法问题:两个数组的交集和快乐数。对于两个数组的交集问题,通过使用Set数据结构来去重,并利用Set的has方法判断元素是否存在于另一个数组中,最终返回交集。优化后的代码通过减少遍历次数和直接使用Set的特性,提升了效率。对于快乐数问题,通过不断计算数字各位的平方和,并使用Set记录中间结果,判断是否进入循环或最终得到1,从而确定是否为快乐数。两个问题都充分利用了Set的去重和查找特性,展示了哈希表在解决此类问题中的优势。
2025-05-16 21:36:25
689
原创 Vue.js---计算属性computed和lazy
computed属性的实现我们首先用到了懒加载effect,需要使用的时候才使用。因为我们前面返回了effectFn作为effect函数的返回值,那我们就可以手动调用该副作用函数了。接着我们实现了computed属性,我们是传入一个getter函数和懒加载属性,为了解决多次访问会导致effectFn多次计算,我们需要缓存value。但是我们如果修改obj.foo的值,我们发现并没有响应的修改最后的sumRes,那是因为dirty并没有在修改值之后被修改为true,所以我们就要使用scheduler选项,在
2025-05-16 21:33:28
668
原创 JS手写代码篇---手写 instanceof 方法
instancecof用于检测一个对象是否是某个构造函数的实例。它通常用于检查对象的类型,尤其是在处理继承关系时。这种原型链机制是 JavaScript 继承和原型继承的基础。通过原型链,JavaScript 实现了对象的属性和方法的继承。这就让我想到本道题木的解题思路:在函数当中我们输入目标和待测类型,进行循环,如果原型链上有待测类型的原型返回true,没有也就是当了原型链的终点null,返回false
2025-05-16 21:16:35
218
原创 JS手写代码篇---手写 Object.create
在手写代码时,理解代码的作用和实现效果是关键。以手写 Object.create 为例,其核心思路是创建一个新对象,并将传入的对象作为其原型。通过定义一个构造函数 F,将其原型设置为传入的对象 obj,然后返回 F 的实例,即可实现类似 Object.create 的功能。测试结果表明,手写的 create 函数与原生 Object.create 方法效果一致,成功创建了以 person 为原型的新对象 child1。
2025-05-15 18:07:51
231
原创 Vue.js---避免无限递归循环&& 调度执行
今天一下子看了两小节的内容,首先是避免无限循环:在执行无限循环的时候track何trgger的副作用函数都是activeEffect,那么解决方法就是在trigger当中判断activeEffect和effect函数是否是相同的。然后我看了调度,其实vue当中控制调度是添加一个调度函数来实现的,传入一个调度函数,在track当中处理这个调度函数,trigger就执行调度方法。
2025-05-15 17:45:41
462
原创 力扣算法ing(71 / 100)
本道题考的是对set的敏感度,我们知道set最大的优点就是不含重复的值,这对于本道题目有大大滴好处,先初始化一个对比set,后nums2是否在set中,在处理nums2进答案数组的时候,也是为了去重,我们事先将答案数组转化为set,后转化为数组的。
2025-05-15 14:56:31
200
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人