百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

晨韵悠悠时!2 道 JS 必考题漫解,静享学习好时光

zhezhongyun 2025-05-26 20:15 18 浏览

晨光透过纱帘,在桌面上洒下斑驳光影,泡一杯清香四溢的茶,让我们伴着这份宁静,一同拆解两道 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 这些类型就处理不了。更完善的办法是写一个递归函数,遇到对象或数组就继续往下复制,直到把所有内容都复制完,这样就能得到一个和原对象完全一样,但又互不影响的新对象了。”

在这悠然的晨间时光里,我们一同完成了知识的漫步。对于这两道题,你是否还有不一样的见解?或者希望下期讲解哪些知识点?欢迎在评论区畅所欲言。觉得文章对你有帮助,别忘了点赞、关注,明天清晨,我们继续相约,探索更多前端面试奥秘!

相关推荐

Angular UI组件库入门指南 - 如何安装和开始使用(一)

本文主要介绍如何安装和开始使用KendoUIforAngular。首先完成安装步骤。然后创建一个简单的应用程序,其中包含一些KendoUIforAngular组件,应用程序源代码可供您参考...

SPSS22: 3.1.3 数据管理—复制数据属性

内容摘自《SPSS常用统计分析教程(SPSS22.0中英文版)(第4版)》3.1.3复制数据属性复制数据属性(CopyDataProperties)可用于建立相同调查问卷的空白数据集,或者复制其...

妙用Excel制作漂亮工整的工资条(excel表格中如何制作工资条)

工资条的制作方法并不难,但如何用Excel把工资条做得更美观、更有效率,可就要花费一点小心思了。许多人或许已经习惯了用工资明细表做员工工资统计并向上级汇报,将表中的条目慢慢复制粘贴然后打印给员工,这样...

如何运用EXCEL制作员工工资条,你造吗?

每个月工资发放之后,正规的公司应发给每个员工一个工资条。上面有员工当月工资的详细构成。但不能将工资明细表剪条发放,因为每个数字缺少对应项目,这就需要重新制作一张专门用来打印的工资条。作为劳动者,应该妥...

鸿蒙仓颉语言开发实战教程:实现商品分类页

今天继续为大家带来仓颉语言开发商城应用的实战教程,今天的内容是实现商品分类页。分类页面要在基本布局的基础上增加一些动态效果,比如点击状态的切换和两个列表容器的联动。下面为大家详细介绍。分类列表先来看左...

鸿蒙开发实战:一多开发之缩放布局

在HarmonyOS中,使用ArkTS语法进行自适应布局时,缩放布局是一种重要的布局方式。它允许组件根据外部容器的尺寸变化,按照预设的比例或权重调整自身的大小,从而确保在不同设备上都能呈现出良好的视觉...

基于WPF的电能质量检测系统上位机软件设计

郑恒持,蒋丁宇,卢兴泉,刘泊江(大连海事大学轮机工程学院,辽宁大连116026)摘要:电能质量直接影响着电力系统能否安全运行,为了能及时可靠地检测电能质量,采用全新的WindowsPresen...

HarmonyOS实战:Tab顶部滑动悬停功能实现

前言日常开发过程中,遇到这种Scroll嵌套List列表滑动顶部悬停的场景十分常见,在鸿蒙开发时也正好实现了这个功能,本篇文章将带你一步步实现Tab顶部悬停的效果,建议点赞收藏!实现效果先...

Axure教程:高级搜索(axure搜索功能怎么做)

在原型中,搜索是一个常见的交互设计。但不少同学因为技能不熟悉就没有做对应的交互效果。这篇文章,作者分享了设计搜索功能的整个流程,相信看完你也能做一个很牛逼的交互。高级搜索可以通过使用精确的关键词或短语...

Excel小技巧: 如何设置自动列宽适应内容

我们在整理Excel表格的时候,通常会碰到单元格列宽混乱的情况(如下图所示),这会导致数据显示不完整或浪费空间导致打印不全,每次手动调整列宽都会费时费力,下面教你三个方法,让你一键设置自动列宽,适应单...

用好6个公式 Excel随意查询(excel中查询功能怎么用公式)

Excel表格一般会储存大量数据,我们可能不是每次都需要使用其中的所有数据,大部分时候只用到其中的一部分,所以数据查询功能就变得非常重要。为此,Excel本身也提供了多少查询方法,供我们使用。首先我们...

夏日PC消暑指南:机箱风道与风扇选择

进入六月以后北京的天气真是热得让人感觉喘不过气,大家天天打交道的笔记本和台式机更是连人都不如了,所谓热成狗真是一点也不夸张。年年大家在防暑抗高温这个问题上都是八仙过海各显神通,但是很多人光顾着自己凉快...

Excel VBA必学技巧:用厘米设置单元格大小,办公效率翻倍

痛点:Excel默认单位太反人类!你是否经常遇到这些问题:-想设置精确的单元格尺寸,却只能用模糊的"字符宽度"和"磅值"?-设计打印报表时,毫米级的误差导致格式错乱...

CSS小知识,分享14个你可能还未用上但又实用的CSS属性(下)

大家好,在上一篇文章里CSS小知识,分享14个你可能还未用上但又实用的CSS属性(上)我们一起学习了上半部分,这篇文章我们我们继续学习下半部分。八、CSSShakeEffect晃动效果CSS...

总结雅虎前端性能优化技巧(16条)(雅虎引擎还能用吗)

前言在日常开发中,有很多场景需要我们去做好前端优化,为了防止遗忘,加深记忆,今天参阅了一些资料以及自己的一些总结,梳理出来15条优化技巧。1.合并文件css、js合并,减少http请求数,每次http...