前端面试题-JS进阶
发布人:shili8
发布时间:2025-03-08 08:19
阅读次数:0
**前端面试题 - JS进阶**
### 一、闭包和作用域1.什么是闭包?
function outer() {
let x =10;
return function inner() {
console.log(x);
}
}
const f = outer();
f(); // 输出:10 **答案:**闭包是指一个函数可以访问其外部作用域中的变量。
2.什么是作用域?
let x =10;
function outer() {
let y =20;
function inner() {
console.log(x, y);
}
return inner;
}
const f = outer();
f(); // 输出:1020 **答案:** 作用域是指一个变量的可访问范围。
3.闭包和作用域的区别在哪里?
let x =10;
function outer() {
let y =20;
return function inner() {
console.log(x); // 这里访问的是外部作用域中的x let z =30; // 这里定义了一个新的变量z,属于inner函数的作用域 console.log(z);
}
}
const f = outer();
f(); // 输出:1030 **答案:**闭包是指一个函数可以访问其外部作用域中的变量,而作用域则是指一个变量的可访问范围。
### 二、this和call/apply/bind1.什么是this?
function outer() {
let x =10;
return function inner() {
console.log(this.x);
}
}
const f = outer();
f(); // 输出: undefined **答案:** this指向当前函数的执行环境。
2. call和apply的区别在哪里?
let x =10;
function outer() {
return function inner(thisArg) {
console.log(this.x);
}
}
const f = outer();
f.call({x:20}); // 输出:20 f.apply({x:30}); // 输出:30 **答案:** call和apply都是用于改变this指向的函数,但call是直接传递参数,而apply则需要传递一个数组作为参数。
3. bind的作用是什么?
let x =10;
function outer() {
return function inner(thisArg) {
console.log(this.x);
}
}
const f = outer();
const g = f.bind({x:20});
g(); // 输出:20 **答案:** bind用于改变this指向,并返回一个新的函数。
### 三、Promise和async/await1.什么是Promise?
function outer() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(10);
},1000);
});
}
const f = outer();
f.then(value => console.log(value)); // 输出:10 **答案:** Promise是指一个异步操作的结果。
2. async/await的作用是什么?
function outer() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(10);
},1000);
});
}
async function main() {
const value = await outer();
console.log(value); // 输出:10 }
main();
**答案:** async/await用于简化Promise的使用。
3. Promise.all和Promise.race的区别在哪里?
function outer() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(10);
},1000);
});
}
const f = outer();
const g = outer();
Promise.all([f, g]).then(values => console.log(values)); // 输出: [10,10]
Promise.race([f, g]).then(value => console.log(value)); // 输出:10 **答案:** Promise.all用于等待所有Promise完成,而Promise.race则是指等待第一个Promise完成。
### 四、Set和Map1.什么是Set?
const s = new Set([1,2,3]);
console.log(s); // 输出: Set {1,2,3}
**答案:** Set是一个集合,用于存储唯一的值。
2.什么是Map?
const m = new Map();
m.set('a',10);
m.set('b',20);
console.log(m); // 输出: Map { 'a' =>10, 'b' =>20 }
**答案:** Map是一个键值对的集合,用于存储关联数据。
3. Set和Map的区别在哪里?
const s = new Set([1,2,3]);
console.log(s); // 输出: Set {1,2,3}
const m = new Map();
m.set('a',10);
m.set('b',20);
console.log(m); // 输出: Map { 'a' =>10, 'b' =>20 }
**答案:** Set用于存储唯一的值,而Map则是用于存储关联数据。
### 五、Proxy和Reflect1.什么是Proxy?
const target = {
get: function() {
return10;
}
};
const proxy = new Proxy(target, {});
console.log(proxy.get()); // 输出:10 **答案:** Proxy是一个代理对象,用于拦截和修改目标对象的行为。
2.什么是Reflect?
Reflect.get(proxy, 'get');
**答案:** Reflect是一个反射对象,用于操作Proxy的行为。
3. Proxy和Reflect的区别在哪里?
const target = {
get: function() {
return10;
}
};
const proxy = new Proxy(target, {});
console.log(proxy.get()); // 输出:10 Reflect.get(proxy, 'get');
**答案:** Proxy用于拦截和修改目标对象的行为,而Reflect则是用于操作Proxy的行为。
### 六、Symbol和WeakMap1.什么是Symbol?
const s = Symbol(); console.log(s); // 输出: Symbol()
**答案:** Symbol是一个独特的值,用于表示不可变的属性名。
2.什么是WeakMap?
const m = new WeakMap();
m.set({},10);
console.log(m.get({})); // 输出:10 **答案:** WeakMap是一个键值对的集合,用于存储关联数据,并且可以使用弱引用。
3. Symbol和WeakMap的区别在哪里?
const s = Symbol();
console.log(s); // 输出: Symbol()
const m = new WeakMap();
m.set({},10);
console.log(m.get({})); // 输出:10 **答案:** Symbol用于表示不可变的属性名,而WeakMap则是用于存储关联数据。
### 七、Generator和AsyncIterator1.什么是Generator?
function* outer() {
yield10;
yield20;
}
const f = outer();
console.log(f.next().value); // 输出:10 console.log(f.next().value); // 输出:20 **答案:** Generator是一个生成器函数,用于产生一系列的值。
2.什么是AsyncIterator?
async function* outer() {
yield10;
yield20;
}
const f = outer();
for await (const value of f) {
console.log(value); // 输出:10,20 }
**答案:** AsyncIterator是一个异步生成器函数,用于产生一系列的值。
3. Generator和AsyncIterator的区别在哪里?
function* outer() {
yield10;
yield20;
}
const f = outer();
console.log(f.next().value); // 输出:10 console.log(f.next().value); // 输出:20 async function* outer() {
yield10;
yield20;
}
const f = outer();
for await (const value of f) {
console.log(value); // 输出:10,20 }
**答案:** Generator用于产生一系列的值,而AsyncIterator则是用于产生异步的一系列的值。
### 八、Class和Object1.什么是Class?
class Person {
constructor(name) {
this.name = name;
}
sayHello() {
console.log(`Hello, my name is ${this.name}.`);
}
}
const person = new Person('John');
person.sayHello

