关于ES6/7的前端面试题及其解析

发布于:2025-03-26 ⋅ 阅读:(24) ⋅ 点赞:(0)

在这里插入图片描述
在这里插入图片描述


1.什么是Babel,它的主要功能是什么?

Babel 是一种 JavaScript 编译器,主要用于将现代 JavaScript (如 ES6+) 转换为向后兼容的版本(通常是 ES5),以便能够在旧版浏览器或其他环境中运行。通过 Babel 的转换能力,开发者可以在项目中使用最新的 ECMAScript 特性而无需担心兼容性问题。


2.letvar 的区别是什么?

let 是 ES6 中引入的一种声明变量的方式,它具有块级作用域(block scope)。相比之下,var 只有函数作用域和全局作用域,在同一作用域内重复声明不会报错,可能会覆盖之前的值。此外,let 不会像 var 那样被提升到当前作用域顶部。

function test() {
    console.log(x); // 输出 undefined
    var x = 1;

    if (true) {
        let y = 2;
    }
    console.log(y); // ReferenceError: y is not defined
}
test();

3.如何定义箭头函数?它有哪些特点?

箭头函数是一种更简洁的函数表达方式,语法如下:

const add = (a, b) => a + b;

其特点是:

  • 无独立的 this 绑定:箭头函数内部的 this 始终指向定义时所在的上下文,而不是调用时的上下文。
  • 不可作为构造函数:无法通过 new 来实例化箭头函数。
  • 不能改变自身的 arguments 对象:箭头函数没有自己的 arguments 对象,而是继承自外部作用域。

4.解构赋值的作用以及如何实现数组解构和对象解构?

解构赋值允许从数组或对象中提取数据并将其分配给不同的变量。以下是两种常见的形式:

数组解构
const numbers = [1, 2, 3];
const [first, second] = numbers; // first=1, second=2
对象解构
const person = { name: 'Alice', age: 25 };
const { name, age } = person; // name='Alice', age=25

这种特性简化了复杂结构的数据访问过程。


5.Promise 的基本概念及状态变化流程?

Promise 表示异步操作的结果,它可以处于三种状态之一:待处理 (pending)、已成功完成 (fulfilled) 或失败 (rejected)。当一个 Promise 创建完成后,可以通过 .then() 方法来接收成功的回调结果,或者通过 .catch() 处理错误情况。

const promise = new Promise((resolve, reject) => {
    const success = true;
    if (success) resolve('Operation succeeded');
    else reject('Something went wrong!');
});

promise.then(result => console.log(result)) // 如果成功,则打印消息
       .catch(error => console.error(error)); // 如果失败,则捕获异常

6.Generator 函数的工作原理?

Generator 函数是 ES6 提供的一个新工具,用于控制迭代行为。它们通过关键字 function* 定义,并支持暂停执行的能力。每次调用 next() 方法都会恢复一次执行直到遇到下一个 yield 表达式为止。

function* generatorFunction() {
    yield 1;
    yield 2;
}

const gen = generatorFunction();
console.log(gen.next().value); // 输出 1
console.log(gen.next().value); // 输出 2

7.Rest 参数与 Spread 运算符的区别?

Rest 参数用于收集剩余参数并将它们存储在一个数组里;Spread 运算符则用来展开已有数组或可迭代对象中的元素。

使用 Rest 参数的例子
function sum(...args) {
    return args.reduce((acc, num) => acc + num, 0);
}
sum(1, 2, 3); // 返回 6
使用 Spread 运算符的例子
const array1 = [1, 2];
const array2 = [...array1, 3]; // 合并两个数组得到 [1, 2, 3]

8.Async/Await 的工作机制?

Async/Await 是基于 Promises 实现的一套更加优雅的方式来书写异步代码。其中 async 将函数标记为异步模式,而 await 则等待某个 Promise 结果返回后再继续向下执行。

async function fetchData(url) {
    try {
        const response = await fetch(url);
        const data = await response.json();
        return data;
    } catch (error) {
        throw error;
    }
}
fetchData('/api/data').then(data => console.log(data));

9.JSON 字符串转对象的方法除了 eval 是否还有其他推荐方法?

虽然可以利用 eval 将 JSON 字符串转化为对象,但由于安全性原因并不建议这样做。更好的替代方案是采用内置方法 JSON.parse(),该方法不仅效率更高而且规避了许多潜在风险。

const jsonString = '{"name": "John", "age": 30}';
const jsonObject = JSON.parse(jsonString); // 正确做法
// const jsonObject = eval('(' + jsonString + ')'); // 不推荐的做法

10.ES7带来了哪些新特性?

尽管ES7相比前代改动较少,但它依然贡献了一些实用的小型更新3:

  • Array.prototype.includes() 方法被正式纳入标准库,用来判断某个特定元素是否存在集合之中。
  • 对幂次计算提供了专用操作符(**)替代Math.pow()函数调用。
    示例演示:
console.log([1, 2, 3].includes(2));       // true
console.log(Math.pow(2, 3), 2 ** 3);     // 均返回8

11.如何区分ES5与ES6的主要差异?

ES6相较于ES5,在功能性和可读性方面都有较大提升。以下是几个关键改进点:

  • 新增了模块化的支持 (import/export)。
  • 提供了类(Class)声明形式,使面向对象编程更加直观。
  • 支持默认参数值设定。
  • 引进了剩余运算符(Rest Parameters)、扩展运算符(Spread Operator)等功能增强机制。

12.ES6中模板字符串的作用是什么?如何使用?

模板字符串允许嵌入变量和表达式,从而更方便地构建复杂的字符串结构。模板字符串由反引号(``)包裹,并支持多行书写以及${}占位符来插入动态内容:

let firstName = "John";
let lastName = "Doe";
let age = 30;
let message = `
Name: ${firstName} ${lastName}
Age: ${age}`;
console.log(message);
// 输出:
// Name: John Doe
// Age: 30

13.什么是箭头函数?它的特点有哪些?

箭头函数是ES6引入的一种新的函数定义方式,其语法更为简洁。它具有以下几个显著的特点:

  • 无自己的this绑定:箭头函数不会创建自己的this上下文,而是继承自外部作用域的this。
  • 无法作为构造器调用:箭头函数不能通过new关键字实例化对象。
  • 不可修改arguments对象的行为:箭头函数内部没有独立的arguments对象。