网站首页 > 技术文章 正文
清晨的阳光温柔地洒在窗台上,泡一杯清香的茶,在这宁静又美好的时光里,让我们放慢脚步,一起聊聊两道 JavaScript 高频面试题。没有紧张和焦虑,就像和老友谈天说地,在舒缓的氛围里,悄悄为自己的前端知识宝库添上几颗 “宝石”。
第一题:JavaScript 中的原型与原型链
面试官经常会问:“说一说原型和原型链是什么,它们在 JavaScript 中起到什么作用?” 别被这些听起来有点 “高深” 的名词唬住,其实原型就像一个 “家族传承”,每个对象都能从它的 “长辈” 那里继承一些 “特质”,而原型链就是连接这些 “家族成员” 的纽带。
// 定义一个构造函数,就像创建一个“家族模板”
function Person(name) {
this.name = name; // 每个“家族成员”都有自己的名字
}
// 在原型上添加方法,这是所有“家族成员”都能共享的“技能”
Person.prototype.sayHello = function() {
console.log(`你好,我是${this.name}`);
};
// 创建一个Person实例,相当于诞生了一个“家族新成员”
const tom = new Person('Tom');
// 调用原型上的方法,就像新成员使用家族共享的技能
tom.sayHello();
在这段代码里,Person是构造函数,Person.prototype就是它的原型。当我们通过new Person('Tom')创建tom这个实例时,tom的__proto__(隐式原型)会指向Person.prototype。这样tom就能访问原型上的sayHello方法了。原型链就是从实例对象开始,沿着__proto__不断向上查找,直到Object.prototype,再往上就是null,就像家族寻根一样,一层一层追溯源头。
第二题:函数防抖与节流
“请讲讲函数防抖和节流的原理,在实际开发中有哪些应用场景?” 这两个概念听起来有些陌生,但把它们想象成 “生活小管家” 就容易理解了。函数防抖像是个 “耐心的管家”,非要等你 “消停” 一会儿,才去执行任务;函数节流则像个 “严格的管家”,规定你在一定时间内只能执行一次任务。
函数防抖
// 创建一个防抖函数,参数是要执行的函数和等待时间
function debounce(func, delay) {
let timer; // 用于存储定时器
return function() {
const context = this;
const args = arguments;
// 每次触发时,清除之前的定时器
if (timer) {
clearTimeout(timer);
}
// 设置新的定时器,等待delay时间后执行函数
timer = setTimeout(() => {
func.apply(context, args);
}, delay);
};
}
// 模拟一个需要防抖的函数,比如搜索框的搜索事件
function search() {
console.log('开始搜索...');
}
// 创建防抖后的搜索函数,等待300毫秒
const debouncedSearch = debounce(search, 300);
函数节流
// 创建一个节流函数,参数是要执行的函数和时间间隔
function throttle(func, limit) {
let inThrottle; // 标记是否在节流中
return function() {
const context = this;
const args = arguments;
// 如果不在节流中,执行函数并设置节流标记
if (!inThrottle) {
func.apply(context, args);
inThrottle = true;
// 等待limit时间后,重置节流标记
setTimeout(() => {
inThrottle = false;
}, limit);
}
};
}
// 模拟一个需要节流的函数,比如滚动事件
function handleScroll() {
console.log('处理滚动事件...');
}
// 创建节流后的滚动函数,每500毫秒执行一次
const throttledScroll = throttle(handleScroll, 500);
在实际开发中,函数防抖常用于搜索框搜索、按钮提交等场景,避免用户频繁操作导致的性能问题;函数节流则适用于滚动事件、窗口 Resize 事件等,控制事件触发的频率,提升页面流畅度。
面试应答模板
原型与原型链问题回答
“原型就像是 JavaScript 对象的‘家族族谱’,每个对象都有自己的原型,通过原型可以继承一些属性和方法。构造函数的prototype是显式原型,而实例对象的__proto__是隐式原型,实例的隐式原型会指向构造函数的显式原型,这样就形成了原型链。就好比家族里,晚辈能继承长辈的一些特质和技能。当我们访问对象的某个属性或方法时,如果对象自身没有,就会沿着原型链往上找,直到找到为止,或者找到Object.prototype还没找到,就返回undefined。利用原型和原型链,我们可以实现代码的复用,减少重复代码,比如多个对象都需要某个相同的方法,就可以放在原型上。”
函数防抖与节流问题回答
“函数防抖和节流都是为了优化性能,控制函数的执行频率。防抖就像你打字,打完一段内容停一会儿,程序才会去执行相应操作,避免你还没打完就频繁触发。比如搜索框,用户一边输入一边搜索会很耗性能,用防抖可以等用户输入完暂停一会儿再搜索。节流呢,就像规定你在一段时间内只能做一次特定的事,比如页面滚动事件,如果不节流,滚动过程中事件会频繁触发,影响性能,节流后可以控制每隔一段时间执行一次,保证页面流畅,又能完成必要的操作。”
在这美好的清晨和上午时光里,完成了这一次知识的漫步,是不是感觉身心愉悦又收获满满?对于这两道题,你还有什么独特的见解,或者想了解更多相关知识,欢迎在评论区留言分享。别忘了点赞和关注,明天同一时间,我们继续在知识的花园里漫步!
猜你喜欢
- 2025-05-15 面试必问!前端自动检测代码更新大揭秘
- 2025-05-15 疲惫夜晚充电!1 道 JS 异步手写题攻克面试关键考点
- 2025-05-15 宁静清晨!两道 CSS 面试题,助你从容应对职场挑战
- 2025-05-15 前端面试被问「你在未来 5 年的职业目标是什么」
- 2025-05-15 焦虑退散!3 道 JS 面试题详解,轻松吃透核心考点
- 2025-05-15 焦虑求职季!3 大 JS 高频题解析,助你面试稳拿 offer
- 2025-05-15 悠然晨光里!2 道 JS 面试题慢品,开启高效学习日
- 2025-05-15 疲惫下班别愁!1 道 TypeScript 面试题助你充电避坑
- 2025-05-15 懵圈!面试官追问 HTML 空元素细节,3 分钟吃透核心考点
- 2025-05-15 [抓狂瞬间] 5 大差异 + 布局绝招!前端元素面试通关秘籍
你 发表评论:
欢迎- 最近发表
-
- 宇宙厂:深入聊聊 CJS 和 ESM 模块化三点核心差异?
- #前端高手进阶#一起薅羊毛~
- 前端基础进阶(十):深入详解函数的柯里化
- 2025 年 Object 和 Map 如何选择?
- 为何说 postMessage 才是真正的 setTimeout(0)?
- 为什么高手写 JS 总是又快又好?这10个技巧你要知道
- 2025 年 Deno 终于官宣 pnpm 和 Yarn 可使用 JSR?
- 宇宙厂:为什么前端要了解 Interaction to Next Paint (INP)
- Node.js 原生支持 TypeScript?开发者需要了解的一切
- 请务必用 postTask/isInputPending 释放JS主线程!
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端md5加密 (49)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- 前端接口 (46)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle约束 (46)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)