[JavaScript] ES6及以后版本的新特性

文章目录

  • 箭头函数(Arrow Functions)
    • 为什么需要箭头函数?
    • 箭头函数的完整语法
    • 箭头函数中的 `this`
    • 实用场景
  • 解构赋值(Destructuring Assignment)
    • 为什么需要解构赋值?
    • 数组解构赋值的完整用法
    • 对象解构赋值的完整用法
    • 实用场景
  • 模块化(Modules)
    • 为什么需要模块化?
    • 模块的基本概念
  • 模板字面量(Template Literals)
    • 为什么需要模板字面量?
    • 模板字面量的基本语法
    • 高级用法
    • 使用场景
  • Promise与异步编程
    • 为什么需要 Promise 和异步编程?
    • Promise 的语法与用法
    • async 和 await
    • 实用场景

箭头函数(Arrow Functions)

为什么需要箭头函数?

  1. 代码简洁

对比代码:

// ES5 写法
const numbers = [1, 2, 3];
const squared = numbers.map(function (n) {return n * n;
});// ES6 箭头函数写法
const squared = numbers.map(n => n * n);
- ES5 中的函数定义通常会比较冗长,特别是在回调函数或嵌套逻辑中,代码可读性较差。
- 箭头函数通过简化语法,减少 `function` 和 `return` 等关键字的使用,使代码更加直观。
  1. 避免 this 问题
    • 在 ES5 中,函数的 this 是由调用时动态决定的,可能会指向全局对象或 undefined,造成意外错误。
    • 箭头函数继承了定义时的 this(即词法作用域),从而避免了 this 绑定问题。

箭头函数的完整语法

  1. 基本形式
const func = (param1, param2) => {// 函数体return param1 + param2;
};
  1. 省略规则
    • 如果函数体只有一行表达式,并且需要返回值,可以省略大括号 {}return
const add = (a, b) => a + b;
- 如果没有参数,必须加括号:
const greet = () => console.log("Hello!");
  1. 返回对象字面量
    如果需要返回一个对象字面量,必须用括号包裹,否则会与箭头函数的语法冲突:
const createPerson = (name, age) => ({ name, age });
console.log(createPerson("Kevin", 25)); // 输出 { name: "Kevin", age: 25 }

箭头函数中的 this

  1. this** 的词法作用域**:

示例:

