深入浅出ES6:现代JavaScript的基石
ES6(ECMAScript 2015)是JavaScript语言的一次重大更新,引入了许多新特性,使JavaScript更加强大、优雅和易于维护。这些特性已经成为现代JavaScript开发的基石,掌握它们对于任何JavaScript开发者都至关重要。本文将深入探讨ES6的一些核心特性,并通过示例代码帮助你理解和应用它们。

1. 块级作用域与 let/const
ES6之前,JavaScript只有全局作用域和函数作用域,这会导致一些意想不到的问题,例如变量提升和意外的全局变量污染。
ES6引入了let和const关键字,用于声明块级作用域的变量和常量。
-
let: 声明块级作用域的变量,变量值可以修改。 -
const: 声明块级作用域的常量,常量值不可修改。
示例:
// ES5
function example() {if (true) {var x = 10;}console.log(x); // 输出 10
}// ES6
function example() {if (true) {let x = 10;const y = 20;}console.log(x); // ReferenceError: x is not definedconsole.log(y); // ReferenceError: y is not defined
}
2. 箭头函数
箭头函数提供了一种更简洁的函数语法,并且自动绑定this值。
语法:
(parameters) => { statements }
示例:
// ES5
var numbers = [1, 2, 3];
var doubled = numbers.map(function(num) {return num * 2;
});// ES6
const numbers = [1, 2, 3];
const doubled = numbers.map(num => num * 2);
this绑定:
// ES5
var obj = {name: 'Alice',sayHi: function() {setTimeout(function() {console.log('Hi, ' + this.name);}, 1000);}
};obj.sayHi(); // 输出 "Hi, undefined"// ES6
const obj = {name: 'Alice',sayHi: function() {setTimeout(() => {console.log('Hi, ' + this.name);}, 1000);}
};obj.sayHi(); // 输出 "Hi, Alice"
3. 模板字符串
模板字符串使用反引号 (`) 定义,可以嵌入表达式和多行文本。
示例:
// ES5
var name = 'Alice';
var greeting = 'Hello, ' + name + '!';// ES6
const name = 'Alice';
const greeting = `Hello, ${name}!`;// 多行文本
const message = `This is a multi-linemessage.
`;
4. 解构赋值
解构赋值允许从数组或对象中提取数据,并赋值给变量。
示例:
// 数组解构
const numbers = [1, 2, 3];
const [first, second, third] = numbers;// 对象解构
const person = { name: 'Alice', age: 25 };
const { name, age } = person;
5. 默认参数
ES6允许为函数参数设置默认值。
示例:
// ES5
function greet(name) {name = name || 'Guest';console.log('Hello, ' + name);
}// ES6
function greet(name = 'Guest') {console.log(`Hello, ${name}`);
}
6. Rest参数与扩展运算符
-
Rest参数: 用于将不定数量的参数表示为一个数组。
-
扩展运算符: 用于将数组或对象展开。
示例:
// Rest参数
function sum(...numbers) {return numbers.reduce((a, b) => a + b, 0);
}// 扩展运算符
const numbers1 = [1, 2, 3];
const numbers2 = [4, 5, 6];
const combined = [...numbers1, ...numbers2];
7. 类
ES6引入了class关键字,用于定义类,使JavaScript的面向对象编程更加清晰。
示例:
class Person {constructor(name, age) {this.name = name;this.age = age;}greet() {console.log(`Hello, my name is ${this.name}`);}
}const alice = new Person('Alice', 25);
alice.greet();
8. 模块化
ES6引入了模块化系统,允许将代码分割成多个模块,并通过import和export进行导入和导出。
示例:
// math.js
export function add(a, b) {return a + b;
}// main.js
import { add } from './math.js';console.log(add(1, 2)); // 输出 3
9. Promise
Promise用于处理异步操作,提供了更优雅的方式来处理回调地狱。
示例:
function fetchData() {return new Promise((resolve, reject) => {setTimeout(() => {resolve('Data fetched!');}, 1000);});
}fetchData().then(data => {console.log(data);}).catch(error => {console.error(error);});
10. 迭代器与生成器
-
迭代器: 提供了一种统一的机制来遍历不同的数据结构。
-
生成器: 一种特殊的函数,可以暂停和恢复执行,用于生成迭代器。
示例:
// 迭代器
const numbers = [1, 2, 3];
const iterator = numbers[Symbol.iterator]();console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }// 生成器
function* generateNumbers() {yield 1;yield 2;yield 3;
}const generator = generateNumbers();console.log(generator.next()); // { value: 1, done: false }
console.log(generator.next()); // { value: 2, done: false }
console.log(generator.next()); // { value: 3, done: false }
console.log(generator.next()); // { value: undefined, done: true }
总结
ES6为JavaScript带来了许多强大的新特性,使代码更简洁、易读和易于维护。掌握这些特性对于任何JavaScript开发者都至关重要。本文只是对ES6的一些核心特性进行了简要介绍,建议你深入学习并实践这些特性,以提升你的JavaScript开发技能。
相关文章:
深入浅出ES6:现代JavaScript的基石
ES6(ECMAScript 2015)是JavaScript语言的一次重大更新,引入了许多新特性,使JavaScript更加强大、优雅和易于维护。这些特性已经成为现代JavaScript开发的基石,掌握它们对于任何JavaScript开发者都至关重要。本文将深入…...
实现使用RBF(径向基函数)神经网络模拟二阶电机数学模型中的非线性干扰,以及使用WNN(小波神经网络)预测模型中的非线性函数来抵消迟滞影响的功能
下面将详细介绍如何实现使用RBF(径向基函数)神经网络模拟二阶电机数学模型中的非线性干扰,以及使用WNN(小波神经网络)预测模型中的非线性函数来抵消迟滞影响的功能。我们将按照以下步骤进行: 步骤1&#x…...
潜水泵,高效排水,守护城市与农田|深圳鼎跃
洪水是常见的自然灾害,在春夏季节的我国降水多为丰富,容易造成城市内部的洪涝灾害。特别是低洼地区的积水,不仅容易造成城市交通的出行不便,还存在潜在的隐患,严重影响了人们正常生活。 潜水泵作为一种高效、可靠的排水…...
易基因:RNA甲基化修饰和R-loop的交叉调控:从分子机制到临床意义|深度综述
大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 R-loop(RNA-DNA杂合结构)是转录调控、DNA复制和修复等关键细胞过程的重要组成部分。但R-loop异常积累可能会破坏基因组完整性,从而导致多种疾病的发生…...
115 道 MySQL 面试题,从简单到深入!
1. 什么是数据库事务? 数据库事务是一个作为单个逻辑工作单元执行的一系列操作。事务具有ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性…...
一周学会Flask3 Python Web开发-flask3上下文全局变量session,g和current_app
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili flask3提供了session,g和current_app上下文全局变量来方便我们操作访问数据。 以下是一个表格,用于比较Flask中的…...
MFC学习笔记-1
一、编辑框和按钮 //.h文件private:CString str;//给窗口类加了一个变量(定义一个成员变量),关联到IDC_EDIT1中(要在实现中关联,源文件文件夹中)CString str2;//接收button2,和IDC_EDIT2绑定 p…...
Linux搜索查找类指令
1、find指令 基本语法:find [搜索范围] [选项] 功能:将从指定目录向下递归地遍历其各个子目录,将满足条件的文件或目录显示在终端。 常用选项: 操作 命令示例 说明 查找指定路径下的所有文件 find /path/to/dir 查找指定目…...
江协科技/江科大-51单片机入门教程——P[1-1] 课程简介P[1-2] 开发工具介绍及软件安装
本教程也力求在玩好单片机的同时了解一些计算机的基本概念,了解电脑的一些基本操作,了解电路及其元器件的基本理论,为我们学习更高级的单片机,入门IT和信息技术行业,打下一定的基础。 目录 1.课程简介 2.开发工具及…...
监听load和hashchange事件
监听load和hashchange事件 上篇文章中,我们已经将菜谱的数据给拿到,并且已经可以渲染到页面上,本篇我们将为程序添加一些事件; 注:本项目来自于Jonas Schmedtmann创建,文章仅仅作为学习作用! 菜…...
深度剖析Seata源码:解锁分布式事务处理的核心逻辑
文章目录 写在文章开头如何使用源码(配置转掉)基于AT模式详解Seata全链路流程Seata服务端启动本地服务如何基于GlobalTransaction注解开启事务客户端如何开启分布式事务RM和TC如何协调处理分支事务RM生成回滚日志事务全局提交与回滚小结参考写在文章开头 在当今分布式系统日益…...
在 Ansys Mechanical 中解决干涉拟合
有意和无意的过盈配合在工程设计和有限元分析 (FEA) 中很常见。当两个组件重叠或接触时,就会发生这种情况,从而产生应力和变形,必须仔细分析以确保功能正常。有意干涉,例如轴和轴承之间的压配合或用于固定金…...
JMeter性能问题
性能测试中TPS上不去的几种原因 性能测试中TPS上不去的几种原因_tps一直上不去-CSDN博客 网络带宽 连接池 垃圾回收机制 压测脚本 通信连接机制 数据库配置 硬件资源 压测机 业务逻辑 系统架构 CPU过高什么原因 性能问题分析-CPU偏高 - 西瓜汁拌面 - 博客园 US C…...
美国国防部(DoD)SysML v2迁移指南项目
DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 分享一篇SysML v1向SysML v2迁移的资料。 下载地址:https://ndia.dtic.mil/wp-content/uploads/2023/systems/Thurs_1560710_Stirk.pdf 核心内容用DeepSeek整理如下&#…...
JavaWeb-GenericServlet源码分析(适配器/模板方法)
文章目录 类直接实现Servlet接口的弊端Servlet接口的方法适配器设计模式 适配器对象的改造关于init方法的ServletConfig对象来源使用模板方法设计模式改造init方法 GenericServlet内置抽象类ServletConfig接口ServletConfig接口简介测试再谈GenericServlet抽象类 类直接实现Ser…...
微机原理与汇编语言试题四
一、单项选择 1.(单选题)()指向的内存单元的值被CPU做为指令执行。 A. DS:SI B. CS:IP C. SS:SP D. ES:DI 正确答案:B 2.(单选题)当RESET信号进入高电平状态时,将使8086的()寄存器初始化为0FFFFH A. SS B. DS C. ES D. CS 正确答案:D 3.(单选题)堆栈段寄存器是( …...
[java基础-JVM篇]1_JVM自动内存管理
JVM内存管理涉及但不限于类加载、对象分配、垃圾回收等,本篇主要记录运行时数据区域与对象相关内容。 内容主要来源《深入理解Java虚拟机:JVM高级特性与最佳实践》与官方文档,理解与表述错漏之处恳请各位大佬指正。 目录 运行时数据区域 栈 栈…...
安宝特科技 | Vuzix Z100智能眼镜+AugmentOS:重新定义AI可穿戴设备的未来——从操作系统到硬件生态,如何掀起无感智能革命?
一、AugmentOS:AI可穿戴的“操作系统革命” 2025年2月3日,Vuzix与AI人机交互团队Mentra联合推出的AugmentOS,被业内视为智能眼镜领域的“iOS时刻”。这款全球首个专为智能眼镜设计的通用操作系统,通过三大突破重新定义了AI可穿戴…...
Unity FBXExport导出的FBX无法在Blender打开
将FBX转换为obj: Convert 3D models online - free and secure...
UE5销毁Actor,移动Actor,简单的空气墙的制作
1.销毁Actor 1.Actor中存在Destory()函数和Destoryed()函数 Destory()函数是成员函数,它会立即标记 Actor 为销毁状态,并且会从场景中移除该 Actor。它会触发生命周期中的销毁过程,调用 Destroy() 后,Actor 立即进入销毁过程。具体…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...
医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...
