- let 和 const 关键字:
- let 用于声明块作用域的变量。
- const 用于声明块作用域的常量。
暂时性死区是指在变量声明之前,该变量在作用域内不可访问的区域。在TDZ中,你不能访问一个还未声明的变量,即使你知道它即将被声明。
变量提升: 指在 JavaScript 中,变量和函数的声明在编译阶段会被提升到它们所在作用域的顶部。这意味着你可以在声明之前使用它们,而不会引发语法错误。不过,变量和函数的初始化不会被提升。
- var 声明的变量会被提升到作用域顶部,但初始化不会被提升。
- let 和 const:声明的变量会被提升,但在初始化之前不能被访问,存在暂时性死区。
- 函数声明提升:函数声明会被提升到作用域顶部,并且整个函数体都会被提升。
- 函数表达式提升:函数表达式的变量名会被提升,但不会提升函数体。
var 声明的变量在循环中共享同一个作用域,可能会导致意外的结果。
使用 let 关键字可以避免这种问题,因为 let 有块级作用域。
使用闭包可以在没有 let 的情况下解决问题,通过创建新的作用域来保存每次迭代的变量。
- 箭头函数:
- 简化函数的定义,并且不绑定自己的 this 值。
- 模板字符串:
- 使用反引号(``)创建多行字符串和插入表达式。
const name = 'World';
const greeting = `Hello, ${name}!`;
- 解构赋值:
- 从数组或对象中提取值,并将它们赋给变量。
const [a, b] = [1, 2];
const { name, age } = { name: 'Alice', age: 25 };
- 默认参数:
- 为函数参数提供默认值。
function greet(name = 'Guest') {
console.log(`Hello, ${name}!`);
}
- 扩展运算符和剩余参数:
- 展开数组或对象的元素。
- 收集所有剩余的参数。剩余参数”(Rest Parameters)是用于表示函数中不确定数量的参数的语法。它通过三个点(
...)来表示,允许我们将不定数量的参数作为数组传递给函数。
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5];
function sum(...numbers) {
return numbers.reduce((total, num) => total + num, 0);
}
- 对象字面量增强:
- 更简洁地定义对象的方法和属性。
const x = 1, y = 2;
const obj = { x, y, greet() { console.log('Hello'); } };
- for...of 循环:
- 遍历可迭代对象(如数组、字符串、Map、Set)。
const array = [1, 2, 3];
for (const item of array) {
console.log(item);
}
- 类(class) :
- 更简洁地定义基于原型的面向对象编程。
class Person {
constructor(name) {
this.name = name;
}
greet() {
console.log(`Hello, ${this.name}`);
}
}
- 模块(Modules) :
- 使用 import 和 export 关键字进行模块化开发。
// 导出
export const PI = 3.14;
export function square(x) { return x * x; }
// 导入
import { PI, square } from './math';
- Promises:
- 用于处理异步操作。
const fetchData = () => new Promise((resolve, reject) => {
setTimeout(() => resolve('Data'), 1000);
});
fetchData().then(data => console.log(data));
- Symbol:
- 创建唯一的标识符,通常用于对象属性。
const sym = Symbol('unique');
const obj = { [sym]: 'value' };
这些特性显著提高了 JavaScript 的可读性、可维护性和功能性,使开发者可以编写更简洁和强大的代码。