JavaScript案例0322

以下是一些涵盖不同高级JavaScript概念和应用的案例,每个案例都有详细解释:


案例1:实现 Promise/A+ 规范的手写 Promise

class MyPromise {constructor(executor) {this.state = 'pending';this.value = undefined;this.reason = undefined;this.onFulfilledCallbacks = [];this.onRejectedCallbacks = [];const resolve = (value) => {if (this.state === 'pending') {this.state = 'fulfilled';this.value = value;this.onFulfilledCallbacks.forEach(fn => fn());}};const reject = (reason) => {if (this.state === 'pending') {this.state = 'rejected';this.reason = reason;this.onRejectedCallbacks.forEach(fn => fn());}};try {executor(resolve, reject);} catch (err) {reject(err);}}then(onFulfilled, onRejected) {const promise2 = new MyPromise((resolve, reject) => {const microtask = (fn, value) => {queueMicrotask(() => {try {const x = fn(value);resolvePromise(promise2, x, resolve, reject);} catch (e) {reject(e);}});};if (this.state === 'fulfilled') {microtask(onFulfilled, this.value);} else if (this.state === 'rejected') {microtask(onRejected, this.reason);} else {this.onFulfilledCallbacks.push(() => microtask(onFulfilled, this.value));this.onRejectedCallbacks.push(() => microtask(onRejected, this.reason));}});return promise2;}
}// 辅助函数处理不同返回值类型
function resolvePromise(promise2, x, resolve, reject) {// ...完整实现需要处理thenable对象和循环引用等情况
}

技术点

  • Promise状态机实现
  • 微任务队列(queueMicrotask)
  • 链式调用和值穿透
  • 递归解析处理

案例2:使用 Proxy 实现自动化表单校验

const validator = {set(target, prop, value) {const rules = {username: val => val.length >= 5 && val.length <= 20,password: val => /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/.test(val),age: val => Number.isInteger(val) && val >= 18};if (!rules[prop](value)) {throw new Error(`Invalid ${prop} value`);}target[prop] = value;return true;}
};const formData = new Proxy({}, validator);// 使用示例
try {formData.username = 'user123'; // 有效formData.password = 'pass1234'; // 无效,触发错误
} catch (e) {console.error(e.message);
}

技术点

  • Proxy API 的应用
  • 数据劫持与校验
  • 正则表达式验证
  • 自定义错误处理

案例3:实现前端路由系统(Hash模式)

class HashRouter {constructor() {this.routes = {};window.addEventListener('hashchange', this.load.bind(this));}addRoute(path, callback) {this.routes[path] = callback;}load() {const hash = window.location.hash.slice(1) || '/';const [path, queryString] = hash.split('?');const query = new URLSearchParams(queryString);if (this.routes[path]) {this.routes[path](Object.fromEntries(query.entries()));} else {this.routes['404']?.();}}navigate(path, query = {}) {const queryStr = new URLSearchParams(query).toString();window.location.hash = `${path}${queryStr ? `?${queryStr}` : ''}`;}
}// 使用示例
const router = new HashRouter();
router.addRoute('/about', (params) => {console.log('About page', params);
});
router.navigate('/about', { from: 'home' });

技术点

  • Hash路由原理
  • URLSearchParams API
  • 发布-订阅模式
  • 浏览器历史管理

案例4:Web Worker 多线程图像处理

// 主线程
const worker = new Worker('image-worker.js');
const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');canvas.addEventListener('change', async (e) => {const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);worker.postMessage({pixels: imageData.data.buffer,width: canvas.width,height: canvas.height,filterType: 'grayscale'}, [imageData.data.buffer]);worker.onmessage = ({ data }) => {ctx.putImageData(new ImageData(new Uint8ClampedArray(data), 0, 0);};
});// image-worker.js
self.addEventListener('message', ({ data }) => {const pixels = new Uint8ClampedArray(data.pixels);// 应用滤镜(灰度化)for (let i = 0; i < pixels.length; i += 4) {const avg = (pixels[i] + pixels[i+1] + pixels[i+2]) / 3;pixels[i] = avg; // Rpixels[i+1] = avg; // Gpixels[i+2] = avg; // B}self.postMessage(pixels.buffer, [pixels.buffer]);
});

技术点

  • Web Worker 多线程
  • Transferable Objects
  • Canvas 像素操作
  • 图像处理算法

案例5:实现 Observable 响应式编程

