ES6(ECMAScript 2015)的一些常见面试问题,涵盖了变量声明、箭头函数、模板字符串、解构赋值、模块化、类、Promise、生成器等关键特性。有些面试就是问问,对老程序员面试其实不问这么多╮(╯▽╰)╭
文章目录
1. 变量声明
1.1 let
和 const
与 var
的区别是什么?
- 回答:
var
:- 函数作用域或全局作用域。
- 可以重新声明和重新赋值。
- 存在变量提升(hoisting)。
let
:- 块级作用域(
{}
内)。 - 可以重新赋值,但不能重新声明。
- 存在暂时性死区(temporal dead zone)。
- 块级作用域(
const
:- 块级作用域。
- 不能重新声明和重新赋值(对于基本类型),但可以修改对象和数组的属性。
- 存在暂时性死区。
1.2 什么是变量提升(hoisting)?
- 回答:
- 变量提升是指变量和函数声明在代码执行前被移动到作用域的顶部。
var
声明会被提升,但赋值不会。let
和const
声明也会被提升,但在声明之前访问会导致ReferenceError
。
2. 箭头函数
2.1 什么是箭头函数?箭头函数与普通函数有什么区别?
- 回答:
- 箭头函数:使用箭头
=>
定义的函数。const add = (a, b) => a + b;
- 区别:
- 语法更简洁。
- 没有自己的
this
绑定:箭头函数继承自父作用域的this
。 - 没有
arguments
对象:箭头函数没有arguments
对象,可以使用剩余参数(rest parameters)。 - 不能用作构造函数:不能使用
new
关键字。 - 没有
prototype
属性。
- 箭头函数:使用箭头
2.2 箭头函数中的 this
是如何工作的?
- 回答:
- 箭头函数没有自己的
this
绑定,它继承自父作用域的this
。
const obj = { name: 'Alice', greet: function() { setTimeout(() => { console.log(`Hello, ${ this.name}`); }, 1000); } }; obj.greet(); // 输出: Hello, Alice
- 箭头函数没有自己的
3. 模板字符串
3.1 什么是模板字符串?模板字符串与普通字符串有什么区别?
- 回答:
- 模板字符串:使用反引号(
`
)定义的字符串,支持内嵌表达式。const name = 'Alice'; const greeting = `Hello, ${ name}!`;
- 区别:
- 支持多行字符串:可以包含换行符。
- 支持内嵌表达式:使用
${expression}
语法。 - 更好的可读性:适合构建复杂的字符串。
- 模板字符串:使用反引号(
4. 解构赋值
4.1 什么是解构赋值?解构赋值有哪些用途?
- 回答:
- 解构赋值:从数组或对象中提取数据并赋值给变量。
const [a, b] = [1, 2]; const { name, age } = { name: 'Alice', age: 25 };
- 用途:
- 数组解构:从数组中提取元素。
- 对象解构:从对象中提取属性。
- 函数参数解构:在函数参数中使用解构。
- 解构赋值:从数组或对象中提取数据并赋值给变量。
4.2 如何使用默认值进行解构赋值?
- 回答:
- 可以为解构赋值提供默认值。
const [a = 1, b = 2] = [5]; console.log(a, b); // 输出: 5 2 const { name = 'Guest', age = 18 } = { }; console.log(name, age); // 输出: Guest 18
- 可以为解构赋值提供默认值。
5. 模块化
5.1 什么是模块化?ES6 模块化有哪些关键字?
- 回答:
- 模块化:将代码分割成独立的模块,便于管理和复用。
- 关键字:
export
:导出模块内容。<