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

网站首页 > 技术文章 正文

惬意晨光中!2 道 JS 面试题漫谈,开启知识小旅程

ins518 2025-05-15 18:20:19 技术文章 2 ℃ 0 评论




清晨的阳光温柔地洒在窗台上,泡一杯清香的茶,在这宁静又美好的时光里,让我们放慢脚步,一起聊聊两道 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。利用原型和原型链,我们可以实现代码的复用,减少重复代码,比如多个对象都需要某个相同的方法,就可以放在原型上。”

函数防抖与节流问题回答

“函数防抖和节流都是为了优化性能,控制函数的执行频率。防抖就像你打字,打完一段内容停一会儿,程序才会去执行相应操作,避免你还没打完就频繁触发。比如搜索框,用户一边输入一边搜索会很耗性能,用防抖可以等用户输入完暂停一会儿再搜索。节流呢,就像规定你在一段时间内只能做一次特定的事,比如页面滚动事件,如果不节流,滚动过程中事件会频繁触发,影响性能,节流后可以控制每隔一段时间执行一次,保证页面流畅,又能完成必要的操作。”

在这美好的清晨和上午时光里,完成了这一次知识的漫步,是不是感觉身心愉悦又收获满满?对于这两道题,你还有什么独特的见解,或者想了解更多相关知识,欢迎在评论区留言分享。别忘了点赞和关注,明天同一时间,我们继续在知识的花园里漫步!

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

欢迎 发表评论:

最近发表
标签列表