JavaScript 是一种多功能且功能强大的编程语言,已广泛用于 Web 应用程序的开发。作为开发人员,必须充分了解该语言的功能和先进技术,才能创建健壮、高效且可扩展的 Web 应用程序。
以下是每个开发人员都应该了解的 15 种高级 JavaScript 技术。
1. 关闭
闭包是 JavaScript 中一项强大的技术,允许您创建具有持久状态的函数。本质上,闭包是一个“记住”它创建的环境的函数。这对于创建私有变量以及创建可用于生成其他函数的函数很有用。
例如:
|
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 中的一项强大功能,它允许您将可迭代对象(如数组或字符串)扩展为单个元素。这可用于通过多种方式简化和简化您的代码。
以下是如何使用扩展运算符连接两个数组的示例:
|
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. 高阶函数
高阶函数是接受另一个函数作为参数或返回一个函数作为结果的函数。这对于创建可以自定义以适应不同用例的可重用代码非常有用。
|
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 中,大括号用于分隔代码块。然而,它们也可以以更简洁的方式使用来创建对象或解构对象。这在处理复杂的数据结构时特别有用。
|
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.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 中定义函数的一种简洁方式。它们对于创建匿名函数以及创建采用单个参数的函数特别有用。
|
const numbers = [1, 2, 3, 4, 5];
const 偶数 = numbers.filter(num => num % 2 === 0);
console.log(偶数); // [2, 4]
|
在此示例中,我们使用箭头函数来过滤数字数组并仅返回偶数。箭头函数语法比传统函数语法更短、更简洁。
结论
总之,这 15 项高级 JavaScript 技术对于任何希望将自己的技能提升到新水平的开发人员来说都是必不可少的。无论您正在开发小型项目还是大型应用程序,这些技术都可以帮助您编写更高效、可维护的代码。因此,开始练习吧,看看这些技术如何帮助您将 JavaScript 技能提升到新的水平!