class Observable {constructor(subscribe) {this._subscribe = subscribe;}subscribe(observer) {const subscription = {unsubscribed: false,unsubscribe() {this.unsubscribed = true;}};this._subscribe({next: val => {if (!subscription.unsubscribed) observer.next(val);},error: err => observer.error?.(err),complete: () => observer.complete?.()});return subscription;}pipe(...operators) {return operators.reduce((prev, fn) => fn(prev), this);}static fromEvent(element, eventName) {return new Observable(observer => {const handler = e => observer.next(e);element.addEventListener(eventName, handler);return () => element.removeEventListener(eventName, handler);});}
}// 使用示例
const click$ = Observable.fromEvent(document, 'click').pipe(throttle(1000),map(e => ({ x: e.clientX, y: e.clientY })));click$.subscribe({next: pos => console.log('Clicked at:', pos)
});

技术点

  • 观察者模式
  • 函数式编程
  • 操作符链式调用
  • 事件流处理

这些案例覆盖了:

  1. 异步编程核心(Promise)
  2. 元编程(Proxy)
  3. 前端架构(路由)
  4. 性能优化(Web Worker)
  5. 响应式编程(Observable)

每个案例都可以进一步扩展实现更多高级功能。例如在Promise实现中添加async/await支持,在路由系统中添加嵌套路由等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38583.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优选算法的睿智之林:前缀和专题(一)

专栏&#xff1a;算法的魔法世界 个人主页&#xff1a;手握风云 目录 一、前缀和 二、例题讲解 2.1. 一维前缀和 2.2. 二维前缀和 2.3. 寻找数组的中心下标 2.4. 除自身以外数组的乘积 一、前缀和 前缀和算法是一种用于处理数组或序列数据的算法&#xff0c;其核心思想是…

瑞萨RX23E系列开发(二)建立工程

新建工程 使用倒数第二个模板 选择路径 我这里是这个型号。根据型号选择芯片 第一次需要下载FIT

【算法day19】括号生成——数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

括号生成 https://leetcode.cn/problems/generate-parentheses/description/ 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 左括号数必须大于右括号数&#xff0c;且小于等于n class Solution { publ…

Apache Doris学习

https://doris.apache.org/zh-CN/docs/gettingStarted/what-is-apache-doris 介绍 Apache Doris 是一款基于 MPP 架构&#xff08;大规模并行处理&#xff09;的高性能、实时分析型数据库。它以高效、简单和统一的特性著称&#xff0c;能够在亚秒级的时间内返回海量数据的查询…

基于springboot的新闻推荐系统(045)

摘要 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了新闻推荐系统的开发全过程。通过分析企业对于新闻推荐系统的需求&#xff0c;创建了一个计算机管理新闻推荐系统的方案。文章介绍了…

Jboss漏洞再现

一、CVE-2015-7501 1、开环境 2、访问地址 / invoker/JMXInvokerServlet 出现了让下载的页面&#xff0c;说明有漏洞 3、下载ysoserial工具进行漏洞利用 4、在cmd运行 看到可以成功运行&#xff0c;接下来去base64编码我们反弹shell的命令 5、执行命令 java -jar ysoserial-…

(二)VMware:VMware虚拟机安装CentOS教程

目录 1、准备CentOS 7镜像1.1、官网镜像下载1.2、清华大学开源镜像下载​1.3、阿里云开源镜像下载 2、使用 VMware安装CentOS 72.1、创建虚拟机2.2、选择自定义安装2.3、硬件兼容性&#xff0c;保持默认2.4、选择下载的ISO镜像2.5、设置虚拟机名称以及存放磁盘位置2.6、按照需求…

哈尔滨工业大学DeepSeek公开课人工智能:从图灵测试到DeepSeek|附视频和PPT下载方法

导 读 INTRODUCTION 今天给大家分享一份哈尔滨工业大学发布的《从图灵测试到DeepSeek》&#xff0c;由哈尔滨工业大学人工智能学院执行院长兼计算学部副主任张伟男教授带你穿越AI发展简史&#xff0c;解锁从图灵测试的奠基性思想到DeepSeek大模型的技术突破&#xff0c;带你领…

【算法笔记】图论基础(一):建图、存图、树和图的遍历、拓扑排序、最小生成树

目录 何为图论图的概念 图的一些基本概念有向图和无向图带权图连通图和非连通图对于无向图对于有向图 度对于无向图对于有向图一些结论 环自环、重边、简单图、完全图自环重边简单图 稀疏图和稠密图子图、生成子图同构 图的存储直接存边邻接矩阵存边邻接表存边链式前向星存边 图…

