网站首页 > 技术文章 正文
前端小伙伴们,是不是每次看到面试题列表就心里打鼓?别担心!今天咱们挑出 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();
三大优势:
- 代码更直观:用await等待结果,像写同步代码一样一行一行执行;
- 错误处理简单:用try/catch统一捕获错误,不用每个then都写catch;
- 避免回调地狱:多个异步操作链式处理,比如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 分钟啃透一道面试题,积累起来就是质的飞跃!觉得今天的解析对你有帮助,别忘了点赞关注,后续还有更多硬核面试题拆解,帮你扫清知识盲区,面试时自信满满秀出实力!你还想了解哪些高频题?评论区告诉我,咱们下期见~
猜你喜欢
- 2025-06-03 晨光微语!一道 CSS 面试题,伴你静享知识治愈时光
- 2025-06-03 平和!晨间攻克 HTML 表格属性题,面试难题轻松化解
- 2025-06-03 紧张求职期!3 道 JS 核心题拆解,面试稳抓得分点
- 2025-06-03 轻松面试路!3 道 JS 核心题解析,稳抓基础分
- 2025-06-03 auto.js面试题及答案(auto.js案例)
- 2025-06-03 一个貌似简单但会难倒高级前端程序员的面试题
- 2024-09-27 web前端与移动开发-前端移动开发面试题
- 2024-09-27 前端开发工程师常见面试题 前端开发工程师面试题目
- 2024-09-27 前端开发面试题目(关注我长期更新)
- 2024-09-27 2020Web前端开发常见面试题及答案-开课吧
你 发表评论:
欢迎- 495℃几个Oracle空值处理函数 oracle处理null值的函数
- 491℃Oracle分析函数之Lag和Lead()使用
- 489℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 477℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 469℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 465℃【数据统计分析】详解Oracle分组函数之CUBE
- 448℃Oracle有哪些常见的函数? oracle中常用的函数
- 444℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 最近发表
-
- Spring Boot跨域难题终结者:3种方案,从此告别CORS噩梦!
- 京东大佬问我,SpringBoot为什么会出现跨域问题?如何解决?
- 在 Spring Boot3 中轻松解决接口跨域访问问题
- 最常见五种跨域解决方案(常见跨域及其解决方案)
- Java Web开发中优雅应对跨域问题(java跨域问题解决办法)
- Spring Boot解决跨域最全指南:从入门到放弃?不,到根治!
- Spring Boot跨域问题终极解决方案:3种方案彻底告别CORS错误
- Spring Cloud 轻松解决跨域,别再乱用了
- Github 太狠了,居然把 "master" 干掉了
- IntelliJ IDEA 调试 Java 8,实在太香了
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)