ES6(ES2015)特性全解析

ES6(ECMAScript 2015)是 JavaScript 语言发展史上的一个重要里程碑,它引入了许多新的语法特性和功能,提升了代码的可读性、可维护性和开发效率。

1. 块级作用域变量:let 和 const

ES6 引入了 letconst 关键字,用于声明块级作用域的变量,解决了 var 的变量提升和全局污染问题。

// let 示例:块级作用域
function testLet() {if (true) {let x = 10;}console.log(x); // 报错:x 未定义
}// const 示例:常量声明
const PI = 3.14159;
PI = 3.14; // 报错:无法重新赋值给常量

关键点

  • let 允许变量重新赋值,但不能重复声明
  • const 声明常量,必须初始化且不能重新赋值
  • 两者都具有块级作用域({} 内有效)
2. 箭头函数(Arrow Functions)

箭头函数提供了更简洁的函数语法,并且自动绑定 this 上下文。

// 基本语法
const sum = (a, b) => a + b;// 多行表达式需要大括号和 return
const multiply = (a, b) => {return a * b;
};// 无参数时使用空括号
const sayHello = () => console.log('Hello!');// 自动绑定 this
class Counter {constructor() {this.count = 0;}increment = () => {this.count++; // 箭头函数保留 this 上下文}
}

优势

