前端高频面试题 5.08

news2024/12/29 0:45:42

事件委托

事件委托是前端开发中常用的一种优化性能和代码可维护性的方法,它基于DOM的事件冒泡机制。当一个元素触发事件时,这个事件会按照从顶层到底层的顺序传播,直到最底层的元素(通常是文档的根节点)。事件委托利用了这个特性,通过在父元素上设置事件处理程序来监听子元素的事件,从而减少不必要的事件处理程序的数量。

在这里插入图片描述

1. 事件委托的定义与作用:

事件委托允许我们将事件监听器添加到其父元素上,这样只有当这些子元素触发事件时,才会执行相应的处理程序。这样做的好处是减少了不必要的事件监听器的创建,因为不需要为每个可能触发事件的子元素都添加一个监听器。此外,它还可以减少内存占用和提高页面渲染性能,因为减少了绑定到子元素上的事件处理函数的数量。

2. 使用事件委托的编程场景以及它如何提升性能:

事件委托通常用于以下场景:

  • 当需要对一组相似的元素进行操作时,比如所有的按钮点击事件。
  • 当需要避免在每个独立的子元素上添加事件监听器时。
  • 当希望将某些行为应用到一组具有相同或相似行为的多个元素上时。

通过事件委托,我们可以避免为每个独立的子元素重复编写相同的事件处理逻辑,从而提高了代码的复用性和可维护性。同时,由于减少了绑定到每个子元素的事件处理函数的数量,因此可以减轻浏览器的负担,提高页面的性能。

3. 提供一段代码示例来展示如何在项目中实现事件委托:

假设我们有一个包含多个按钮的列表,并且我们希望在用户点击任何按钮时执行一些操作。我们可以使用事件委托来实现这一点,而不是为每个按钮单独添加一个点击事件的监听器。以下是一个简单的示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Event Delegation Example</title>
</head>
<body>
    <ul id="buttonList">
        <!-- Buttons will be dynamically added here -->
    </ul>
    <script>
        // Get the list of buttons and add event listeners to the parent element (#buttonList)
        let buttonList = document.getElementById("buttonList");
        buttonList.addEventListener("click", function(event) {
            if (event.target.matches("button")) {
                // Handle button click here, e.g., perform some action or log an event message
                console.log("Button clicked: " + event.target.innerHTML);
            } else {
                // If the target is not a button, ignore the click event or handle it differently as needed
            }
        });
    </script>
</body>
</html>

在这个例子中,我们首先获取了一个包含按钮的buttonList列表,然后在这个列表上添加了一个点击事件的监听器。当用户点击列表中的任何按钮时,都会触发这个监听器。如果目标元素是一个按钮,我们就执行相应的操作;如果不是,则忽略这次点击或者根据需要进行其他处理。

标签生成的Dom结构是一个类数组 对吗

在Web前端开发中,标签生成的DOM结构可以被视作类数组对象。类数组对象是指那些拥有类似数组属性的对象,它们可以通过索引访问元素,但并非传统意义上的数组。DOM元素就是典型的类数组对象,因为它们具有length属性、可以通过索引访问特定元素,并且可以使用for…of循环进行遍历。

例如,假设我们有一个HTML文档,其中包含一些带有ID的按钮:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>DOM Example</title>
</head>
<body>
    <button id="btn1">Button 1</button>
    <button id="btn2">Button 2</button>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</body>
</html>

我们可以使用jQuery来获取这些按钮,并将它们存储在一个类数组对象中:

let buttons = $('.button'); // 使用jQuery选择器获取所有带有"button"类的DOM元素
console.log(buttons); // 输出: [<button id=btn1>, <button id=btn2></button>]

在这个例子中,buttons就是一个类数组对象,它包含了两个按钮元素。虽然它不是传统的数组类型,但它提供了与数组类似的功能,允许我们通过索引或循环访问其元素。

私信【学习】即可获取前端资料 都整理好啦!!!

类数组和数组的区别

