每个开发人员都应该了解的 15 种高级 JavaScript 技术

2023-11-19

JavaScript 是一种多功能且功能强大的编程语言,已广泛用于 Web 应用程序的开发。作为开发人员,必须充分了解该语言的功能和先进技术,才能创建健壮、高效且可扩展的 Web 应用程序。

以下是每个开发人员都应该了解的 15 种高级 JavaScript 技术。

1. 关闭

闭包是 JavaScript 中一项强大的技术,允许您创建具有持久状态的函数。本质上,闭包是一个“记住”它创建的环境的函数。这对于创建私有变量以及创建可用于生成其他函数的函数很有用。

例如:

1
2
3
4
5
6
7
8
9
10
11
function counter() {
  let count = 0;
  return function() {
    return ++count;
  }
}
 
const c = counter();
console.log(c()); // 1
console.log(c()); // 2
console.log(c()); // 3

在上面的示例中,计数器函数返回一个可以访问其外部作用域中的 count 变量的函数。每次调用返回的函数时,它都会递增 count 变量并返回其值。

2.柯里化

柯里化是一种将具有多个参数的函数转换为一系列函数的技术,每个函数都采用单个参数。这对于创建更加模块化的代码以及创建可以在不同上下文中重用的函数非常有用。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
function add(a, b) {
  return a + b;
}
 
function curryAdd(a) {
  return function(b) {
    return add(a, b);
  }
}
 
const add5 = curryAdd(5);
console.log(add5(10)); // 15

在上面的示例中,使用 curryAdd 函数将 add 函数转换为柯里化函数。 curryAdd 函数采用第一个参数 a 并返回一个新函数,该函数采用第二个参数 b 并使用两个参数调用原始 add 函数。

3. 记忆

记忆化是一种通过缓存昂贵的计算结果来优化函数性能的技术。这对于频繁调用或需要很长时间运行的函数非常有用。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function 斐波那契(n) {
  if (n <= 1) {
    return n;
  }
  return 斐波那契(n - 1) + 斐波那契(n - 2);
}
 
function memoize(func) {
  const cache = {};
  return function(...args) {
    const key = JSON.字符串化(args);
    if (cache[key]) {
      return cache[key];
    }
    const result = func.apply(this, args);
    cache[key] = result;
    return result;
  }
}
 
const 记忆斐波那契 = memoize(斐波那契);
console.log(记忆斐波那契(10)); // 55

在上面的示例中,memoize 函数接受一个函数 func 并返回一个新函数,该函数根据其输入参数缓存原始函数调用的结果。下次使用相同的输入参数调用该函数时,它将返回缓存的结果,而不是执行原始函数。

4. 节流

节流是一种在指定时间间隔内最多执行一次函数的技术。这可以帮助限制调用函数的次数并提高应用程序的性能。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function throttle(func, delay) {
  let lastCall = 0;
  return function(...args) {
    const now = new Date().getTime();
    if (now - lastCall < delay) {
      return;
    }
    lastCall = now;
    func.apply(this, args);
  }
}
 
window.添加事件监听器('scroll', throttle(function() {
  console.log(‘滚动’);
}, 100));

在上面的示例中,throttle 函数将函数 func 和时间间隔延迟作为参数,并返回一个新函数,该函数每延迟毫秒最多执行一次 func。

在上面的示例中,滚动事件侦听器包装有一个节流函数,该函数限制滚动时执行 console.log(‘scrolling’) 语句的次数。

5. 去抖

去抖动是一种将函数延迟到最后一次调用后经过指定时间间隔的技术。这可以帮助减少调用函数的次数并提高应用程序的性能。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function debounce(func, delay) {
  let timerId;
  return function(...args) {
    if (timerId) {
      清除超时(timerId);
    }
    timerId = 设置超时时间(() => {
      func.apply(this, args);
      timerId = null;
    }, delay);
  }
}
 
window.添加事件监听器('resize', debounce(function() {
  console.log(‘调整大小’);
}, 500));

