当前位置:   article > 正文

20个超实用的JavaScript高级技巧_js 高级用法

js 高级用法

1.Intersection Observer:

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

2.Promise 和 异步/await:

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

3.Map 和 Set 数据结构:

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

4.Proxy 和 Reflect:

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

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

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

6.Generator 函数:

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

7.WeakMap 和 WeakSet:

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

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

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

9.Web Workers:

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

10.异步迭代器:

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

11.Object.freeze():

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

12.记忆化:

  • 用途: 缓存函数结果,避免重复计算。
  • 使用场景: 大场景的函数调用、递归算法。
  1. const memoize = (func) => {
  2. const cache = {};
  3. return (...args) => {
  4. const key = JSON.stringify(args);
  5. if (cache[key]) {
  6. return cache[key];
  7. } else {
  8. const result = func(...args);
  9. cache[key] = result;
  10. return result;
  11. }
  12. };
  13. };
  14. const expensiveCalculation = memoize((n) => {
  15. console.log('进行昂贵的计算...');
  16. return n * 2;
  17. });
  18. console.log(expensiveCalculation(5)); // 执行计算
  19. console.log(expensiveCalculation(5)); // 返回缓存的结果

13.自定义事件:

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

14.代理验证:

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

15.Object.fromEntries():

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

16.AbortController 和 AbortSignal:

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

17.Blob 和 URL.createObjectURL():

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

18.IndexedDB:

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

19.Speech Recognition API:

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

20.Resize Observer:

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/836894
推荐阅读
相关标签
  

闽ICP备14008679号