类数组对象(Array-like Objects)和真正的数组(Arrays)在JavaScript中都用于存储和操作数据,但它们有一些关键区别:

  1. 索引: 类数组对象可以通过索引访问元素,就像数组一样。但是,这些元素的类型可能不同,可能是字符串、数字、对象或其他任何类型的值。
  2. 方法: 数组拥有许多内置的方法,如push(), pop(), shift(), unshift(), slice(), sort(), reverse()等,可以方便地对数组进行操作。而类数组对象通常不包含这些方法。
  3. 长度属性: 类数组对象有length属性,可以用来获取其包含的元素数量,就像数组一样。
  4. forEach/for…of循环: 虽然类数组对象可以使用forEach或for…of循环遍历,但它们不能使用传统的for循环来迭代。
  5. 类型检查: 在JavaScript中,你可以使用instanceof Array来检查一个对象是否为数组,但对于类数组对象则不能这样判断。
  6. 扩展运算符: 数组可以使用扩展运算符(…)来复制自身或合并其他数组,而类数组对象不支持这种操作。

代码示例:

// 创建一个类数组对象
let arrLike = [1, "hello", true, {name: "John"}];
console.log(arrLike[0]); // 输出:1
console.log(arrLike.length); // 输出:4

// 尝试将一个普通数组赋值给arrLike(这将失败)
arrLike = [1, 2, 3]; // Error: TypeError: Cannot assign to read only property 'length' of object

// 使用forEach循环遍历类数组对象
arrLike.forEach((item) => {
    console.log(item); // 输出:1, "hello", true, {name: "John"}
});

// 尝试在普通数组中使用forEach (这将失败)
arrLike = [1, 2, 3]; // Error: TypeError: arrLike is not iterable

dom的类数组如何转成数组

在Web前端中,将DOM的类数组对象(如document.querySelectorAll('selector')返回的结果)转换为数组是常见的需求。这通常用于处理通过查询选择器获取的元素集合时,需要对它们进行排序、过滤或其他数组操作的情况。

要将DOM的类数组对象转换为数组,可以使用JavaScript的Array.from()方法或扩展运算符(…)。以下是两种方法的示例:

使用Array.from():

let elements = Array.from(document.querySelectorAll('#my-elements'));
console.log(elements); // 输出:[<Element>, ...]

使用扩展运算符:

let elements = [...document.querySelectorAll('#my-elements')];
console.log(elements); // 输出:[<Element>, ...]

这两种方法都会创建一个新数组,其中包含原始类数组对象中的所有元素。注意,这些元素仍然是NodeList对象,而不是普通的DOM元素。如果需要进一步处理这些元素,可能需要遍历这个新数组并对每个元素执行适当的操作。
在这里插入图片描述

介绍单页面应用和多页面应用

单页面应用(SPA)和多页面应用(MPA)是Web开发中的两种主要架构模式,它们在用户体验、性能和开发复杂性等方面有着显著的不同。

在这里插入图片描述

SPA是一种只有一个HTML页面的Web应用,它通过JavaScript动态加载和显示内容。SPA的主要特点包括:

  1. 无需刷新即可更新页面内容,提供无缝的用户体验。
  2. 通常使用现代前端框架如React或Vue.js来构建,以实现复杂的用户交互和数据绑定。
  3. 由于所有内容都在客户端处理,因此可以充分利用浏览器的能力进行渲染优化。
  4. 服务器只需发送一个HTML文件,减少了服务器负担。

相比之下,MPA由多个独立的HTML页面组成,每个页面可以独立于其他页面存在。MPA的特点包括:

  1. 易于维护和扩展,因为每个功能都可以通过单独的页面来实现。

  2. 对于搜索引擎优化(SEO)友好,因为每个页面都有其自己的URL。

  3. 可能需要服务器端渲染(SSR)或完全在客户端渲染(CSR)技术来提供更好的首次加载速度。

  4. 对于没有JavaScript支持的环境,比如屏幕阅读器或移动设备上的Safari,MPA可能无法正常工作。

在这里插入图片描述

比较起来,SPA在用户体验和性能上通常更胜一筹,但在无JavaScript环境下的表现较差;而MPA则在这些方面表现更好。两者的选择取决于项目需求、团队技能和预期的用户基础。一个简单的代码示例区分这两者可能是这样的:

// SPA示例 (使用React)
class App extends React.Component {
  state = { content: '' };

  fetchData() {
    fetch(`/api/data`).then((response) => {
      this.setState({ content: response.text() });
    });
  }

  render() {
    return <div>{this.state.content}</div>;
  }
}
// MPA示例 (使用PHP)
<?php include 'header.php'; ?>
<!doctype html>
<html lang="en">
<head>
    <!-- meta tags, title, etc. -->
