面试官:"你真的了解ES6吗?"

630 阅读4分钟

是的,我非常了解 ES6(ECMAScript 2015)。

ES6 是 JavaScript 语言的一次里程碑式升级,它极大地丰富了语言的表达能力,引入了许多现代化的编程特性,使得 JavaScript 从一门主要用于网页脚本的语言,转变为能够构建大型复杂应用的工程化语言。

以下是 ES6 的核心特性详解:


一、变量声明:letconst

取代了老旧的 var,解决了变量提升(hoisting)和作用域混乱的问题。

  • let:声明块级作用域的变量,不可重复声明不存在变量提升

    if (true) {
      let x = 10;
    }
    console.log(x); // ReferenceError: x is not defined
    
  • const:声明块级作用域的常量,声明时必须初始化,且不可重新赋值(注意:对于对象和数组,引用不可变,但内部属性可以修改)。

    const obj = { name: 'Alice' };
    obj.name = 'Bob'; // ✅ 允许
    obj = {}; // ❌ 报错,不能重新赋值
    

最佳实践:优先使用 const,如果需要重新赋值再用 let避免使用 var


二、箭头函数(Arrow Functions)

提供了一种更简洁的函数写法,并固定了 this 指向

// 传统函数
function add(a, b) {
  return a + b;
}

// 箭头函数
const add = (a, b) => a + b;

// 单参数可省略括号
const square = x => x * x;

// 多行函数体需用 {} 和 return
const greet = (name) => {
  const time = new Date().getHours();
  return `Hello ${name}, ${time < 12 ? 'morning' : 'afternoon'}!`;
};

关键特性:this 的词法绑定

箭头函数没有自己的 this,它会继承外层作用域的 this

function Timer() {
  this.seconds = 0;
  // 使用普通函数,this 指向错误(指向全局或 undefined)
  setInterval(function() {
    this.seconds++; // ❌ this 不是 Timer 实例
  }, 1000);

  // 使用箭头函数,this 正确指向 Timer 实例
  setInterval(() => {
    this.seconds++; // ✅
  }, 1000);
}

适用场景:回调函数、事件处理器、数组方法(map, filter, reduce)。


三、模板字符串(Template Literals)

使用反引号(`)定义,支持多行文本变量插值

const name = "Alice";
const age = 25;

// 传统拼接
const str1 = "Hello, I'm " + name + ", I'm " + age + " years old.";

// 模板字符串
const str2 = `Hello, I'm ${name}, I'm ${age} years old.`;

// 多行字符串
const html = `
  <div class="user-card">
    <h2>${name}</h2>
    <p>Age: ${age}</p>
  </div>
`;

四、解构赋值(Destructuring Assignment)

从数组或对象中提取值,并赋值给变量,语法简洁。

// 数组解构
const [first, second] = ['Alice', 'Bob'];
console.log(first); // 'Alice'

// 对象解构
const user = { name: 'Charlie', age: 30, city: 'Beijing' };
const { name, age } = user;
console.log(name); // 'Charlie'

// 重命名
const { name: userName, city: userCity = 'Unknown' } = user; // 提供默认值

// 函数参数解构
function displayUser({ name, age }) {
  console.log(`${name} is ${age} years old.`);
}
displayUser(user);

五、默认参数(Default Parameters)

为函数参数指定默认值。

function greet(name = "Guest", greeting = "Hello") {
  return `${greeting}, ${name}!`;
}

greet(); // "Hello, Guest!"
greet("Alice"); // "Hello, Alice!"
greet("Bob", "Hi"); // "Hi, Bob!"

六、扩展运算符(Spread Operator)与剩余参数(Rest Parameters)

  • 扩展运算符(...):将可迭代对象(数组、字符串)展开

    const arr1 = [1, 2];
    const arr2 = [...arr1, 3, 4]; // [1, 2, 3, 4]
    
    const obj1 = { a: 1 };
    const obj2 = { ...obj1, b: 2 }; // { a: 1, b: 2 }
    
    Math.max(...[1, 2, 3]); // 3
    
  • 剩余参数(...):将函数的多个参数收集到一个数组中。

    function sum(...numbers) {
      return numbers.reduce((acc, num) => acc + num, 0);
    }
    sum(1, 2, 3, 4); // 10
    

七、对象字面量的增强写法

const name = "Alice";
const age = 25;

// ES6 之前
const user1 = {
  name: name,
  age: age,
  greet: function() {
    return "Hello!";
  }
};

// ES6 增强写法
const user2 = {
  name, // 属性名与变量名相同时可简写
  age,
  greet() { // 方法可省略冒号和 function
    return "Hello!";
  },
  [name + 'Score']: 95 // 计算属性名
};

八、Promise:异步编程的革新

解决“回调地狱”(Callback Hell),提供更优雅的异步处理方式。

// 创建 Promise
const fetchData = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const success = true;
      if (success) {
        resolve("Data fetched!");
      } else {
        reject("Failed to fetch data.");
      }
    }, 1000);
  });
};

// 使用 Promise
fetchData()
  .then(data => console.log(data))
  .catch(error => console.error(error));

九、模块化(Modules):importexport

实现 JavaScript 文件的模块化管理,是构建大型应用的基础。

// math.js
export const PI = 3.14159;
export function add(a, b) {
  return a + b;
}
export default function multiply(a, b) {
  return a * b;
}

// main.js
import multiply, { PI, add } from './math.js';

console.log(add(2, 3)); // 5
console.log(PI); // 3.14159
console.log(multiply(2, 4)); // 8

十、其他重要特性

  • class:语法糖,提供更清晰的面向对象编程方式(基于原型)。
  • for...of:遍历可迭代对象(数组、字符串、Map、Set),比 for...in 更适合。
  • MapSet:新的数据结构,Map 支持任意类型键,Set 存储唯一值。
  • Symbol:新的原始数据类型,用于创建唯一的属性键,避免命名冲突。

总结

ES6 的出现彻底改变了 JavaScript 的开发方式。它不仅让代码更简洁、更易读,更重要的是引入了模块化、Promise、类等工程化特性,使得 JavaScript 能够胜任从前端到后端(Node.js)的全栈开发。

掌握 ES6 是现代前端开发的必备技能。我在日常开发中,const/let、箭头函数、解构、模板字符串、Promise 和模块化是使用频率最高的特性。它们已经成为我编写 JavaScript 代码的“肌肉记忆”。