在上面的示例中,debounce 函数将函数 func 和时间间隔延迟作为参数,并返回一个新函数,该函数延迟执行 func,直到自上次调用以来经过了延迟毫秒。

在上面的示例中,调整大小事件侦听器使用去抖动函数包装,该函数限制调整窗口大小时执行 console.log(‘resizing’) 语句的次数。

6. 承诺

Promise 是一种在 JavaScript 中管理异步代码的方法。它们本质上是一个可能尚不可用但将来会可用的值的占位符。 Promise 可用于确保某些代码仅在其他代码执行完毕后才运行,并且它们还可以用于以比传统错误处理更优雅的方式处理错误。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
function 获取数据() {
  return new Promise((resolve, reject) => {
    fetch('https://example.com/data')
      .then(response => response.json())
      .then(data => resolve(data))
      .catch(error => reject(error));
  });
}
 
获取数据()
  .then(data => console.log(data))
  .catch(error => console.error(error));

在上面的示例中, fetchData 函数返回一个 Promise,该 Promise 解析为从 https://example.com/data 获取的数据。然后使用 then 和 catch 方法使用 Promise 来处理已解析的数据和发生的任何错误。

7. 异步/等待

Async/await 是 Promise 之上的语法糖,它允许您编写看起来像同步代码的异步代码。这可以使异步代码更具可读性并且更易于维护。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
async function 获取数据() {
  try {
    const response = await fetch('https://example.com/data');
    const data = await response.json();
    return data;
  } catch (error) {
    throw new Error(error);
  }
}
 
获取数据()
  .then(data => console.log(data))
  .catch(error => console.error(error));

在上面的示例中, fetchData 函数使用 async 关键字声明,并使用await 关键字等待 fetch 和 response.json 方法返回的 Promises 的解析值。使用 try/catch 块捕获任何错误。

8. 发电机

生成器是 JavaScript 中的一项强大功能,允许您暂停和恢复函数的执行,同时保持其内部状态。这对于从异步编程到构建迭代器的各种应用程序都很有用。

下面是如何使用生成器构建迭代器来生成无限斐波那契数列的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function* 斐波那契() {
  let [prev, curr] = [0, 1];
  while (true) {
    yield curr;
    [prev, curr] = [curr, prev + curr];
  }
}
 
const fib = 斐波那契();
 
console.log(fib.next().value); // 记录 1
console.log(fib.next().value); // 记录 1
console.log(fib.next().value); // 记录 2
console.log(fib.next().value); // 记录 3
console.log(fib.next().value); // 记录 5

在此示例中,斐波那契函数使用 function* 语法声明为生成器函数。该函数使用 while 循环生成斐波那契数列的无限序列,这些数列使用yield 关键字一次生成一个。然后使用 fibonacci() 函数将 fib 变量初始化为迭代器对象,并且每次后续调用 next() 方法都会生成序列中的下一个数字。

9. 扩展运算符

扩展运算符由三个点 (...) 表示,是 JavaScript 中的一项强大功能,它允许您将可迭代对象(如数组或字符串)扩展为单个元素。这可用于通过多种方式简化和简化您的代码。

以下是如何使用扩展运算符连接两个数组的示例:

1
2
3
4
5
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const arr3 = [...arr1, ...arr2];
 
console.log(arr3); // 记录 [1, 2, 3, 4, 5, 6]

在此示例中,扩展运算符用于将 arr1 和 arr2 连接成一个新数组 arr3。 …arr1 语法将 arr1 数组扩展为各个元素,然后将其与 …arr2 语法连接起来。

10. 高阶函数

高阶函数是接受另一个函数作为参数或返回一个函数作为结果的函数。这对于创建可以自定义以适应不同用例的可重用代码非常有用。

1
2
3
4
5
6
7
8
9
10
11
function 乘以(factor) {
  return function(number) {
    return number * factor;
  };
}
 
const double = 乘以(2);
const triple = 乘以(3);
 