vue 对接 paypal 订阅和支付

一个是支付一个是订阅&#xff0c;写的时候尝试把他们放到一个里面&#xff0c;但是会报错&#xff0c;所以分开写了 我们的页面&#xff0c;前三个为订阅最后一个是支付&#xff0c;我把他们放到一个数组里面循环展示的&#xff0c;所以我们判断的时候只要判断id是否为4&#…

(四)---四元数的基础知识-(定义)-(乘法)-(逆)-(退化到二维复平面)-(四元数乘法的导数)

使用四元数的原因 最重要的原因是因为传感器的角速度计得到的是三个轴的角速度, 这三个轴的角速度合成一个角速度矢量, 结果就是在微小时间内绕着这个角速度矢量方向为轴旋转一定角度. 截图来源网址四元数 | Crazepony开源四轴飞行器

Android10 系统截屏功能异常的处理

客户反馈的问题&#xff0c;设备上使用状态栏中“长截屏”功能&#xff0c;截屏失败且出现系统卡死问题。 在此记录该问题的处理 一现象&#xff1a; 设备A10上使用系统“长截屏”功能&#xff0c;出现截屏失败&#xff0c;系统死机。 二复现问题并分析 使用设备操作该功能&…

工业软件的破局与重构:从技术依赖到自主创新的未来路径

工业软件作为现代工业的“神经与大脑”&#xff0c;不仅是制造业数字化转型的核心工具&#xff0c;更是国家工业竞争力的战略制高点。近年来&#xff0c;中国工业软件市场在政策驱动与技术迭代中迅猛发展&#xff0c;但核心技术受制于人的困境仍待突破。如何实现从“跟跑”到“…

Git基础

一、git概述 git简介 什么是Git? Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件(Java类、ml文件、html页面等)。通过Gt仓库来存储和管理这些文件&#xff0c;Git仓库分为两种&#xff1a; ●本地仓库&#xff1a;开发人员自己电脑上的Git仓库…

Idea中使用Git插件_合并当前分支到master分支_冲突解决_很简单---Git工作笔记005

由于之前用svn习惯了,用的git少,其实在idea中使用git,解决冲突,合并分支,非常的简单,一起来看一下吧. 一定要注意操作之前,一定要确保自己的分支代码,都已经commit提交了,并且push到远程了. 不要丢东西. 可以看到首先,在idea的左下角有个 git,点开以后 可以看到有显示的分支…

大数据学习栈记——HBase操作(shell java)

本文介绍HBase在shell终端的常见操作以及如何利用java api操作HBase&#xff0c;操作系统&#xff1a;Ubuntu24.04 参考&#xff1a; https://blog.51cto.com/u_16099228/8016429 https://blog.csdn.net/m0_37739193/article/details/73618899 https://cloud.tencent.com/d…

【DETR】训练自己的数据集以及YOLO数据集格式(txt)转化成COCO格式(json)

目录 1.DETR介绍2.数据集处理3.转化结果可视化4.数据集训练4.1修改pth文件4.2类别参数修改4.3训练 5.成功运行&#xff01;6.参考文献 1.DETR介绍 DETR(Detection with TRansformers)是基于transformer的端对端目标检测&#xff0c;无NMS后处理步骤&#xff0c;无anchor。 代码…

HashMap学习总结——JDK17

文章目录 HashMap构造方法HashMap(int initialCapacity, float loadFactor)loadFactor 加载因子initialCapacity 初始容量tableSizeFor(int cap) 计算前导零 HashMap(Map<? extends K, ? extends V> m) put(K key, V value)hash(Object key) 求hash值putVal(int hash, …

Linux:进程信号

✨✨所属专栏&#xff1a;Linux✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ Linux&#xff1a;进程信号 在讲信号之前&#xff0c;我们先来从生活中的事情来确定信号的一些特性。 我在网上买了商品&#xff0c;我在等快递。但是在快递没来之前我知道快递来的时候我应该怎么处理。…

c#知识点补充2

1.非静态类能否调用静态方法可以 2.对string类型扩展方法&#xff0c;如何进行 类用静态类&#xff0c;参数是this 调用如下 3.out的用法 一定要给a赋值 这种写法不行 这样才行 4.匿名类 5.委托的使用 无论是匿名委托&#xff0c;还是具命委托&#xff0c;委托实例化后一定要…