  • 语法更简洁,省去 functionreturn 关键字
  • 不绑定自己的 this,继承自父级作用域
  • 适合简单的回调函数和需要保留上下文的场景
3. 模板字符串(Template Literals)

模板字符串使用反引号(`),支持变量插值和多行字符串。

const name = 'Alice';
const age = 30;// 变量插值
const greeting = `Hello, ${name}! You are ${age} years old.`;// 多行字符串
const message = `This is a multi-linestring using template literals.
`;// 表达式计算
const total = `The total is ${10 + 20}.`;
4. 解构赋值(Destructuring Assignment)

解构赋值允许从数组或对象中提取值并赋值给变量。

// 数组解构
const numbers = [1, 2, 3];
const [a, b, c] = numbers; // a=1, b=2, c=3// 对象解构
const person = {firstName: 'John',lastName: 'Doe',age: 30
};
const { firstName, age } = person; // firstName='John', age=30// 别名和默认值
const { firstName: name, city = 'Unknown' } = person;
5. 扩展运算符(Spread Operator)

扩展运算符(...)可以展开数组或对象。

// 数组扩展
const arr1 = [1, 2];
const arr2 = [...arr1, 3, 4]; // [1, 2, 3, 4]// 合并数组
const merged = [...arr1, ...arr2]; // [1, 2, 1, 2, 3, 4]// 对象扩展
const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1, c: 3 }; // { a: 1, b: 2, c: 3 }// 函数参数展开
const numbers = [1, 2, 3];
console.log(Math.max(...numbers)); // 3
6. 类(Class)和继承

ES6 引入了类的语法糖,基于原型实现面向对象编程。

// 类定义
class Animal {constructor(name) {this.name = name;}speak() {console.log(`${this.name} makes a sound.`);}
}// 继承
class Dog extends Animal {constructor(name) {super(name); // 调用父类构造函数}speak() {console.log(`${this.name} barks.`);}
}const dog = new Dog('Buddy');
dog.speak(); // "Buddy barks."

注意

  • 类是原型继承的语法糖
  • 使用 extends 关键字实现继承
  • constructor 方法用于初始化对象
  • super() 调用父类的构造函数或方法
7. Promise 对象

Promise 用于处理异步操作,解决回调地狱问题。

// Promise 基本用法
const fetchData = new Promise((resolve, reject) => {setTimeout(() => {const data = { name: 'John', age: 30 };resolve(data); // 操作成功// reject(new Error('Failed to fetch data')); // 操作失败}, 1000);
});// 使用 Promise
fetchData.then(data => console.log(data)).catch(error => console.error(error));// Promise 链式调用
fetchData.then(data => processData(data)).then(result => displayResult(result)).catch(error => handleError(error));
8. 模块化:import 和 export

ES6 引入了官方的模块系统,替代了 CommonJS 和 AMD。

// 导出模块
// utils.js
export const PI = 3.14159;
export function calculateCircleArea(radius) {return PI * radius * radius;
}// 导入模块
// main.js
import { PI, calculateCircleArea } from './utils.js';
console.log(calculateCircleArea(5));// 导入整个模块
import * as utils from './utils.js';
console.log(utils.PI);// 默认导出
// logger.js
export default function log(message) {console.log(`[LOG] ${message}`);
}// 导入默认导出
import log from './logger.js';
log('This is a message');
9. 默认参数值

函数参数可以设置默认值,当参数未传递时使用默认值。

function greet(name = 'Guest') {console.log(`Hello, ${name}!`);
}greet(); // "Hello, Guest!"
greet('Alice'); // "Hello, Alice!"
10. 剩余参数(Rest Parameters)

剩余参数允许将不确定数量的参数收集为一个数组。

function sum(...numbers) {return numbers.reduce((total, num) => total + num, 0);
}console.log(sum(1, 2, 3)); // 6
console.log(sum(1, 2, 3, 4, 5)); // 15
11. Map 和 Set 数据结构

ES6 引入了新的数据结构 MapSet,提供了更高效的数据存储和查找方式。

// Map 示例:键值对集合
const myMap = new Map();
myMap.set('name', 'John');
myMap.set(1, 'One');console.log(myMap.get('name')); // "John"
console.log(myMap.size); // 2// Set 示例:唯一值集合
const mySet = new Set();
mySet.add(1);
mySet.add(2);
mySet.add(2); // 重复值会被忽略console.log(mySet.has(1)); // true
console.log(mySet.size); // 2

特点

  • Map:键可以是任意类型,保持插入顺序,提供高效的查找
  • Set:值唯一,自动去重,提供高效的成员检测
12. 迭代器(Iterators)和 for…of 循环

迭代器是一种接口,为各种不同的数据结构提供统一的访问机制。

// 数组迭代
const numbers = [1, 2, 3];
for (const num of numbers) {console.log(num); // 1, 2, 3
}// 字符串迭代
const str = 'hello';
for (const char of str) {console.log(char); // 'h', 'e', 'l', 'l', 'o'
}// 自定义迭代器
const myIterable = {[Symbol.iterator]() {let i = 0;return {next() {return i < 3 ? { value: i++, done: false } : { done: true };}};}
};for (const value of myIterable) {console.log(value); // 0, 1, 2
}
13. 生成器(Generators)

生成器是一种特殊的函数,可以暂停执行并在需要时恢复。

// 生成器函数
function* countNumbers() {let i = 0;while (true) {yield i++;}
}const counter = countNumbers();
console.log(counter.next().value); // 0
console.log(counter.next().value); // 1
console.log(counter.next().value); // 2// 生成器用于迭代
function* evenNumbers() {let i = 0;while (i < 10) {yield i;i += 2;}
}for (const num of evenNumbers()) {console.log(num); // 0, 2, 4, 6, 8
}

关键点

  • 使用 function* 定义生成器函数
  • yield 关键字暂停函数执行并返回值
  • 生成器对象实现了迭代器接口

总结

ES6 的这些新特性极大地提升了 JavaScript 的表达能力和开发效率,使代码更加简洁、优雅和易于维护。本文介绍了 ES6 中最核心的特性,包括块级作用域、箭头函数、模板字符串、解构赋值、扩展运算符、类和继承、Promise、模块化等,以及补充的 Map/Set 数据结构、迭代器和生成器。

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

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

相关文章

jvm 垃圾收集算法 详解

垃圾收集算法 分代收集理论 垃圾收集器的理论基础&#xff0c;它建立在两个分代假说之上&#xff1a; 弱分代假说&#xff1a;绝大多数对象都是朝生夕灭的。强分代假说&#xff1a;熬过越多次垃圾收集过程的对象就越难以消亡。 这两个分代假说共同奠定了多款常用的垃圾收集…

数字孪生+AR/VR的融合创新

目录 引言&#xff1a;工业元宇宙的兴起与技术基石数字孪生&#xff1a;工业元宇宙的数字底座 2.1 数字孪生的概念与关键要素 2.2 数字孪生在工业领域的应用 2.3 数字孪生的技术架构 (Mermaid Graph) AR/VR&#xff1a;工业元宇宙的沉浸式体验层 3.1 AR/VR 的概念与技术原理…

图解C#教程 第五版 第4章 类型、存储和变量 笔记

第4章 类型、存储和变量 笔记 4.1 C# 程序是一组类型声明 C程序是一组函数和数据类型&#xff0c;C程序是一组函数和类&#xff0c; 而C#程序是一组类型声明&#xff0c;具有如下特征&#xff1a; C# 程序或 DLL 的源代码是一组类型声明类型声明中必须有一个包含 Main 方法…

SpringBoot整合SSM

1. SSM整合步骤 今天带大家学习一下基于SpringBoot的SSM整合案例&#xff0c;话不多说&#xff0c;咱们开始&#xff0c;要实现SSM整合&#xff0c;有以下这么几步 导入依赖创建yml配置文件dao层静态页面测试类进行测试 1.1 导入依赖 <?xml version"1.0" enco…

多面体模型-学习笔记2

1&#xff09; 多面体模型被应用于解决程序变换问题&#xff0c;并有效地推动了程 序自动并行化等技术的发展。与传统的解决程序变换的方法相比&#xff0c;多面体模型 具有许多优势[5]。多面体模型提供了一种强大的抽象&#xff0c;将每个语句的动态语句执 行实例视作一个多面…

基于django+vue的健身房管理系统-vue

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.8数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;PyCharm 系统展示 会员信息管理 员工信息管理 会员卡类型管理 健身项目管理 会员卡管理 摘要 健身房管理…

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…

Spring AI中使用ChatMemory实现会话记忆功能

文章目录 1、需求2、ChatMemory中消息的存储位置3、实现步骤1、引入依赖2、配置Spring AI3、配置chatmemory4、java层传递conversaionId 4、验证5、完整代码6、参考文档 1、需求 我们知道大型语言模型 &#xff08;LLM&#xff09; 是无状态的&#xff0c;这就意味着他们不会保…

Java 高级泛型实战:8 个场景化编程技巧

文章目录 一、通配符高级应用&#xff1a;灵活处理类型关系二、泛型方法与类型推断三、泛型类的嵌套使用四、受限泛型与边界条件五、泛型与反射结合六、泛型在函数式接口中的应用七、类型擦除与桥接方法八、自定义泛型注解总结 在Java编程中&#xff0c;泛型不仅是类型安全的保…

[蓝桥杯 2024 国 B] 立定跳远

问题描述 在运动会上&#xff0c;小明从数轴的原点开始向正方向立定跳远。项目设置了 n 个检查点 a1,a2,...,an且 ai≥ai−1>0。小明必须先后跳跃到每个检查点上且只能跳跃到检查点上。同时&#xff0c;小明可以自行再增加 m 个检查点让自己跳得更轻松。在运动会前&#xf…

2025年全国I卷数学压轴题解答

第19题第3问: b b b 使得存在 t t t, 对于任意的 x x x, 5 cos ⁡ x − cos ⁡ ( 5 x t ) < b 5\cos x-\cos(5xt)<b 5cosx−cos(5xt)<b, 求 b b b 的最小值. 解: b b b 的最小值 b m i n min ⁡ t max ⁡ x g ( x , t ) b_{min}\min_{t} \max_{x} g(x,t) bmi…

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…

解决网页导出PDF部分内容被遮挡问题

问题描述 以学习通为例&#xff0c;在使用CtrlP打印页面或截图时&#xff0c;固定侧边栏会遮挡部分内容&#xff0c;影响完整内容的获取。如下图所示&#xff1a; 解决办法 通过浏览器开发者工具临时移除固定侧边栏&#xff0c;具体步骤如下&#xff1a; 在目标页面右键点…

机器学习监督学习实战六:五种算法对新闻组英文文档进行文本分类(20类),词频统计和TF-IDF 转换特征提取方法理论和对比解析

本文主要介绍了20 Newsgroups数据集及其在文本分类任务中的应用。20 Newsgroups数据集包含约20,000篇新闻组文档&#xff0c;分为20个不同主题的新闻组&#xff0c;数据集被分为训练集和测试集。在数据预处理阶段&#xff0c;使用了CountVectorizer和TfidfVectorizer两种方法将…

易学探索助手-个人记录(十四)

项目背景 在大语言模型&#xff08;LLM&#xff09;完成指令微调&#xff08;SFT&#xff09;之后&#xff0c;虽然可以处理开放式问答任务&#xff0c;但在专业领域&#xff08;如《周易》&#xff09;仍面临知识更新滞后、事实性薄弱等问题。为此&#xff0c;本文介绍如何通…

从“人找政策”到“政策找人”:智能退税ERP数字化重构外贸生态

离境退税新政核心内容与外贸企业影响 &#xff08;一&#xff09;政策核心变化解析 退税商店网络扩容 新政明确鼓励在大型商圈、旅游景区、交通枢纽等境外旅客聚集地增设退税商店&#xff0c;并放宽备案条件至纳税信用M级企业。以上海为例&#xff0c;静安区计划新增1000家退…

Pandas 可视化集成:数据科学家的高效绘图指南

为什么选择 Pandas 进行数据可视化&#xff1f; 在数据科学和分析领域&#xff0c;可视化是理解数据、发现模式和传达见解的关键步骤。Python 生态系统提供了多种可视化工具&#xff0c;如 Matplotlib、Seaborn、Plotly 等&#xff0c;但 Pandas 内置的可视化功能因其与数据结…

曼昆《经济学原理》第九版 第十一章公共物品与公共资源

一、物品分类的基本框架 排他性&#xff1a;能否阻止他人使用该物品的特性竞争性&#xff1a;一个人使用是否减少他人使用的特性 根据这两个特性可将物品分为四类&#xff1a; 私人物品&#xff1a;既有排他性又有竞争性&#xff08;如冰淇淋、衣服&#xff09;公共物品&…

基于大模型预测原发性急性闭角型青光眼的技术方案研究大纲

目录 一、引言二、技术方案概述三、术前阶段(一)数据采集与处理(二)大模型预测(三)手术方案制定(四)麻醉方案确定(五)术前健康教育四、术中阶段(一)实时数据监测与输入(二)手术策略动态调整(三)并发症预警与处理(四)术中健康教育五、术后阶段(一)恢复监测与…

基于React 的 AntD 库进行前端开发过程中的问题汇总

背景 最近写了半个月的 React 前端&#xff0c;三年没写过 React 前端了&#xff0c;有些生疏了&#xff0c;汇总一下 基于React 前端的 antD 库编写过程中的低级问题吧。 PS 一下&#xff0c;半个月没有发布博客了&#xff0c;C站产品经理又悄默默地改了样式&#xff0c;博客…