console.log(double(5)); //记录10
console.log(triple(5)); // 记录 15

在此示例中,multiplyBy 函数返回另一个将给定数字乘以指定因子的函数。返回的函数可用于创建乘以不同因子的其他函数。

11. 解构

解构是一种以更简洁的方式从对象或数组中提取值的方法。这在处理复杂的数据结构时特别有用,因为它允许您快速轻松地提取所需的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const person = {
  name: 'John',
  age: 30,
  address: {
    street: “主街 123 号”,
    city: “任何城镇”,
    state: 'CA',
    zip: '12345'
  }
};
 
const { name, age, address: { city } } = person;
 
console.log(name); // '约翰'
console.log(age); // 30
console.log(city); // '任意城镇'

在此示例中,我们解构 person 对象以提取姓名、年龄和城市属性并将它们分配给变量。

12. 活动委托

事件委托是一种处理事件的技术,其中单个事件处理程序附加到父元素,而不是每个单独的子元素。这对于提高事件处理的性能以及处理动态生成的内容上的事件很有用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<ul id="myList">
  
  • Item 1
  •   
  • Item 2
  •   
  • Item 3
  •  
      const list = document.按 ID 获取元素('myList');
      
      list.添加事件监听器('click', function(event) {
        if (event.target.tagName === 'LI') {
          console.log(event.target.文本内容);
        }
      });
    脚本>

    在此示例中,我们将 click 事件侦听器附加到 ul 元素,然后使用 event.target 属性来确定单击了哪个 li 元素。这对于处理可能在页面中添加或删除的动态内容的事件非常有用。

    13. 大括号的用法

    在 JavaScript 中,大括号用于分隔代码块。然而,它们也可以以更简洁的方式使用来创建对象或解构对象。这在处理复杂的数据结构时特别有用。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function 我的函数() {
      const x = 1;
      const y = 2;
      
      if (x < y) {
        console.log('x 小于 y');
      } else {
        console.log('x 大于或等于 y');
      }
    }

    在此示例中,我们使用大括号来定义 myFunction 函数的主体和 if 语句。

    14. JavaScript 模块

    JavaScript 模块是一种将代码组织成可重用、独立单元的方法。它们可用于封装功能并创建更易于维护的代码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 模块1.js
    export function add(a, b) {
      return a + b;
    }
     
    // 模块2.js
    import { add } from './module1.js';
     
    const sum = add(2, 3);
     
    console.log(sum); // 5

    在此示例中,我们从 module1.js 导出 add 函数,然后使用 import 语句将其导入 module2.js。这允许我们在代码的不同部分重用 add 函数。

    15. 箭头函数

    箭头函数是在 JavaScript 中定义函数的一种简洁方式。它们对于创建匿名函数以及创建采用单个参数的函数特别有用。

    1
    2
    3
    4
    5
    const numbers = [1, 2, 3, 4, 5];
     
    const 偶数 = numbers.filter(num => num % 2 === 0);
     
    console.log(偶数); // [2, 4]

    在此示例中,我们使用箭头函数来过滤数字数组并仅返回偶数。箭头函数语法比传统函数语法更短、更简洁。

    结论

    总之,这 15 项高级 JavaScript 技术对于任何希望将自己的技能提升到新水平的开发人员来说都是必不可少的。无论您正在开发小型项目还是大型应用程序,这些技术都可以帮助您编写更高效、可维护的代码。因此,开始练习吧,看看这些技术如何帮助您将 JavaScript 技能提升到新的水平!

    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

    每个开发人员都应该了解的 15 种高级 JavaScript 技术 的相关文章

    • VS Code Remote Development

      配置VSCode Remote Development 1 Ubuntu 上启用 SSH 1 打开终端 并且安装openssh server软件包 sudo apt update sudo apt install openssh serve
    • 图像处理岗位面试题搜罗汇总

      传统图像处理部分 图像处理基础知识 彩色图像 灰度图像 二值图像和索引图像区别 彩色图像 RGB图像 灰度图像 0 255像素值 二值图像 0和1 用于掩膜图像 索引图像 在灰度图像中 自定义调色板 自定义输出256种颜色值 常用的图像空间
    • java 泛型 作用与定义

      1 泛型方法的定义和使用 public static void main String args throws ClassNotFoundException String str get 哈士奇 world System out print
    • Mac显示放大镜

      设置快捷键 系统默认是不开启热键的 如果需要设置 操作如下 设置 system preferences gt accessibility 在左侧找到room 进入配置窗口 按如上配置后 按住option键 然后两指向上就可以放大 两指向下就
    • 这座城市引领大模型浪潮!80余个AI大模型,一半集结在这里!

      刚刚结束的2023全球数字经济大会上 人工智能高峰论坛掀起了一股热潮 大型模型的发展和应用成为了会议的亮点 而作为这次盛会的主办方之一 北京市已经成为了这场人工智能革命的领先力量 作为人工智能产业的引领者 北京不负众望 国内已有80余个大型
    • Redis系列(七)Redis主从、哨兵、cluster集群方案解析

      文章目录 Redis主从 主从数据同步 同步 建立连接 完整重同步 全量同步 触发条件 部分重同步 增量同步 复制偏移量 offset 复制积压缓冲区 replication backlog buffer 部分重同步执行过程 命令传播 指令
    • 机器视觉最火应用领域

      1 图像和视频识别 人工神经网络领域最重要的进展之一出自 ImageNet ImageNet收集了 1400 万标签图像并于2009年发布 ImageNet挑战赛要求参赛者设计一个能够跟人类一样对照片进行分类的算法 但一直没有出现获胜者 直
    • Python图像处理 PIL中convert(mode)函数详解

      模式分类 PIL有九种不同模式 1 L P RGB RGBA CMYK YCbCr I F mode 1 代码示例 为二值图像 非黑即白 每个像素用8个bit表示 0表示黑 255表示白 from PIL import Image 读取一张
    • python快乐数字怎么表达_Python中的快乐数字

      在这里 我们将看到如何检测数字n是否为一个快乐数字 因此 快乐数字是一个数字 其中以任何正整数开头的数字均用其数字的平方和代替 该过程将重复进行直到其变为1 否则它将无休止地循环循环 这些数字 当找到1时 将成为快乐数字 假设数字为19 则
    • 类加载机制+双亲委派机制(通俗易懂版)

      1 类加载机制 一个类从加载到使用到卸载一共经过了5个步骤 加载 gt 连接 gt 初始化 其中连接分为验证 准备 解析三个阶段 1 加载 那么什么时候会将 class文件加载到jvm中 就是在你使用这个类的时候 验证 准备 解析 2 验证
    • 【计算机视觉】CLIP:语言-图像表示之间的桥梁

      文章目录 一 前言 二 架构 三 应用 3 1 图像分类 3 2 图像描述 3 3 文本到图像 四 总结 一 前言 最近GPT4的火爆覆盖了一个新闻 midjourney v5发布 DALLE2 midjourney都可以从文本中生成图像
    • 生成随机数

      目录 1 生成随机数sand 函数 2 srand 函数设置生成随机数 3 时间戳 4 如何生成规定位数的随机数呢 1 100 5 猜数字对生成随机数的应用 1 生成随机数sand 函数 这个函数会返回一个从0到RAND MAX的随机整数
    • 线性回归误差项方差的估计

      线性回归误差项方差的估计 摘要 线性回归误差项概念的回顾 残差平方和 residual sum of squares 残差平方和的期望 实验验证 参考文献 摘要 之前在文章线性回归系数的几个性质 中 我们证明了线性回归系数项的几个性质 在这
    • 微信小程序中组件间通信的三种方式

      事先准备 创建一个项目够 修改目录下的app json 在pages中注册页面 同时新增test1组件 也在app json中注册为全局组件 并命名为my test app json 配置 pages pages home home pag
    • JUnit4 initializationError[Runner:JUnit4](0.001s)junit4报错

      junit版本 4 12 如图 原因 缺少 依赖的jar hamcrest core 1 1 jar 添加后
    • vue判断undefined_这几个小技巧,让你书写不一样的Vue!

      前言 最近一直在阅读Vue的源码 发现了几个实战中用得上的小技巧 下面跟大家分享一下 同时也可以阅读我之前写的Vue文章 vue开发中的 骚操作 挖掘隐藏在源码中的Vue技巧 抽丝剥茧般的阅读源码 将 nextTick 拉下神坛 隐藏在源码
    • Spring框架之AOP详解

      Spring AOP 理论 AOP 灵魂三问 AOP的一些术语概念 Spring AOP 底层实现 五种通知形式 实现 如何写切面类 具体举例 理论 AOP 灵魂三问 1 AOP是什么 AOP中文叫做面向切面编程 为Aspect Orien
    • Spring Boot入门&整合常用框架整理丨深度好文

      一 SpringBoot简介 1 1 原有Spring优缺点分析 1 1 1 Spring的优点分析 Spring是Java企业版 Java Enterprise Edition JEE 也称J2EE 的轻量级代替品 无需开发重量级的Ent
    • Altium Designer导出STEP文件

      Tips 由于我使用的是13版本 没有高版本具有的STEP导出功能 故采用以下方式导出PCB 此种方式对元器件模型支持较差 对模型要求较高的同学 建议还是升级DXP版本 首先在PCB文件中 点击 工具 遗留工具 3D显示 在弹出的PCB3D
    • 空谱结合多标准的主动学习用于高光谱分类

      摘要 阶段1首先使用PCA降维 然后使用形态学的腐蚀膨胀方法获取一系列图像 阶段2引入了一种新的基于uncertainty diversity和聚类假设的query function 使用主动学习 介绍 降维解决了维度灾难的问题 解决样本数

    随机推荐

    • MySQL存储引擎MyISAM和InnoDB

      1 MySQL的程序结构 2 数据库逻辑结构 1 库 属性 名称 2 表 字段 名称 属性 数据类型 约束 记录 完整的数据 3 关系 库 表 记录 记录 字段 3 物理结构 1 库 操作系统下的目录 2 表 多个文件组成 Myisam表
    • java与redis连接过程中遇到问题

      java与redis连接过程中遇到问题 文章目录 java与redis连接过程中遇到问题 前言 一 redis是什么 特征 二 命令 1 redis通用命令 String类型常见命令 Hash常用命令 List常见命令 Set常见命令 三
    • Vuejs(一):Vuejs模板语法

      Vuejs模板语法 一 vuejs介绍 二 修改webstorm为2个空格 三 插值操作 3 1 v once 3 2 v html 3 3 v pre 3 4 v cloak 四 绑定属性 v bind 4 1 v bind绑定class
    • 计算机提示由于找不到VCRUNTIME140.dll,无法继续执行代码,重新安装程序可能会解决

      vcruntime140 dll文件是一个动态链接库 是Windows操作系统中非常重要的一个动态链接库文件 用于支持使用Microsoft Visual C 编译器创建的应用程序的运行 当我们运行的软件是有C 编译器创建的程序 就需要到系
    • DHCP原理与配置+DHCP中继

      一 DHCP服务的简介 DHCP基于客户 服务器模式 当DHCP客户端启动时 它会自动与DHCP服务器通信 由DHCP服务器为DHCP客户端提供自动分配IP地址的服务 安装了DHCP服务软件的服务器称为DHCP服务器 而启用了DHCP功能的
    • 安装visual studio 2013【转】

      本文转载自 http blog csdn net tina ttl article details 51544733 1下载 visual studio ultimate 2013安装包 微软已经向MSDN订阅用户提供了Visual Stu
    • IDEA 通过svn 导入项目

      SVN 点击菜单 VCS gt Checkout from Version Controll gt Subversion
    • 嵌入式经典面试题

      文章目录 一 常见面试题 1 用预处理指令 define 声明一个常数 用以表明1年中有多少秒 忽略闰年问题 2 写一个 标准 宏MIN 这个宏输入两个参数并返回较小的一个 3 预处理器标识 error的目的是什么 4 数据声明 5 sta
    • 01 用栈实现队列(leecode 232)

      1 问题 请你仅使用两个栈实现先入先出队列 队列应当支持一般队列的支持的所有操作 push pop peek empty 实现 MyQueue 类 void push int x 将元素 x 推到队列的末尾 int pop 从队列的开头移除
    • Web_for_Pentester_I之XML attacks

      Web for Pentester是国外安全研究者开发的一款渗透测试平台 由PentesterLab出品 官方给自己的定义是一个简单又十分有效地学习渗透测试的演练平台 XML attacks通常都是通过使用XPATH来恢复XML文件的解析设
    • 搭建以图搜图检索系统

      引言 当您听到 以图搜图 时 是否首先想到了百度 Google 等搜索引擎的以图搜图功能呢 事实上 您完全可以搭建一个属于自己的以图搜图系统 自己建立图片库 自己选择一张图片到库中进行搜索 并得到与其相似的若干图片 Milvus 作为一款针
    • #import与#include、@class有什么区别?

      import与 include class有什么区别 import与 include都是用来引入头文件的 与 include相比 Objective C中 import的优势是不会重复引入头文件 相当于多了C C 中 pragma once
    • js中通过ajax调用网上接口

    • 华为云云耀云服务器L实例评测

      目录 华为云云耀云服务器L实例 一键搭建 WordPress 准备工作 购买云耀云服务器L实例 设置 Nginx 安全级别 运行nginx huaweicloud sh脚本 配置安全组 初始化WordPress 部署应用 强大的插件库 配置
    • C/C++中浮点数格式学习——以IEEE75432位单精度为例

      这是浮点数的通常表示形式 在IEEE754中 单精度浮点数有如下形式 32位单精度 单精度二进制小数 使用32个比特存储 1 8 23位长 S Exp Fraction 31 30至23偏正值 实际的指数大小 127 22至0位编号 从右边
    • 组件中的data为什么是一个函数而不是一个对象

      官方的解释为 通俗的讲就是 因为对象是一个引用数据类型 如果data是一个对象的情况下会造成所有组件共用一个data 而当data是一个函数的情况下 每次函数执行完毕后都会返回一个新的对象 这样的话每个组件都会维护一份独立的对象 data
    • Python中Tkinter 图形化界面设计(详细教程)

      Python Tkinter 图形化界面设计 详细教程 一 图形化界面设计的基本理解 二 窗体控件布局 2 1 根窗体呈现示例 2 2 tkinter 常用控件 2 2 1常用控件 2 2 2 控件的共同属性 2 3 控件布局 2 3 1
    • docker搭建文档管理服务器,Docker快速搭建LDAP服务器

      摘要 OpenLdap可以提供强大的集中账号管理和授权 但其强大的功能依赖多个插件的集成 为方便OpenLdap的编译和部署 我便制作了一个docker 镜像 并通过本文记录该镜像的使用方法 文档环境 本文档中代码的测试环境 OpenLda
    • 如何在 CentOS/RHEL 8 上安装 Python 3.9

      Python 是一种功能强大且广泛使用的编程语言 以其简单性 可读性和跨 Web 开发 数据科学和机器学习等各个领域的多功能性而闻名 随着 Python 3 9 的发布 开发人员可以从众多增强 优化和新功能中受益 在本教程中 我们将指导您完
    • 每个开发人员都应该了解的 15 种高级 JavaScript 技术

      JavaScript 是一种多功能且功能强大的编程语言 已广泛用于 Web 应用程序的开发 作为开发人员 必须充分了解该语言的功能和先进技术 才能创建健壮 高效且可扩展的 Web 应用程序 以下是每个开发人员都应该了解的 15 种高级 Ja