20个超实用的JavaScript高级技巧

1.Intersection Observer:

  • 用途: 监听元素与其父元素或视口的交叉情况。
  • 使用场景: 懒加载图片、实现无限滚动。
const callback = (entries, observer) => {entries.forEach(entry => {if (entry.isIntersecting) {console.log('Element is in the viewport!');}});
};const options = {root: null, // use the viewport as the rootthreshold: 0.5 // trigger when 50% of the element is visible
};const observer = new IntersectionObserver(callback, options);
observer.observe(myElement);

2.Promise 和 异步/await:

  • 用途: 更优雅地处理异步操作。
  • 使用场景: 异步数据请求、避免回调地狱。
function fetchData() {return new Promise(resolve => {// 异步操作resolve(data);});
}async function fetchDataAsync() {const data = await fetchData();console.log(data);
}

3.Map 和 Set 数据结构:

  • 用途: 提供更灵活的键值对存储或存储唯一值。
  • 使用场景: 数据集合、唯一值存储。
const myMap = new Map();
myMap.set('key', 'value');const mySet = new Set([1, 2, 3, 4, 5]);

4.Proxy 和 Reflect:

  • 用途: 对对象的操作进行自定义处理。
  • 使用场景: 拦截对象操作、监控对象变化。
const handler = {get(target, prop) {console.log(`Getting property ${prop}`);return target[prop];}
};const proxy = new Proxy(myObject, handler);

5.函数柯里化 (Function Currying):

  • 用途: 将多参数函数转化为一系列单参数函数。
  • 使用场景: 部分应用函数、参数复用。
const curry = fn => (...args) =>args.length >= fn.length ? fn(...args) : curry(fn.bind(null, ...args));const add = (a, b, c) => a + b + c;
const curriedAdd = curry(add);

6.Generator 函数:

  • 用途: 暂停和继续执行的函数。
  • 使用场景: 数据流控制、异步流程管理。
function* generateSequence() {yield 1;yield 2;yield 3;
}const myGenerator = generateSequence();
console.log(myGenerator.next().value); // 1

7.WeakMap 和 WeakSet:

  • 用途: 提供弱引用的集合,不阻止垃圾回收。
  • 使用场景: 隐藏信息、轻量级缓存。
const myWeakMap = new WeakMap();
const keyObject = {};
myWeakMap.set(keyObject, 'value');

8.扩展运算符和剩余参数 (Spread Operator and Rest Parameters):

  • 用途: 扩展数组、对象,或使用剩余参数收集函数参数。
  • 使用场景: 合并数组、对象,动态参数传递。
const newArray = [...oldArray, newValue];
function sum(...args) { return args.reduce((acc, val) => acc + val, 0); }

9.Web Workers:

  • 用途: 在后台线程中运行 JavaScript 代码,提高性能。
  • 使用场景: 复杂计算、并发请求。
// In main.js
const worker = new Worker('worker.js');
worker.postMessage('Hello from main.js!');// In worker.js
onmessage = event => {console.log('Message received in worker.js:', event.data);
};

10.异步迭代器:

  • 用途: 迭代异步数据流。
  • 使用场景: 从 API 获取流数据、处理异步序列。
const fetchData = async () => {const response = await fetch('https://api.example.com/data');const dataStream = response.body.getReader();while (true) {const { done, value } = await dataStream.read();if (done) break;console.log(value);}
};fetchData();

11.Object.freeze():

  • 用途: 使对象不可变,防止更改。
  • 使用场景: 确保数据完整性,防止意外修改。
const myObject = { prop1: 'value1', prop2: 'value2' };
const frozenObject = Object.freeze(myObject);// 试图修改将在严格模式下导致错误
frozenObject.prop1 = 'new value';

12.记忆化:

  • 用途: 缓存函数结果,避免重复计算。
  • 使用场景: 大场景的函数调用、递归算法。
const memoize = (func) => {const cache = {};return (...args) => {const key = JSON.stringify(args);if (cache[key]) {return cache[key];} else {const result = func(...args);cache[key] = result;return result;}};
};const expensiveCalculation = memoize((n) => {console.log('进行昂贵的计算...');return n * 2;
});console.log(expensiveCalculation(5));  // 执行计算
console.log(expensiveCalculation(5));  // 返回缓存的结果

13.自定义事件:

  • 用途: 实现自定义事件系统进行通信。
  • 使用场景: 组件通信、发布/订阅模式。
const eventEmitter = new EventTarget();const handleCustomEvent = (event) => {console.log(`触发自定义事件:${event.detail}`);
};eventEmitter.addEventListener('customEvent', handleCustomEvent);
eventEmitter.dispatchEvent(new CustomEvent('customEvent', { detail: '传递的数据' }));

14.代理验证:

  • 用途: 验证和拦截对象属性访问。
  • 使用场景: 输入验证、强制数据约束。
const validator = (target, prop, value) => {if (prop === 'age' && (typeof value !== 'number' || value < 0)) {throw new Error('无效的年龄值');}target[prop] = value;return true;
};const person = new Proxy({}, { set: validator });person.age = 25; // 有效
person.age = -5; // 抛出错误

15.Object.fromEntries():

  • 用途: 将键值对数组转换为对象。
  • 使用场景: 处理 API 返回的键值对数组。
const keyValueArray = [['key1', 'value1'], ['key2', 'value2']];
const myObject = Object.fromEntries(keyValueArray);console.log(myObject); // { key1: 'value1', key2: 'value2' }

16.AbortController 和 AbortSignal:

  • 用途: 允许通过 AbortController 取消异步操作。
  • 使用场景: 中止不再需要的网络请求。
const controller = new AbortController();
const signal = controller.signal;fetch('https://api.example.com/data', { signal }).then(response => response.json()).then(data => console.log(data)).catch(error => {if (error.name === 'AbortError') {console.log('Request was aborted');} else {console.error(error);}});// 取消请求
controller.abort();

17.Blob 和 URL.createObjectURL():

  • 用途: 在浏览器中创建可下载的二进制大对象(Blob)。
  • 使用场景: 文件下载、图像预览。
const textContent = 'Hello, Blob!';
const blob = new Blob([textContent], { type: 'text/plain' });const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'example.txt';
link.click();

18.IndexedDB:

  • 用途: 客户端存储大量结构化数据。
  • 使用场景: 离线应用、大规模数据存储。
const request = indexedDB.open('myDatabase', 1);request.onupgradeneeded = event => {const db = event.target.result;const objectStore = db.createObjectStore('myObjectStore', { keyPath: 'id' });
};request.onsuccess = event => {const db = event.target.result;const transaction = db.transaction('myObjectStore', 'readwrite');const objectStore = transaction.objectStore('myObjectStore');objectStore.add({ id: 1, data: 'example' });
};

19.Speech Recognition API:

  • 用途: 识别用户的语音输入。
  • 使用场景: 语音搜索、语音指令。
const recognition = new SpeechRecognition();
recognition.lang = 'en-US';recognition.onresult = event => {const transcript = event.results[0][0].transcript;console.log(`User said: ${transcript}`);
};recognition.start();

20.Resize Observer:

  • 用途: 观察元素的大小变化。
  • 使用场景: 响应式布局、动态调整 UI。
const observer = new ResizeObserver(entries => {entries.forEach(entry => {console.log(`Element size changed to ${entry.contentRect.width}x${entry.contentRect.height}`);});
});const targetElement = document.getElementById('resizeMe');
observer.observe(targetElement);

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

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

相关文章

Python——面向对象案列

1. class User(object):#重写__int__初始化方法&#xff0c;该方法用来初始化属&#xff0c;在构建方法的时候&#xff0c;这个方法会自动触发&#xff0c;用来初始化属性def __init__(self): #name “” 这是一个局部变量#self类似指针 this#self.name类的属性print("构…

计算机网络-甘晴void学习笔记

计算机网络 计科210X 甘晴void 202108010XXX 文章目录 计算机网络期中复习1计算机网络和因特网1.1 因特网1.2 网络边缘1.3 网络核心1.4 分组交换的时延/丢包和吞吐量1.5 协议层次与服务模型 2 应用层原理2.1 应用层协议原理2.2 Web和Http2.3 因特网中的电子邮件2.4 DNS&#x…

K8S--部署Nacos

原文网址&#xff1a;K8S--部署Nacos-CSDN博客 简介 本文介绍K8S部署Nacos的方法。Nacos版本是&#xff1a;2.2.3。 部署方案 本文为了简单&#xff0c;使用此部署方式&#xff1a;使用本地pvconfigmap&#xff0c;以embedded模式部署单机nacos。以nodePort方式暴露端口。 …

linux Vim编辑器使用以及文件权限修改,kill process

选择编辑器&#xff1a;select-editor vim命令 基本操作 1.vim 文件名 &#xff1a;进入一般模式&#xff08;不能输入&#xff09; 2.按下 i 从一般模式&#xff0c;进入到插入编辑模式 3.按下esc从插入模式&#xff0c;退出到一般模式 4.输入:wq,退出编辑。 普通模式下&…

vectorCast——Probe point 功能实现故障注入,局部变量打印,断点调试。

选择一个测试用例,选择coverage窗口进行查看。点击edit probe point,如图所示绿色的小圆圈。选代码中选择需要打断点的地方进行点击。黑色的小圆点都可以选。点击黑色小圆点,小圆点变绿,表示打断点成功。此时就可以根据自己的需求在打断点的位置编写一些C语言的命令语句。点…

QT+OSG/osgEarth编译之八十:ive+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_ive)

文章目录 1、osgdb_ive介绍2、文件分析3、pro文件4、编译实践1、osgdb_ive介绍 通过osgdb_ive,OpenSceneGraph开源库能方便地读取ive格式的三维文件。 ive(Interchangeable Virtual Environment)是一种三维图形数据交换格式,主要用于虚拟现实和增强现实领域的场景数据交…

线程同步--生产者消费者模型--单例模式线程池

文章目录 一.条件变量pthread线程库提供的条件变量操作 二.生产者消费者模型生产者消费者模型的高效性基于环形队列实现生产者消费者模型中的数据容器基于生产者消费者模型实现单例线程池 一.条件变量 条件变量是线程间共享的全局变量,线程间可以通过条件变量进行同步控制条件…

ffmpeg 常用命令行详解

概述 ffmpeg 是一个命令行音视频后期处理软件 1. 裁剪命令 参数说明 -i 文件&#xff0c;orgin.mp3 为待处理源文件-ss 裁剪时间&#xff0c;后跟裁剪开始时间&#xff0c;或者开始的秒数-t 裁剪时间output.mp3 为处理结果文件 ffmpeg -i organ.mp3 -ss 00:00:xx -t 120 o…

c语言-位段

文章目录 前言一、位段是什么&#xff1f;1.1 位段的声明 总结 前言 本篇文章介绍c语言的位段。 一、位段是什么&#xff1f; 概念&#xff1a;c语言允许在一个结构体中以位为单位来指定其成员所占内存长度。 1.1 位段的声明 位段的声明格式为&#xff1a; struct struct_…

速盾网络:香港cdn免备案搭建网站好吗

随着互联网的发展&#xff0c;网站建设已经成为许多企业的必备工具。然而&#xff0c;在中国大陆地区&#xff0c;建立网站需要进行备案申请&#xff0c;这给部分企业带来了不小的困扰。为了解决这一问题&#xff0c;一些企业开始寻找免备案的解决方案&#xff0c;而香港CDN免备…

Webpack5入门到原理12:处理 Html 资源

1. 下载包 npm i html-webpack-plugin -D 2. 配置 webpack.config.js const path require("path"); const ESLintWebpackPlugin require("eslint-webpack-plugin"); const HtmlWebpackPlugin require("html-webpack-plugin");module.expo…

无刷电机学习-原理篇

一、无刷电机的优点 使用一项东西首先就要明白为什么要使用它&#xff0c;使用它有什么优点。与有刷电机相比无刷电机除了控制繁琐几乎全是优点。 1、应用范围广&#xff1a;家用电器&#xff08;冰箱空调压缩机、洗衣机、水泵等&#xff09;、汽车、航空航天、消费品工业自动…

4个值得使用的免费爬虫工具

在信息时代&#xff0c;数据的获取对于各行业都至关重要。而在数据采集的众多工具中&#xff0c;免费的爬虫软件成为许多用户的首选。本文将专心分享四款免费爬虫工具&#xff0c;突出介绍其中之一——147采集软件&#xff0c;为您揭示这些工具的优势和应用&#xff0c;助您在数…

【c语言】扫雷(上)

先开一个test.c文件用来游戏的逻辑测试&#xff0c;在分别开一个game.c文件和game.h头文件用来实现游戏的逻辑 主要步骤&#xff1a; 游戏规则&#xff1a; 输入1&#xff08;0&#xff09;开始&#xff08;结束&#xff09;游戏&#xff0c;输入一个坐标&#xff0c;如果该坐…

算法训练day17leetcode110平衡二叉树257二叉树的所有路径404左叶子之和

今日学习的文章和视频链接 https://www.bilibili.com/video/BV1GY4y1K7z8/?vd_source8272bd48fee17396a4a1746c256ab0ae https://programmercarl.com/0404.%E5%B7%A6%E5%8F%B6%E5%AD%90%E4%B9%8B%E5%92%8C.html#%E6%80%9D%E8%B7%AF 题目描述 给定一个二叉树&#xff0c;判…

Java Excel分割成许多小文件

最近在处理excel&#xff0c;数据很多&#xff0c;需要将excel拆分成许多小块&#xff0c;并保留原来的格式&#xff0c;于是写了该算法&#xff0c;并能保留原来的样式&#xff0c;使用很简单&#xff1a; Sheet splitSheet ExcelUtil.split(sheet, 0, 20, 5, 8); 传入开始…

nodejs前端项目的CI/CD实现(二)jenkins的容器化部署

一、背景 docker安装jenkins&#xff0c;可能你会反问&#xff0c;这太简单了&#xff0c;有什么好讲的。 我最近就接手了一个打包项目&#xff0c;它是一个nodejs的前端项目&#xff0c;jenkins已在容器里部署且运行OK。 但是&#xff0c;前端组很追求新技术&#xff0c;不…

中小企业股权质押融资(下)

股权质押融资的主要风险 由于股权资产的特殊性&#xff0c;较固定资产抵押和质押、第三方担保等方式&#xff0c;股权质押融资风险易受企业经营状况等因素的影响&#xff0c;主要包括股权价值下跌的风险、股权质押的道德风险、股权处置风险以及现行法律不完善导致的法律风险。…

AcWing 1204.错误票据(读取未知个数数据的新方法)

[题目概述] 某涉密单位下发了某种票据&#xff0c;并要在年终全部收回。每张票据有唯一的ID号。全年所有票据的ID号是连续的&#xff0c;但ID的开始数码是随机选定的。 因为工作人员疏忽&#xff0c;在录入ID号的时候发生了一处错误&#xff0c;造成了某个ID断号&#xff0c;另…

前端面试题汇总大全(含答案)-- 持续更新

​一、HTML 篇 1. 简述一下你对 HTML 语义化的理解&#xff1f; 用正确的标签做正确的事情。 html 语义化让页面的内容结构化&#xff0c;结构更清晰&#xff0c;便于对浏览器、搜索引擎解析&#xff1b;即使在没有样式 CSS 情况下也以一种文档格式显示&#xff0c;并且是容易…