晨韵悠悠时!2 道 JS 必考题漫解,静享学习好时光
zhezhongyun 2025-05-26 20:15 27 浏览
晨光透过纱帘,在桌面上洒下斑驳光影,泡一杯清香四溢的茶,让我们伴着这份宁静,一同拆解两道 JavaScript 高频面试题。没有紧张的节奏,就像在晨跑时随意欣赏路边风景,在舒缓中悄然充实自己的知识储备,为面试增添底气。
第一题:JavaScript 中的事件冒泡与捕获
面试官常常会问:“请解释一下 JavaScript 中的事件冒泡和事件捕获是什么,它们有什么区别,在实际开发中有哪些应用场景?” 别被这些术语吓住,把它们想象成一场 “消息传递游戏” 就好理解了。事件冒泡是消息从 “孩子” 传给 “家长”,再层层往上;事件捕获则是消息从 “爷爷” 传给 “爸爸”,最后到 “孩子”,传递方向不同,但都能让我们精准控制事件的响应。
// HTML结构,三个嵌套的div
<div id="parent">
<div id="child">
<div id="grandChild"></div>
</div>
</div>
// JavaScript代码
// 获取元素
const parent = document.getElementById('parent');
const child = document.getElementById('child');
const grandChild = document.getElementById('grandChild');
// 事件冒泡示例
grandChild.addEventListener('click', function() {
console.log('grandChild被点击,先触发自身事件'); // 首先输出
}, false); // 使用默认的冒泡阶段
child.addEventListener('click', function() {
console.log('child被点击,冒泡上来触发事件'); // 接着输出
}, false);
parent.addEventListener('click', function() {
console.log('parent被点击,冒泡到顶层触发事件'); // 最后输出
}, false);
// 事件捕获示例
grandChild.addEventListener('click', function() {
console.log('grandChild在捕获阶段被点击');
}, true); // 设置为捕获阶段
child.addEventListener('click', function() {
console.log('child在捕获阶段被点击');
}, true);
parent.addEventListener('click', function() {
console.log('parent在捕获阶段被点击');
}, true);
在实际开发中,事件冒泡可以用于事件委托,比如在列表项很多时,给列表父元素添加点击事件,就能处理所有列表项的点击,减少内存占用;事件捕获则适合在需要先对事件进行全局处理的场景,比如在页面最外层捕获滚动事件,提前做一些判断和准备工作。
第二题:JavaScript 中的深拷贝与浅拷贝
“请说一说 JavaScript 中深拷贝和浅拷贝的区别,如何实现深拷贝?” 这就好比复制一幅画,浅拷贝只是复制了画的框架和表面色彩,深拷贝则是连画布的纹理、颜料的层次都一模一样地复刻。
浅拷贝示例
// 简单数组浅拷贝
const arr1 = [1, 2, 3];
const arr2 = arr1.slice(); // 使用slice方法进行浅拷贝
arr2[0] = 10;
console.log(arr1); // 输出 [1, 2, 3]
console.log(arr2); // 输出 [10, 2, 3]
// 对象浅拷贝
const obj1 = { a: { b: 1 } };
const obj2 = {...obj1 }; // 使用展开运算符进行浅拷贝
obj2.a.b = 2;
console.log(obj1.a.b); // 输出 2,因为浅拷贝只复制了一层,嵌套对象是共享的
console.log(obj2.a.b); // 输出 2
深拷贝实现方法(利用 JSON.parse 和 JSON.stringify,有局限性)
const obj3 = { a: { b: 1 }, c: [1, 2, 3] };
const obj4 = JSON.parse(JSON.stringify(obj3)); // 通过JSON转换实现深拷贝
obj4.a.b = 2;
obj4.c[0] = 10;
console.log(obj3.a.b); // 输出 1,深拷贝后修改不会影响原对象
console.log(obj3.c[0]); // 输出 1
console.log(obj4.a.b); // 输出 2
console.log(obj4.c[0]); // 输出 10
更完善的深拷贝函数(递归实现)
function deepCopy(obj) {
if (typeof obj!== 'object' || obj === null) {
return obj; // 如果是基本数据类型或null,直接返回
}
let result;
if (Array.isArray(obj)) {
result = [];
for (let item of obj) {
result.push(deepCopy(item)); // 递归处理数组元素
}
} else {
result = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
result[key] = deepCopy(obj[key]); // 递归处理对象属性
}
}
}
return result;
}
const complexObj1 = { a: { b: 1 }, c: [1, { d: 2 }] };
const complexObj2 = deepCopy(complexObj1);
complexObj2.a.b = 2;
complexObj2.c[1].d = 3;
console.log(complexObj1.a.b); // 输出 1
console.log(complexObj1.c[1].d); // 输出 2
console.log(complexObj2.a.b); // 输出 2
console.log(complexObj2.c[1].d); // 输出 3
面试应答模板
事件冒泡与捕获问题回答
“事件冒泡和捕获是 JavaScript 处理事件的两种机制。事件冒泡就像家里孩子闯祸了,先告诉爸爸妈妈,爸爸妈妈再告诉爷爷奶奶,消息从最内层的元素,一层一层往外层传递。事件捕获反过来,是爷爷奶奶先知道,再告诉爸爸妈妈,最后到孩子。默认情况下,事件是冒泡阶段触发。在实际开发里,事件冒泡很适合做事件委托,比如一个页面有很多按钮,不用给每个按钮单独写点击事件,给它们共同的父元素写一个就行,这样能节省内存;事件捕获适合在一开始就对事件做全局处理,比如在页面最外层捕获滚动事件,先判断用户是不是在做特殊操作,再决定要不要继续处理。”
深拷贝与浅拷贝问题回答
“浅拷贝和深拷贝主要区别在于复制对象时,对嵌套对象的处理方式。浅拷贝只复制一层,对于嵌套的对象或数组,复制的只是引用,修改新对象里的嵌套内容,原对象也会跟着变,就像两个人共用一个笔记本,一个人改了内容,另一个人看到的也变了。深拷贝是把对象里所有东西都复制一份,新对象和原对象完全独立,改新的不会影响旧的。实现深拷贝简单的方法可以用 JSON.parse 和 JSON.stringify 转换,但这种方式有局限,像函数、undefined、Symbol 这些类型就处理不了。更完善的办法是写一个递归函数,遇到对象或数组就继续往下复制,直到把所有内容都复制完,这样就能得到一个和原对象完全一样,但又互不影响的新对象了。”
在这悠然的晨间时光里,我们一同完成了知识的漫步。对于这两道题,你是否还有不一样的见解?或者希望下期讲解哪些知识点?欢迎在评论区畅所欲言。觉得文章对你有帮助,别忘了点赞、关注,明天清晨,我们继续相约,探索更多前端面试奥秘!
相关推荐
- Trump Pushes for 15%-20% Minimum Tariffs on EU, Sticks to Auto Duties: Report
-
TMTPOST--U.S.PresidentDonaldTrumpistakingatougherstanceduringtradenegotiationswiththe...
- Note-15.使用A4988控制步进电机(dvp15mc11t控制步进电机)
-
如果需要控制一堆步进电机,那么只使用一个Arduino来控制,就会占用大量的处理时间,而无法处理其他事情,除非使用一个独立的专用步进电机驱动器:A4988。A4988只需两个引脚就可以控制双极步进电机...
- Negotiated settlement, not sanctions, the right way to end the Ukraine crisis
-
Negotiatedsettlement,notsanctions,therightwaytoendtheUkrainecrisis:ChinaDailyeditorial...
- U.S. Services May be Added to EU's Retaliatory Target List as More Members Seek Powerful Trade Tool If Talks Fail
-
TMTPOST--AmericanservicescouldbeaddedtotheEuropeanUnion’sretaliatorytargetlist,highlig...
- S7-1200伺服指令运动指令(s71200伺服位置控制实例)
-
1.MC_Halt指令名称:停止轴运行指令功能:停止所有运动并以组态的减速度停止轴。使用技巧:常用MC_Halt指令来停止通过MC_MoveVelocity指令触发的轴的运行。『注意』部分输入/输出管...
- Deepseek太强了!等了10年的Excel模糊下拉,竟然5分钟就搞定了
-
今天跟大家分享下我们如何通过Deepseek来编写VBA代码,制作模糊搜索的下拉菜单,这个等来十来年的功能,用Deepseek竟然几分钟就搞定了,不得不感叹AI工具的强大,我们以后能干的过AI吗,这真...
- 7.Unity物理关节(unity物理骨骼)
-
7.物理关节Unity的物理关节组件将刚体连接到另一个刚体或空间中的固定点。施加使刚体移动的力,关节限制可以限制移动。关节赋予刚体一定的自由度,从而使这些刚体具有不同的运动。Unity提供的物理关...
- 西门子111报文对应FB284引脚(西门子111报文详解)
-
西门子FB284是基于111报文的功能块,使用FB284比较方便,直接调用就可以控制V90伺服的定位控制。下面是整理的FB284对应的111报文。便于理解FB284功能块,更方面应用在实际项目中。11...
- 数据质量动态探查及相关前端实现(数据质量改进实践指南)
-
需求背景数据探查上线之前,数据验证都是通过写SQL方式进行查询的,从编写SQL,到解析运行出结果,不仅时间长,还会反复消耗计算资源,探查上线后,只需要一次探查,就可以得到整张表的探查报告,但后续...
- 阿里面试官:你连个排序算法都讲不明白?出门右拐吧
-
排序算法一表总览其他注意事项:计数排序中,kkk是整数的范围稳定性是指,序列中相同的数是否有可能交换顺序,例如序列中有两个8,顺序为888和8′8^{'}8′,如果在排序完之后,顺序有...
- 直流电机速度、位置双环控制简明教程
-
速度、位置的双环控制是我们在电机的控制系统中常用的方法,很实用。下面让我们来看一下内部实现的原理。1.速度闭环控制我们一般在速度闭环控制系统里面,使用增量式PI控制。而在我们的微处理器里面,因为控制器...
- 纳米机器人的精准定位与导航(纳米机器人怎么控制位置)
-
纳米机器人的精准定位与导航涉及多学科交叉技术,其“源码”(控制逻辑与算法)需结合硬件特性、环境感知和执行器设计。以下从控制原理、算法逻辑、关键技术实现等方面提供概念性思路(非实际可运行代码),供技术探...
- C语言进阶教程:多级指针的应用(c语言一级指针和二级指针)
-
在C语言中,指针可以指向变量的地址。多级指针(PointerstoPointers或MultilevelPointers)则是指向另一个指针地址的指针。这种概念可以扩展到任意级别(二级指针、...
- 被 Trac 的文件整理能力圈粉了!这 “香” 气挡不住
-
前阵子整理电脑文件夹时,我遇到了个麻烦:上千个文档和照片,要是手动一个个重命名、分类,不仅手得点到发麻,估计还得耗上一上午。于是我就琢磨着,能不能找个办法实现一键批量重命名。我先在网上搜了些批量改名软...
- Enhancer-轻量化的字节码增强组件包
-
一、问题描述当我们的业务发展到一定阶段的时候,系统的复杂度往往会非常高,不再是一个简单的单体应用所能够承载的,随之而来的是系统架构的不断升级与演变。一般对于大型的ToC的互联网企业来说,整个系统都是...
- 一周热门
- 最近发表
-
- Trump Pushes for 15%-20% Minimum Tariffs on EU, Sticks to Auto Duties: Report
- Note-15.使用A4988控制步进电机(dvp15mc11t控制步进电机)
- Negotiated settlement, not sanctions, the right way to end the Ukraine crisis
- U.S. Services May be Added to EU's Retaliatory Target List as More Members Seek Powerful Trade Tool If Talks Fail
- S7-1200伺服指令运动指令(s71200伺服位置控制实例)
- Deepseek太强了!等了10年的Excel模糊下拉,竟然5分钟就搞定了
- 7.Unity物理关节(unity物理骨骼)
- 西门子111报文对应FB284引脚(西门子111报文详解)
- 数据质量动态探查及相关前端实现(数据质量改进实践指南)
- 阿里面试官:你连个排序算法都讲不明白?出门右拐吧
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML文本框样式 (31)
- HTML滚动条样式 (34)
- HTML5 浏览器支持 (33)
- HTML5 新元素 (33)
- HTML5 WebSocket (30)
- HTML5 代码规范 (32)
- HTML5 标签 (717)
- HTML5 标签 (已废弃) (75)
- HTML5电子书 (32)
- HTML5开发工具 (34)
- HTML5小游戏源码 (34)
- HTML5模板下载 (30)
- HTTP 状态消息 (33)
- HTTP 方法:GET 对比 POST (33)
- 键盘快捷键 (35)
- 标签 (226)
- HTML button formtarget 属性 (30)
- CSS 水平对齐 (Horizontal Align) (30)
- opacity 属性 (32)