专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

忐忑求职期!3 道 JS 高频题拆解,面试稳拿通关秘籍

ins518 2025-06-03 22:25:26 技术文章 8 ℃ 0 评论

前端小伙伴们,是不是每次看到面试题列表就心里打鼓?别担心!今天咱们挑出 3 道 JavaScript 高频 “拦路虎”,用最接地气的方式逐个拆解,就像朋友间聊天一样轻松,帮你把知识点嚼碎吃透,面试时稳扎稳打拿高分!

第一题:this 指向 ——JS 里的 “动态指南针”

面试官最爱问:“说说 JavaScript 中 this 的绑定规则,不同场景下怎么判断?”这问题就像 “找主人” 游戏,this 永远指向 “调用它的那个对象”,记住口诀:谁调用,指向谁,箭头函数是例外(它 “继承” 外层 this)。

// 场景1:普通函数调用,this默认指向window(严格模式是undefined)
function sayHi() {
console.log(this); // 非严格模式输出Window,严格模式报错
}
sayHi(); // 直接调用,主人是window
// 场景2:对象方法调用,this指向当前对象
const user = {
name: '前端小明',
greet() {
console.log(`你好,我是${this.name}`); // this指向user
}
};
user.greet(); // 输出:你好,我是前端小明
// 场景3:构造函数中,this指向新创建的实例
function Book(title) {
this.title = title; // this是新创建的Book对象
}
const jsBook = new Book('JavaScript高级程序设计');
console.log(jsBook.title); // 输出:JavaScript高级程序设计
// 场景4:箭头函数,this继承外层作用域(永远没有自己的this)
const outer = () => {
const name = '外层作用域';
const inner = () => {
console.log(this.name); // this和outer的this一致(如全局window)
};
inner();
};
outer();

关键技巧:调用时看 “点” 前面是谁,比如obj.fn(),this 就是obj;箭头函数直接看外层,比如在对象里用箭头函数,this 可能指向全局,小心别踩坑!

第二题:原型链 —— 对象的 “家族族谱”

“讲讲原型和原型链,怎么通过原型实现继承?”别被术语吓住!原型就像对象的 “祖先档案”,每个对象都有__proto__(隐式原型),指向构造函数的prototype(显式原型)。原型链就是沿着这条 “家谱” 往上找属性,直到Object.prototype。

// 定义父类:动物
function Animal() {
this.type = '生物';
}
Animal.prototype.sayHi = function() {
console.log(`我是一只${this.type}`);
};
// 定义子类:狗,继承自动物
function Dog(name) {
Animal.call(this); // 继承父类属性
this.name = name;
}
// 关键:设置原型链(子类原型指向父类实例)
Dog.prototype = new Animal();
Dog.prototype.constructor = Dog; // 修正构造函数指向
// 创建实例
const旺财 = new Dog('旺财');
console.log(w旺财.type); // 输出:生物(从Animal原型链继承)
旺财.sayHi(); // 输出:我是一只生物(调用原型方法)

实际应用:子类复用父类方法,减少重复代码,比如多个动物子类都能用sayHi,不用每个都写一遍,就像家族里的共同技能传承~

第三题:async/await—— 异步编程的 “丝滑语法糖”

“对比 Promise,说说 async/await 的优势和使用场景。”async/await 是 Promise 的 “升级版”,用同步代码的写法处理异步,就像把复杂的 “异步迷宫” 拉直成一条直线,再也不怕层层嵌套的回调 “绕晕头”。

// 模拟异步请求
function fetchUser() {
return new Promise((resolve) => {
setTimeout(() => {
resolve({ name: '前端小红', age: 25 });
}, 1000);
});
}
// 使用async/await处理异步
async function handleUser() {
console.log('开始获取用户信息...');
const user = await fetchUser(); // 等待Promiseresolve,暂停执行
console.log(`用户姓名:${user.name}`); // 输出:用户姓名:前端小红
console.log('用户信息处理完毕');
}
handleUser();

三大优势

  1. 代码更直观:用await等待结果,像写同步代码一样一行一行执行;
  2. 错误处理简单:用try/catch统一捕获错误,不用每个then都写catch;
  3. 避免回调地狱:多个异步操作链式处理,比如await fetchData1(); await fetchData2();,逻辑清晰不嵌套。

面试应答模板 —— 打动面试官

this 指向怎么答?

“this 的指向就看调用方式:普通函数直接调用,指向 window(严格模式是 undefined);对象方法调用,指向这个对象(比如user.greet(),this 就是 user);构造函数用 new 调用,指向新创建的实例;箭头函数没有自己的 this,永远跟着外层走,比如在全局环境的箭头函数,this 就是 window。记住‘谁调用,指向谁’,箭头函数例外,继承外层的 this。”

原型链是什么?

“原型链是对象找属性的‘家谱’。每个对象都有__proto__,指向构造函数的prototype。比如创建一个狗的实例,它会先找自己的属性,找不到就去原型里找,再找不到就去更上层的原型,直到Object.prototype。通过原型链可以实现继承,子类能复用父类的方法,比如狗继承动物的sayHi方法,不用重复写代码,提高复用性。”

async/await 好在哪?

“async/await 是 Promise 的语法糖,用同步的写法写异步,代码更易读。以前用 Promise 的then回调,多层嵌套像俄罗斯套娃,容易乱。现在用await直接等结果,代码按顺序执行,比如先请求数据,再处理数据,再渲染页面,一步一步来,逻辑清晰,调试也方便。特别是处理多个异步操作时,优势很明显,能大幅减少回调嵌套,让代码更整洁。”

箭头函数能不能完全替代普通函数?

有人觉得箭头函数简洁又省心,写回调时再也不用操心 this 指向,必须首选;也有人认为普通函数更灵活,能当构造函数、能手动改变 this(用 call/apply/bind),复杂场景下不可替代。你平时更爱用哪种?觉得箭头函数在哪些场景会 “翻车”? 来评论区聊聊,看看哪种观点更有道理!

每天花 10 分钟啃透一道面试题,积累起来就是质的飞跃!觉得今天的解析对你有帮助,别忘了点赞关注,后续还有更多硬核面试题拆解,帮你扫清知识盲区,面试时自信满满秀出实力!你还想了解哪些高频题?评论区告诉我,咱们下期见~

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表