// 普通函数中 this 的问题
function Timer() {this.seconds = 0;setInterval(function () {this.seconds++; // this 指向全局或 undefinedconsole.log(this.seconds);}, 1000);
}// 用箭头函数解决
function Timer() {this.seconds = 0;setInterval(() => {this.seconds++; // this 绑定到 Timer 对象console.log(this.seconds);}, 1000);
}
- 箭头函数不会创建自己的 `this`,它会从外层作用域中继承 `this`。
- 这在回调函数中尤为重要,避免了手动绑定 `this` 的麻烦。
  1. 无法用作构造函数
    箭头函数没有 [[Construct]] 方法,因此不能使用 new 来调用。
const Person = (name) => {this.name = name;
};// new Person("Kevin"); // 报错

实用场景

  1. 回调函数
const numbers = [1, 2, 3, 4];
const doubled = numbers.map(n => n * 2); // 简化 map 回调
  1. 事件监听
const button = document.querySelector("button");
button.addEventListener("click", () => {console.log("Button clicked!");
});

解构赋值(Destructuring Assignment)

为什么需要解构赋值?

  1. 简化代码
    在传统写法中,获取数组或对象的特定值需要多次声明变量。解构赋值直接在一行代码中完成这一任务,使代码更紧凑。对比代码:
// ES5 写法
const person = { name: "Kevin", age: 25 };
const name = person.name;
const age = person.age;// ES6 解构赋值
const { name, age } = person;
  1. 避免多次访问对象属性
    解构赋值减少了对同一对象或数组的多次访问,提升性能。

数组解构赋值的完整用法

  1. 按顺序提取值
const arr = [10, 20, 30];
const [first, second] = arr;
console.log(first, second); // 输出 10 20
  1. 跳过某些值
const arr = [1, 2, 3];
const [, second] = arr;
console.log(second); // 输出 2
  1. 使用默认值
const arr = [10];
const [first, second = 20] = arr;
console.log(second); // 输出 20

对象解构赋值的完整用法

  1. 基础用法
const obj = { x: 10, y: 20 };
const { x, y } = obj;
console.log(x, y); // 输出 10 20
  1. 别名(重命名)
const obj = { x: 10, y: 20 };
const { x: newX, y: newY } = obj;
console.log(newX, newY); // 输出 10 20
  1. 嵌套解构
const obj = { person: { name: "Kevin", age: 25 } };
const { person: { name, age } } = obj;
console.log(name, age); // 输出 Kevin 25

实用场景

  1. 函数参数
function greet({ name, age }) {console.log(`Hello, ${name}. You are ${age} years old.`);
}
greet({ name: "Kevin", age: 25 });
  1. 交换变量值
let a = 1, b = 2;
[a, b] = [b, a];
console.log(a, b); // 输出 2 1

模块化(Modules)

为什么需要模块化?

在 ES5 之前,JavaScript 没有原生模块化系统,开发者通常使用全局变量或外部库(如 require.js)来实现模块化。但这会导致代码难以维护、命名冲突等问题。


模块的基本概念

  1. 导出模块
    • 命名导出:可以导出多个变量或函数。
export const name = "Kevin";
export function greet() {console.log("Hello!");
}
- **默认导出**:每个模块只能有一个默认导出。
export default function greet() {console.log("Hello!");
}
  1. 引入模块
    • 引入命名导出
import { name, greet } from "./module.js";
- **引入默认导出**:
import greet from "./module.js";

好的,以下将针对剩余的 模板字面量(Template Literals)Promise与异步编程 进行更加详细的讲解,包括其语法背景、具体用法、以及背后的原理和实用场景。


模板字面量(Template Literals)

为什么需要模板字面量?

在 ES5 中,字符串的操作非常繁琐,尤其是在拼接变量时,需要使用 + 串联,且难以处理多行字符串。此外,插入表达式和动态生成内容也较为麻烦。
模板字面量 的出现解决了这些问题,提供了一种更加优雅的方式来处理字符串。


模板字面量的基本语法

  1. 模板字面量的定义:用反引号 ``(反引号 ` 而不是单引号 ')定义的字符串。**
const message = `这是一个模板字面量`;
  1. 插入变量(占位符)
    使用 ${} 将变量或表达式嵌入到字符串中:
const name = "Kevin";
const age = 25;
const message = `Hello, my name is ${name} and I am ${age} years old.`;
console.log(message); // 输出:Hello, my name is Kevin and I am 25 years old.
  1. 多行字符串
    在 ES5 中,我们需要通过 \n 或字符串拼接实现多行字符串,这不仅麻烦而且不直观。
    • ES5 写法
const text = "这是第一行\n" +"这是第二行";
console.log(text);
- **模板字面量写法**:
const text = `这是第一行
这是第二行`;
console.log(text); // 输出多行字符串
  1. 嵌入表达式
    可以直接在 ${} 中编写表达式,而不仅仅是变量:
const a = 10, b = 20;
const result = `结果是:${a + b}`;
console.log(result); // 输出:结果是:30

高级用法

  1. 函数调用
    模板字面量支持在 ${} 中直接调用函数:
function greet(name) {return `Hello, ${name}!`;
}
const message = `${greet("Kevin")}`;
console.log(message); // 输出:Hello, Kevin!
  1. 标签模板(Tagged Template Literals)
    标签模板允许我们通过函数对模板字面量进行自定义解析。
function highlight(strings, ...values) {return strings.reduce((result, str, i) => {return `${result}${str}<strong>${values[i] || ""}</strong>`;}, "");
}const name = "Kevin";
const age = 25;
const message = highlight`Name: ${name}, Age: ${age}`;
console.log(message); 
// 输出:Name: <strong>Kevin</strong>, Age: <strong>25</strong>
  1. 嵌套模板字面量
    支持嵌套使用模板字面量:
const user = { name: "Kevin", age: 25 };
const info = `User Info: ${`Name: ${user.name}, Age: ${user.age}`}`;
console.log(info); 
// 输出:User Info: Name: Kevin, Age: 25

使用场景

  1. 动态生成 HTML
    模板字面量非常适合用于构建动态 HTML 字符串:
const name = "Kevin";
const html = `<div><h1>${name}</h1><p>欢迎访问我的网站!</p></div>`;
console.log(html);
  1. 构建 SQL 查询
const table = "users";
const column = "name";
const sql = `SELECT ${column} FROM ${table} WHERE active = 1`;
console.log(sql);
// 输出:SELECT name FROM users WHERE active = 1

Promise与异步编程

为什么需要 Promise 和异步编程?

在 JavaScript 中,异步操作(如网络请求、文件读取、定时器等)是常见场景。
传统的异步处理方式(如回调函数)可能会导致 回调地狱(Callback Hell),使代码难以阅读和维护。

Promiseasync/await 的引入解决了这些问题,使异步代码更加可读和可维护。


Promise 的语法与用法

  1. 创建 Promise
    Promise 是一个对象,表示一个异步操作的最终完成(或失败)及其结果。
    它有三种状态:

示例:

const promise = new Promise((resolve, reject) => {const success = true;if (success) {resolve("操作成功");} else {reject("操作失败");}
});promise.then(result => console.log(result)) // 操作成功.catch(error => console.log(error)); // 捕获错误
- `pending`:初始状态,操作尚未完成。
- `fulfilled`:操作成功完成。
- `rejected`:操作失败。
  1. 链式调用
    Promise 支持链式调用,使代码逻辑更清晰。
const fetchData = () => {return new Promise(resolve => {setTimeout(() => resolve("数据加载完成"), 1000);});
};fetchData().then(data => {console.log(data);return "处理后的数据";}).then(processed => console.log(processed));
  1. Promise.all
    并行执行多个 Promise,并等待所有完成:
const p1 = new Promise(resolve => setTimeout(() => resolve(1), 1000));
const p2 = new Promise(resolve => setTimeout(() => resolve(2), 2000));Promise.all([p1, p2]).then(results => console.log(results)); 
// 输出:[1, 2]

async 和 await

  1. 为什么需要 async/await?
    • async/await 是 Promise 的语法糖,使异步代码看起来像同步代码,极大地提高了代码的可读性。
  2. 基本用法

示例:

const fetchData = () => {return new Promise(resolve => setTimeout(() => resolve("数据加载完成"), 1000));
};async function loadData() {const data = await fetchData();console.log(data); // 输出:数据加载完成
}loadData();
- 使用 `async` 声明一个函数,该函数返回一个 Promise。
- 使用 `await` 暂停异步操作,直到 Promise 完成。
  1. 错误处理
    可以使用 try...catch 捕获错误:
async function fetchWithErrorHandling() {try {const response = await fetch("https://api.example.com/data");const data = await response.json();console.log(data);} catch (error) {console.error("请求出错:", error);}
}

实用场景

  1. 数据请求
async function fetchData() {const response = await fetch("https://jsonplaceholder.typicode.com/posts/1");const post = await response.json();console.log(post);
}fetchData();
  1. 动画和定时器
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));async function run() {console.log("开始");await delay(1000); // 等待 1 秒console.log("结束");
}run();

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

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

相关文章

C语言进阶——3字符函数和字符串函数(2)

8 strsrt char * strstr ( const char *str1, const char * str2);查找子字符串 返回指向 str1 中第一次出现的 str2 的指针&#xff0c;如果 str2 不是 str1 的一部分&#xff0c;则返回 null 指针。匹配过程不包括终止 null 字符&#xff0c;但会在此处停止。 8.1 库函数s…

ThinkPHP 8请求处理-获取请求对象与请求上下文

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用Composer初始化ThinkPHP 8应用_thinkphp8 compos…

飞行器半实物联合仿真:技术解析与应用实践

1.背景介绍 当前&#xff0c;飞行器已成为大国博弈复杂场景中的重要角色&#xff0c;其技术经过多次实践不断发展&#xff0c;性能持续提升&#xff0c;整体效能显著增强。随着计算机技术和系统仿真技术的发展&#xff0c;利用计算机模拟和仿真构造一个虚拟飞行器的飞行控制系…

c#配置config文件

1&#xff0c;引用命名空间 Configuration 及配置信息

【机器学习】机器学习引领数学难题攻克:迈向未知数学领域的新突破

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 一、引言 在数学的浩瀚领域中&#xff0c;存在着诸多长期未解的难题&#xff0c;这些难题犹如高耸的山峰&#xff0c;吸引着无数数…

OS Copilot功能测评:智能助手的炫彩魔法

简介&#xff1a; OS Copilot 是一款融合了人工智能技术的智能助手&#xff0c;专为Linux系统设计&#xff0c;旨在提升系统管理和运维效率。本文详细介绍了在阿里云ECS实例上安装和体验OS Copilot的过程&#xff0c;重点评测了其三个核心参数&#xff1a;-t&#xff08;模式…

计算机网络 (55)流失存储音频/视频

一、定义与特点 定义&#xff1a;流式存储音频/视频是指经过压缩并存储在服务器上的多媒体文件&#xff0c;客户端可以通过互联网边下载边播放这些文件&#xff0c;也称为音频/视频点播。 特点&#xff1a; 边下载边播放&#xff1a;用户无需等待整个文件下载完成即可开始播放…

Oracle存储过程语法详解

简介 存储过程是一系列SQL语句的集合&#xff0c;可以封装复杂的逻辑&#xff0c;实现特定的功能&#xff0c;可以提高执行速度和代码的复用性&#xff0c;预先编译后存储在数据库中&#xff0c;可以通过指定存储过程的名称对其进行调用。 本文主要讲解Oracle存储过程语法&am…

推箱子游戏

java小游戏2 一游戏介绍 二图像准备 墙、箱子、人、箱子目的地&#xff0c;人左边、人右边、人上边、人下边 三结构准备 地图是什么&#xff0c;我们把地图想象成一个网格&#xff0c;每个格子就是工人每次移动的步长&#xff0c;也是箱子移动的距离&#xff0c;设置一个二维数…

如何分辨ddos攻击和cc攻击?

DDoS&#xff08;分布式拒绝服务&#xff09;攻击和 CC&#xff08;Challenge Collapsar&#xff09;攻击都属于网络攻击手段&#xff0c;主要通过消耗目标服务器资源使其无法正常提供服务&#xff0c;但它们在攻击原理、攻击特征等方面存在区别&#xff1a; 攻击原理 DDoS 攻…

期权帮|如何利用股指期货进行对冲套利?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 如何利用股指期货进行对冲套利&#xff1f; 对冲就是通过股指期货来平衡投资组合的风险。它分为正向与反向两种策略&#xff1a; &#xff08;1&#xff09;正向对冲&#xff…

软件质量与测试报告5-压力测试 JMeter 与 Badboy

A&#xff0e;百度搜索引擎压力测试 通过在Badboy下执行如下的测试场景来生成压力测试的脚本&#xff1a; a) 在Badboy的地址栏里面输入www.baidu.com&#xff0c;回车&#xff1b; b) 在右下区域打开的百度的主页上输入搜索关键字JMeter&#xff0c;回车&#xff1b; c) 在…

Mybatis多条件查询:Map传参与对象传参解析

Mybatis 多条件查询常见且关键&#xff0c;本文探讨两种方法——Map 传参和 Java Bean 对象传参&#xff0c;展示用法及区别&#xff0c;总结应用场景和优缺点。 1. Map传参方式 原理&#xff1a;Mybatis允许我们通过一个Map对象来传递动态SQL中的参数。Map的键对应于SQL语句中…

wangEditor富文本编辑器,Laravel上传图片配置和使用

文章目录 前言步骤1. 构造好前端模版2. 搭建后端存储3. 调试 前言 由于最近写项目需要使用富文本编辑器&#xff0c;使用的是VUE3.0版本所以很多不兼容&#xff0c;实际测试以后推荐使用wangEditor 步骤 构造好前端模版搭建后端存储调试 1. 构造好前端模版 安装模版 模版安…

three.js+WebGL踩坑经验合集(2):3D场景被相机裁切后,被裁切的部分依然可以被鼠标碰撞检测得到(射线检测)

three.js内置了Raycaster类实现鼠标的碰撞检测&#xff0c;用它可以实现3D物体的鼠标点击&#xff0c;移入移出&#xff0c;触屏检测一类的业务功能。 该功能虽然强大&#xff0c;但同事们普遍反映不是那么好用&#xff0c;因为它不像其它配套了可视编辑的3D引擎一样&#xff…

Spring Boot spring.factories文件详细说明

优质博文&#xff1a;IT-BLOG-CN 前言&#xff1a;经常看到 spring.factories 文件&#xff0c;却没有对它进行深入的了解和分析&#xff0c;今天我们就一起揭开面纱看看它的内在。 spring.factories 文件是 Spring Boot 自动配置机制的核心部分之一。它位于每个 Spring Boo…

从前端视角看设计模式之行为型模式篇

上篇我们介绍了 设计模式之结构型模式篇&#xff0c;接下来介绍设计模式之行为型模式篇 责任链模式 责任链模式允许将请求沿着一条链传递&#xff0c;直到有一个对象处理它为止。每个处理者都有机会处理该请求&#xff0c;或者将其传递给链中的下一个处理者&#xff0c;每个处…

[2025分类时序异常检测指标R-AUC与VUS]

梳理了一下分类中常见的指标&#xff0c;这些指标与时序异常检测中新提出的A-RUC与VUS之间的关系 真正例(True Positive,TP): 被正确识别为正样本的数量。真负例(True Negative,TN): 被正确识别为负样本的数量。假正例(False Positive ,FP): 被错误识为正样本数量假负例(Fals…

Unity中实现伤害跳字效果(简单好抄)

第一步骤安装并导入Dotween插件&#xff08;也可以不用导入之后直接下载我的安装包&#xff09; 官网DOTween - 下载 第二步&#xff1a; 制作跳字预制体 建议把最佳适应打开&#xff0c;这样就不怕数字太大显示不全了。 第三步&#xff1a;创建一个空对象并编写脚本JumpNumbe…

考研机试:学分绩点

描述 北京大学对本科生的成绩施行平均学分绩点制&#xff08;GPA&#xff09;。 既将学生的实际考分根据不同的学科的不同学分按一定的公式进行计算。 公式如下&#xff1a; 一门课程的学分绩点 该课绩点 该课学分 总评绩点 所有学科学分绩点之和 / 所有课程学分之和 …