摘要
ES6(ECMAScript 2015)作为 JavaScript 里程碑式的版本,引入了众多简化开发、提升代码健壮性的新特性。本文聚焦let/const 声明关键字 、解构赋值 、模板字符串四大高频核心特性,深度解析语法规则、特性差异与实战应用场景,搭配可直接运行的代码示例,帮助开发者快速掌握并落地使用,告别传统 JS 开发痛点。
一、let 关键字:块级作用域变量声明新标准
1.1 核心特性
let 是 ES6 用于声明变量 的关键字,彻底解决了传统var声明变量的痛点,具备四大核心特性:
示例:
javascript
if (true) {
let blockScoped = "只能在if块内访问";
console.log(blockScoped); // 正常输出
}
console.log(blockScoped); // 报错:ReferenceError
这种特性有效解决了传统var导致的变量提升和全局污染问题,使得变量作用域更加清晰可控。
无变量提升
与var不同,let和const声明的变量不存在提升现象。这意味着:
典型示例:
javascript
console.log(noHoisting); // 报错:ReferenceError
let noHoisting = "必须先声明";
这个特性使得代码执行顺序更加可预测,有助于提升代码质量。在严格模式下,这一规范会得到更严格的执行。
不影响作用域链
let和const完全遵循JavaScript原有的作用域链规则:
示例展示作用域链访问:
javascript
let outer = "外层变量";
function demo() {
let inner = "内层变量";
console.log(outer); // 正常访问上层作用域
{
console.log(inner); // 正常访问函数作用域
}
}
这种设计确保了ES6的新特性可以平滑地融入现有的JavaScript体系,不会对原有的作用域机制造成破坏。在模块化开发、闭包应用等场景下,这一特性尤为重要。
禁止重复声明
在同一作用域内(如函数作用域或块级作用域),使用let或const声明变量时,不允许重复声明同名变量。这一特性可以有效避免因变量意外覆盖导致的逻辑错误。例如:
javascript
let x = 10;
let x = 20; // 报错:SyntaxError: Identifier 'x' has already been declared
在大型项目中,这一限制尤为重要,它能防止不同开发者在协作时无意中重复声明变量,导致难以排查的bug。
块级作用域
let和const引入了真正的块级作用域概念,变量仅在声明它的代码块(由{}包裹的区域)内有效。常见的块级作用域包括:
2. if语句块
3. for循环体
4. while循环体
5. 函数体
6. 独立的{}代码块
7. 必须先声明后使用
8. 在声明前访问变量会抛出ReferenceError
9. 强制开发者遵循更规范的代码书写顺序
10. 可以正常访问上层作用域的变量
11. 不会破坏闭包等原有机制
12. 保持了与函数作用域的兼容性
1.2 代码实战演示
javascript
运行
// 1. 禁止重复声明(报错:Identifier 'a' has already been declared)
let a = 10;
let a = 20;
// 2. 块级作用域(仅在{}内有效)
if(true){
let num = 100;
console.log(num); // 100
}
console.log(num); // 报错:num is not defined
// 3. 无变量提升(报错:Cannot access 'str' before initialization)
console.log(str);
let str = "ES6";
// 4. 作用域链正常生效
let global = "全局变量";
function fn(){
let local = "局部变量";
// 可访问上级全局变量
console.log(global + local); // 全局变量局部变量
}
fn();
1.3 应用场景
日常开发声明变量优先使用 let ,完全替代传统var,是 ES6 开发的基础规范。
二、const 关键字:常量声明的最佳实践
2.1 核心特性
const 用于声明只读常量,是声明固定值 / 引用类型的首选,具备五大核心特性:
- 必须赋初始值:声明时直接赋值,不允许先声明后赋值;
- 标识符大写(约定俗成):区分常量与变量,提升代码可读性;
- 禁止重复声明:同 let,同一作用域不允许同名常量;
- 值不可修改:基础类型值无法修改,引用类型(对象 / 数组)不可修改内存地址,可修改内部属性;
- 块级作用域:同 let,仅在当前代码块内有效。
2.2 代码实战演示
javascript
运行
// 1. 必须赋初始值(报错:Missing initializer in const declaration)
const PI;
// 2. 基础类型值不可修改(报错:Assignment to constant variable)
const PI = 3.1415926;
PI = 3.14;
// 3. 引用类型:可修改内部属性,不可修改地址
const PERSON = {
name: "张三",
age: 20
};
// 允许修改内部属性
PERSON.age = 21;
console.log(PERSON); // {name: "张三", age: 21}
// 禁止修改内存地址(报错)
PERSON = {};
// 4. 块级作用域+禁止重复声明
if(true){
const MAX = 100;
}
console.log(MAX); // 报错:MAX is not defined
2.3 应用场景
- 声明对象、数组 等引用类型优先使用
const; - 声明固定值常量 (如数学常数、配置项)使用
const; - 基础类型变量(需修改值)使用
let。
三、变量解构赋值:快速提取数据的语法糖
3.1 核心概念
ES6 解构赋值允许从数组 / 对象中批量提取值,直接赋值给变量,简化数据提取逻辑,分为数组解构和对象解构。
3.2 数组解构赋值
按数组元素顺序一一对应赋值,支持按需提取、剩余参数提取。
javascript
运行
// 基础数组解构
const F4 = ["大哥", "二哥", "三哥", "四哥"];
// 按顺序提取值,赋值给a/b/c/d
let [a, b, c, d] = F4;
console.log(a); // 大哥
console.log(a + b + c + d); // 大哥二哥三哥四哥
// 按需提取(跳过不需要的元素)
let [first, , , fourth] = F4;
console.log(fourth); // 四哥
3.3 对象解构赋值
按对象属性名匹配赋值,无需考虑顺序,是开发中最常用的形式。
javascript
运行
// 基础对象解构
const F3 = {
name: "大哥",
age: 25,
skill: "唱歌"
};
// 按属性名提取,变量名与属性名必须一致
let {name, age, skill} = F3;
console.log(name); // 大哥
console.log(skill); // 唱歌
// 重命名解构(变量名与属性名不一致)
let {name: username, age: userAge} = F3;
console.log(username); // 大哥
3.4 应用场景
频繁使用对象属性、数组元素时,用解构赋值替代重复的./[]取值,简化代码。
四、模板字符串:字符串拼接的终极方案
4.1 核心特性
模板字符串使用反引号(`) 标识,是传统字符串的增强版,两大核心优势:
- 支持换行:字符串可直接换行书写,无需拼接换行符;
- 变量嵌入 :通过
${变量名}直接引入变量,替代繁琐的+拼接。
4.2 代码实战演示
javascript
运行
// 1. 基础变量嵌入
let name = "ES6";
let skill = "简化开发";
// 传统拼接(繁琐易错)
let str1 = "我是" + name + ",我的作用是" + skill;
// 模板字符串(简洁直观)
let str2 = `我是${name},我的作用是${skill}`;
console.log(str2); // 我是ES6,我的作用是简化开发
// 2. 支持直接换行
let html = `
<div>
<p>姓名:${name}</p>
<p>技能:${skill}</p>
</div>
`;
console.log(html); // 输出带换行的HTML结构
4.3 应用场景
所有字符串与变量拼接 、多行字符串场景,完全替代传统引号拼接。
五、总结与开发规范
- 变量声明 :放弃
var,变量用let,常量 / 对象 / 数组用const,遵循块级作用域规范; - 数据提取:数组、对象数据提取优先使用解构赋值,精简代码逻辑;
- 字符串处理:所有字符串拼接、多行字符串场景使用模板字符串,提升可读性。
ES6 这四大特性是前端开发的基础必备技能,熟练使用可大幅提升代码质量、开发效率,是现代 JavaScript 开发的核心规范。