</head>
<body>
    <h1>Welcome to Our Website</h1>
    <?php include('footer.php'); ?> // Loads footer.php at the end of the page.
</body>
</html>```

私信【学习】即可获取前端资料 都整理好啦!!!

redux状态树的管理

Redux是一个用于JavaScript应用程序的状态容器,它提供了一个预测性的、可预测的和一致的状态管理方法。在Redux中,状态树是由一个单一的对象组成,该对象的属性是其他对象,这些对象可以进一步分解为子属性。每个属性都有一个对应的getter函数,用于获取其值。这种结构使得我们可以方便地通过键值路径来访问任何状态。

为了展示如何在项目中管理Redux状态树,我将提供一个示例代码片段,说明如何创建一个简单的计数器应用。在这个例子中,我们将使用Redux进行状态管理:

首先,我们定义一个动作类型(Action Type)和一个动作创建函数:

const ADD_COUNTER = 'ADD_COUNTER';

function addCounter() {
  return { type: ADD_COUNTER, value: (state.count + 1) };
}

然后,我们创建一个reducer函数来处理这个动作并更新状态:

const initialState = { count: 0 };

function counterReducer(state = initialState, action) {
  switch (action.type) {
    case ADD_COUNTER:
      return { ...state, count: action.value };
    default:
      return state;
  }
}

接下来,我们需要一个store来存储我们的reducer和初始状态:

import { createStore } from 'redux';

const store = createStore(counterReducer);

现在,我们可以使用dispatch函数来发出动作,并通过监听store的subscribe回调来观察状态的变化:

store.subscribe(() => {
  console.log(store.getState()); // Logs the current state of the store to the console.
});

最后,我们可以通过调用dispatch函数来添加一个新的计数器值:

store.dispatch(addCounter()); // Logs "1" to the console. The state has changed to { count: 1 }.

介绍localstorage的API

LocalStorage是Web存储API的一部分,它允许在用户的浏览器上存储数据,这些数据会保留直到它们被用户手动清除或浏览器被关闭。这使得开发者能够持久化应用状态,例如保存用户设置、缓存资源以加快页面加载速度等。

以下是使用LocalStorage的常见方法:

  1. setItem(key, value): 将一个键值对存储到LocalStorage中。

  2. getItem(key): 根据键获取存储的值。如果键不存在,则返回null

  3. removeItem(key): 从LocalStorage中移除指定的键及其对应的值。

  4. clear(): 清除所有存储的数据。

  5. key(index): 获取指定索引的键。

  6. length: 返回存储的键值对数量。

  7. itemList(beginIndex): 获取指定开始索引之后的键列表。

  8. key(index): 获取指定索引之前的键。

  9. hasOwnProperty(key): 检查是否有指定的键。

  10. key(index): 删除指定索引的键。

  11. key(index): 添加一个新的键值对到指定的索引处(如果该索引存在)。

    在这里插入图片描述

以下是一个简单的示例,展示如何使用LocalStorage来保存和读取用户偏好设置:

// 保存设置到LocalStorage
localStorage.setItem('theme', 'dark'); // 设置为暗色主题
localStorage.setItem('fontSize', '16px'); // 字体大小设为16px

// 从LocalStorage读取设置
let theme = localStorage.getItem('theme'); // 获取当前主题(默认为'light')
let fontSize = localStorage.getItem('fontSize'); // 获取当前字体大小(默认为'16px')

在这个例子中,我们首先通过setItem方法将用户的偏好设置保存到LocalStorage中。然后,通过getItem方法,我们可以获取并使用这些设置。

前端开发中如何实现一个响应式的数据绑定?

在前端开发中,响应式数据绑定是指将应用状态的变化动态地反映到用户界面上。这通常通过使用JavaScript框架如React实现,React提供了一种声明式的编程方式,使得开发者可以定义组件的状态和渲染逻辑,而不需要关心具体的DOM操作。

一个典型的响应式数据绑定示例是使用React的useState hook来管理状态。useState允许我们为函数组件创建一个状态,并返回当前状态和一个更新状态的函数。当状态改变时,React会自动调用这个更新函数并将新的值赋给状态。这样,我们就可以在组件内部根据状态的值来动态地渲染不同的内容。

下面是一个简单的代码示例:

import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0); // 初始值为0

  return (
    <div>
      <p>计数器的值: {count}</p>
      <button onClick={() => setCount(count + 1)}>增加</button>
    </div>
  );
}

在这个例子中,我们创建了一个名为Counter的函数组件,它使用useState来初始化一个名为count的状态,初始值为0。然后,我们在组件的渲染部分显示当前的count值,并通过点击按钮来增加count的值。每次点击按钮时,都会触发setCount函数,从而更新状态count并重新渲染组件。

私信【学习】即可获取前端资料 都整理好啦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1653340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何将pdf文件换成3d模型?---模大狮模型网

PDF文件是一种广泛用于文档传输和共享的格式&#xff0c;但在某些情况下&#xff0c;我们可能希望将其中的内容转换为更具交互性和视觉效果的3D模型。本文将介绍如何将PDF文件转换为3D模型&#xff0c;为您展示实现这一想象的步骤。 选择合适的PDF文件&#xff1a; 首先&#…

如何才能做好源代码防泄密

目前很多企业都拥有自己的研发机构&#xff0c;其研发成果往往体现在源代码和技术文档方面&#xff0c;这些核心机密&#xff0c;如何防止研发参与人员泄密&#xff0c;如何防止核心成员把研究成果带走另立山头&#xff0c;或者提供给竞争对手&#xff0c;是一个很现实的一个问…

软件可靠度计算

软件的整体可靠度依据&#xff1a;若是单个就是当前部件的可靠度。若是多个部件&#xff0c;就需要多个部件的可靠度相乘。若是多个部件且有相同备份&#xff0c;那么计算公式更加不一样。 计算公式&#xff1a; 部件数&#xff1a;N 部件可靠度均为&#xff1a;R 单个部件的可…

Mac 解决外接移动硬盘(NTFS格式)无法写入的问题

文章目录 1. 问题描述2. 解决步骤 1. 问题描述 MacOS 可以识别 NTFS 格式的磁盘&#xff0c;但是默认情况下是只读模式&#xff0c;即无法向 NTFS 格式的磁盘写入数据。这是因为 NTFS 是 Windows 系统默认的文件系统格式&#xff0c;而 MacOS 对 NTFS 的写入支持是有限的。 如…

目标检测CNN 目标检测发展历程 应用场景 智慧交通 自动驾驶 工业生产 智慧医疗

目标检测 目标检测是计算机视觉领域中的一个重要任务,其主要目的是让计算机能够自动识别图像或视频帧中所有目标的类别,并在目标周围绘制边界框以标示出每个目标的位置。 目标检测的过程通常包括两个主要步骤:目标定位和目标分类。目标定位是确定图像中是否存在感兴趣的目…

树莓派4b红外检测

1.红外检测连接图 2.红外检测工作原理 红外传感器的工作原理类似于物体检测传感器。该传感器包括一个红外LED和一个红外光电二极管&#xff0c;因此通过将这两者结合起来&#xff0c;可以形成一个光耦合器。 红外LED是一种发射红外辐射的发射器。该LED看起来与标准LED相似&a…

Python爬虫基础知识学习(以爬取某二手房数据、某博数据与某红薯(书)评论数据为例)

一、爬虫基础流程 爬虫的过程模块化&#xff0c;基本上可以归纳为以下几个步骤&#xff1a; 1、分析网页URL&#xff1a;打开你想要爬取数据的网站&#xff0c;然后寻找真实的页面数据URL地址&#xff1b; 2、请求网页数据&#xff1a;模拟请求网页数据&#xff0c;这里我们介…

C++:菱形继承与菱形虚拟继承

一、菱形继承 单继承&#xff1a;一个子类只有一个直接父类时称这个继承关系为单继承 多继承&#xff1a;一个子类有两个或以上直接父类时称这个继承关系为多继承 菱形继承&#xff1a;菱形继承是多继承的一种特殊情况&#xff0c;派生类继承自两个间接基类&#xff0c;而这…

Java中的Mysql数据库备份与定时任务快速实现(详细代码示例)

引言 在现代软件系统中&#xff0c;数据库备份是确保数据安全的关键措施之一。通过定期备份&#xff0c;可以在数据丢失或损坏时迅速恢复&#xff0c;从而减少潜在的业务风险。Java作为一种广泛使用的编程语言&#xff0c;提供了多种实现数据库备份的方法。本文将介绍如何使用…

「网络流 24 题」太空飞行计划 【最大权值闭合图】

「网络流 24 题」太空飞行计划 题意 有 n n n 个实验 和 m m m 个器械&#xff0c;每个实验都需要若干个指定的器械才能进行 实验 i i i 的盈利为 p i p_i pi​&#xff0c; 器械 j j j 的花销为 c j c_j cj​ 找出纯利润最大的实验计划 思路 这是非常典型的最大权值…

独家专访辉羲智能章健勇:数据闭环定义芯片,帮车厂造中国版FSD

‍采访、编辑 |德新 撰文 |苗岭 辉羲智能&#xff0c;智能驾驶芯片行业最新的进入者。 这家公司成立于2022年&#xff0c;今年辉羲即将发布它的首款高阶智驾芯片。而另外两家智驾计算平台的头部公司地平线和黑芝麻已经在前不久分别向港交所提交了IPO申请。 国内的自动驾驶行…

【北京迅为】《iTOP-3588开发板快速烧写手册》-第8章 TF启动

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

论文笔记模版

1. 摘要 1.1 背景 1.2 挑战 1.3 提出新方法 1.4 贡献 2. 引言 2.1 背景&#xff08;引出问题&#xff09; ①介绍大背景&#xff1a; ② 应用场景&#xff1a; ③ 介绍主题&#xff1a; 2.2 引出挑战 一般用图表来展现出我们的挑战&#xff08;直观&#xff0c;解决什…

速卖通揭秘:aliexpress.item_get API商品详情返回值全解析

速卖通&#xff08;AliExpress&#xff09;是阿里巴巴旗下的一个面向全球市场的B2C电商平台&#xff0c;为卖家提供了一个向全球消费者销售商品的平台。对于开发者来说&#xff0c;速卖通提供了API接口来方便地进行数据交互和集成。其中&#xff0c;item_get API是用于获取商品…

java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条

今天遇到一个问题 系统线上问题&#xff0c;经常出现这样的问题&#xff0c;刚重启系统时不报错了&#xff0c;可是运行一段时间又会出现。sql已经写了limit 1&#xff0c;mybatis的debug日志也返回total为1&#xff0c;可是却报错返回了1805条数据 乍一看&#xff0c;感觉太不…

【FTP】配置FTP服务器并访问测试(已更新)

1.之前访问搭建的FTP服务器&#xff0c;有些现场环境未搭建&#xff0c;在数据处理过程中遇到一些阻力&#xff0c;多有不便之处。 2.熟悉、梳理、总结下FTP服务器相关知识体系 3.欢迎批评指正&#xff0c;跪谢一键三连&#xff01; 基于Linux配置FTP服务器并访问测试文章目录索…

基于V4L2框架的摄像头从上层到底层开发

文章目录 一、V4L2应用开发1、识别摄像头2、查看摄像头设备的能力3、查看支持视频格式4、设置视频格式5、申请帧缓冲6、启动采集7、出队取一帧图像8、入队归还帧缓冲9、停止视频采集10、退出释放资源 二、V4L2框架源码分析1、struct video_device2、struct v4l2_device *v4l2_d…

unity ui 同屏

一共有三个摄像机&#xff0c;上屏&#xff0c;下屏 和 类似照相机的ccamera 类似照相机的ccamera的设置&#xff1a; 下屏摄像机设置&#xff1a; 下屏交互的Canvas设置&#xff1a; 新建一个canvas&#xff0c;下面放上rawimage&#xff1a; 如果下屏不想显示的内容&#xf…

【前端】实现快速改变内容大小选择框

简言 简单实现选择框改变内容大小和位置。 内容 这里实现选择框改变内容大小是让内容宽高等于选择框的百分之百&#xff0c;当选择框大小改变时&#xff0c;内容也会响应的改变。 位置则是根据定位实现的。 选择框 选择框就是一个div&#xff0c;然后定位上下左右四条边和…

Stable Diffusion【古风模型】:喜欢古风的看过来,超写实汉服兼顾现代风格大模型汉服国风桃夭

这次来介绍【Stable Diffusion【古风模型】&#xff1a;喜欢古风的看过来&#xff0c;超写实汉服兼顾现代风格大模型汉服国风桃夭】&#xff0c;对于汉服国风桃妖大模型&#xff0c;不仅在古装国风写实上表现出色&#xff0c;同时该模型也兼容现代风格&#xff0c;并且出图效果…