2024 前端面试题(GPT回答 + 示例代码 + 解释)No.114 - No.121

本文题目来源于全网收集,答案来源于 ChatGPT 和 博主(的小部分……)

格式:题目 h3 + 回答 text + 参考大佬博客补充 text + 示例代码 code+ 解释 quote + 补充 quote

上一篇链接:2024 前端面试题(GPT回答 + 示例代码 + 解释)No.101 - No.113


目录 No.114 - No.121

    • 本文题目来源于全网收集,答案来源于 ChatGPT 和 博主(的小部分……)
      • 格式:题目 h3 + 回答 text + 参考大佬博客补充 *text* + 示例代码 ```code```+ 解释 quote + 补充 quote
      • 上一篇链接:[2024 前端面试题(GPT回答 + 示例代码 + 解释)No.101 - No.113](https://blog.csdn.net/m0_67023788/article/details/136117703)
      • 114. 对 MVVM 开发模式的理解?
      • 115. 直接给一个数组项赋值 或 修改数组的长度,Vue 能检测到变化吗?
      • 116. 讲讲 SSR?
      • 117. Vue Router 路由模式
      • 118. patch 和 diff 算法
      • 119. Vue 模板编译原理
      • 120. Webpack 与 Vite
      • 121. Node.js


114. 对 MVVM 开发模式的理解?

MVVM(Model-View-ViewModel)是一种软件架构模式,用于设计和开发用户界面(UI)驱动的应用程序。它将应用程序分为三个主要部分:

  1. Model(模型):模型表示应用程序的数据层,负责管理数据、业务逻辑和状态。模型通常包含数据结构、数据库操作、网络请求等功能。

  2. View(视图):视图是用户界面的可视部分,负责展示数据给用户,并接收用户输入。视图通常由各种UI元素组成,如按钮、文本框、列表等。

  3. ViewModel(视图模型):视图模型是连接视图和模型的中间层,在MVVM中起着核心作用。它负责处理视图的显示逻辑、用户输入以及与模型之间的数据交互。视图模型通过数据绑定机制实现视图和模型之间的通信,使得视图能够动态地反映模型中数据的变化。

在MVVM模式中,视图和视图模型是通过双向数据绑定关联的,这意味着当视图模型中的数据发生变化时,视图会自动更新以反映这些变化;同时,用户在视图上的操作也会直接影响视图模型中的数据。这种解耦和数据驱动的设计使得代码更易于维护、测试和扩展。


115. 直接给一个数组项赋值 或 修改数组的长度,Vue 能检测到变化吗?

在Vue中,如果直接给一个数组项赋值,Vue是无法检测到这种变化的。这是因为Vue无法通过监听数组项的赋值操作来触发响应式更新。

例如,如果有一个数组 myArray,然后直接通过 myArray[0] = newValue 来修改数组的第一个元素,Vue并不会触发重新渲染视图。

为了让Vue能够检测到数组项的变化,您可以使用Vue提供的特定方法,例如 Vue.setthis.$set 来更新数组项。这样Vue就能够捕获到数组项的变化并触发相应的响应式更新。

示例代码如下:

// 使用 Vue.set 方法更新数组项
Vue.set(myArray, 0, newValue);// 或者在组件中使用 this.$set 方法
this.$set(this.myArray, 0, newValue);

在 Vue 中,如果直接修改数组的长度,Vue 也是无法检测到这种变化的。这是因为修改数组的长度并不会触发 Vue 的响应式更新机制。

如果您需要修改数组的长度并希望 Vue 能够正确地检测到这种变化并更新视图,您可以使用以下方法来实现:

  1. 使用 splice 方法:您可以使用 JavaScript 中数组的 splice 方法来修改数组的长度,并且 Vue 能够检测到这种变化。示例代码如下:

    // 修改数组长度为 5
    myArray.splice(5);
    
  2. 使用 Vue.setthis.$set 方法:您也可以通过设置数组的某一项来间接地修改数组的长度,从而触发 Vue 的响应式更新。示例代码如下:

    // 通过设置数组第五项来修改数组长度
    Vue.set(myArray, 4, newValue);
    

116. 讲讲 SSR?

SSR(Server-Side Rendering,服务器端渲染)是一种将应用程序的界面在服务器端生成成 HTML 文件,然后发送给客户端进行展示的技术。相比于传统的 SPA(Single Page Application,单页面程序),SSR 在页面加载时会先返回一个已经包含了部分数据的 HTML 文件,可以加快页面的首次加载速度并提高 SEO(Search Engine Optimization,搜索引擎优化)。

在 Vue.js 中,您可以使用 Vue SSR 来实现服务器端渲染。Vue SSR 的工作原理是在服务器端创建一个 Vue 实例来渲染应用程序,然后将生成的 HTML 字符串发送给客户端。客户端接收到 HTML 后,再将其转换成可交互的页面。

SSR 的主要优点包括:

  1. 更好的 SEO:搜索引擎可以更容易地抓取和索引服务器端渲染的页面,提高网站的搜索排名。

  2. 更快的首次加载速度:由于服务器端已经生成了页面的初始 HTML,用户可以更快地看到页面内容,提升用户体验。

  3. 更好的性能表现:对于一些低性能设备或网络较差的情况,SSR 可以提供更好的性能表现。

然而,SSR 也存在一些挑战和限制,例如开发复杂度较高、服务端压力增大、不适合所有类型的应用程序等。

总的来说,SSR 是一种在特定情况下非常有用的技术,能够带来一些明显的优势。如果应用程序需要考虑 SEO 或者首屏加载速度等因素,那么考虑使用 SSR 是一个不错的选择。


117. Vue Router 路由模式

Vue Router 路由模式有两种:

  1. 哈希模式(Hash Mode):在 URL 中使用“#”作为路由的标记,例如 http://www.example.com/#/router。这种模式不会向服务器发送请求,而是在客户端进行路由跳转,因此在开发单页面应用时比较常用。

  2. 历史模式(History Mode):在 URL 中不使用“#”,而是真实的 URL 路径,例如 http://www.example.com/router。这种模式需要在服务器上配置相关规则,以避免刷新页面时出现 404 错误。历史模式可以使 URL 更加美观,但需要更多的配置工作。

在 Vue Router 中,默认采用哈希模式,但也可以通过在创建 Router 实例时传递“mode”参数来设置使用历史模式。例如:

const router = new VueRouter({mode: 'history',routes: [...]
})

需要注意的是,在使用历史模式时,如果用户直接通过浏览器地址栏访问一个深层级的页面,或者刷新当前页面,服务器将无法找到对应路径的文件,这时需要在后台服务器中设置路由重定向,将所有路径都指向 index.html 或指定的某个页面。


118. patch 和 diff 算法

Vue 中的 patchdiff 算法是实现虚拟 DOM(Virtual DOM)的关键。在 Vue 中,每次数据变化都会触发重新渲染,然后通过虚拟 DOM 来比较前后两个版本的页面差异,并且只更新需要更新的部分,以提高渲染性能。

  1. patch 算法patch 算法是用来将新的虚拟 DOM 树与旧的虚拟 DOM 树进行比较,并将其转换成真实的 DOM 树的算法。在 patch 算法中,将新旧虚拟 DOM 树进行深度优先遍历,比较节点的类型、属性和子节点等信息,然后对需要更新的节点进行更新。如果遇到节点类型不同的情况,则直接替换整个节点。

  2. diff 算法diff 算法是用来比较两个虚拟 DOM 树的算法。在 diff 算法中,将新旧虚拟 DOM 树进行深度优先遍历,比较节点的类型、属性和子节点等信息,找出需要更新的节点。Vue 中使用了一些启发式算法来优化 diff 算法的性能,例如只比较同级节点、给节点设置 key 值等。

因此,diff 算法和 patch 算法可以说是配合使用的,diff 算法找出需要更新的部分,而 patch 算法根据 diff 的结果来实际更新 DOM。它们都是 Vue 中实现虚拟 DOM 的重要组成部分,共同保证了页面更新的高效性和性能优化。


119. Vue 模板编译原理

当 Vue 应用启动时,Vue 的编译原理涉及以下步骤:

  1. 模板解析:Vue 的编译器会将模板字符串解析成抽象语法树(AST)。解析器会遍历模板字符串,识别其中的各种元素、指令和表达式,并构建对应的 AST。

  2. 静态分析:在解析完模板后,编译器会对生成的 AST 进行静态分析和优化。这个阶段主要包括以下几个优化过程:

    • 静态节点提升:将那些在编译阶段就能确定没有变化的节点提升为常量,避免了每次渲染都重新创建这些节点的开销。
    • 静态属性提升:类似于静态节点提升,对于那些在编译阶段就能确定不会变化的属性,将它们提升为常量,减少运行时的计算开销。
    • 表达式依赖收集:识别模板中的表达式,并建立与数据的依赖关系。通过依赖收集,Vue 可以在数据变化时快速找到需要更新的部分。
  3. 生成代码:经过静态分析和优化处理后,编译器会将 AST 转换为可执行的渲染函数。渲染函数是一个 JavaScript 函数,接收数据作为参数,并根据模板中的指令和表达式生成最终的虚拟 DOM。

  4. 创建实例:在运行时,Vue 会根据编译生成的渲染函数创建组件实例。组件实例将会包含一个响应式数据对象,以及用于管理组件生命周期、事件处理等的方法。

  5. 渲染:当组件的数据发生变化时,Vue 会调用渲染函数,生成新的虚拟 DOM 对象。然后,Vue 会通过对比新旧虚拟 DOM,找出差异,并只更新需要变化的部分。最终,将变化的部分渲染到页面上,完成视图的更新。

总体而言,Vue 的编译原理通过将模板解析成 AST,经过静态分析和优化,生成可执行的渲染函数。这种方式可以在运行时快速响应数据的变化,并实现高效的视图更新,提供了灵活且高效的前端开发体验。


120. Webpack 与 Vite

Vite 和 Webpack 是两种前端构建工具,它们在语法上有一些区别,主要体现在配置方式和使用方式上:

  1. Vite

    • Vite 是一个基于 ES Module 的构建工具,它利用浏览器原生的 ES Module 支持,实现了快速的冷启动和热更新。Vite 不需要像 Webpack 那样将所有模块打包成一个文件,而是依赖浏览器原生的模块加载机制,可以更快地进行开发调试。
    • Vite 的配置相对简单,通常只需要一个 vite.config.js 文件,用于配置插件、构建选项等。Vite 采用了插件化的设计,可以方便地扩展功能。
    • Vite 默认支持 Vue、React、Svelte 等框架,提供了相应的插件和模板,可以快速搭建项目。
  2. Webpack

    • Webpack 是一个功能强大的模块打包工具,可以处理各种类型的文件,并且具有强大的插件系统和 loader 生态系统。Webpack 可以将各种资源,如 JavaScript、CSS、图片等,打包成静态文件。
    • Webpack 的配置相对复杂,需要编写一个详细的 webpack.config.js 文件来定义入口、输出、loader、插件等各种配置。
    • Webpack 提供了更多的自定义选项和功能,可以根据项目需求进行深度定制,适用于各种复杂的前端项目需求。

总的来说,Vite 更注重开发体验和性能优化,适合快速搭建现代化的前端项目;而 Webpack 功能更加强大、灵活,适合处理各种复杂的前端构建需求。根据项目需求和个人偏好,选择适合的构建工具来开发项目会更加高效和方便。


121. Node.js

浏览器 是 JS 的前端运行环境
Node.js 是 JS 的后端运行环境

在这里插入图片描述

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,可以让 JavaScript 在服务器端运行。下面是关于 Node.js 的一些重要特点和用途:

  1. 事件驱动:Node.js 使用事件驱动、非阻塞 I/O 模型,使得处理大量并发连接变得高效。它基于事件循环机制,在接收请求后会异步地处理请求,不会阻塞后续的请求,提高了性能和吞吐量。

  2. 单线程:Node.js 采用单线程模型,但借助事件驱动和异步 I/O,可以处理大量并发请求。在处理密集型 I/O 操作时表现优秀,但对于 CPU 密集型任务需要注意避免阻塞事件循环。

  3. 模块化:Node.js 支持 CommonJS 规范的模块化开发,通过 requiremodule.exports 来实现模块之间的依赖管理。同时,也支持 ES Module 的方式来引入模块。

  4. NPM:Node.js 的包管理工具 NPM(Node Package Manager)是世界上最大的开源库生态系统,拥有大量的第三方模块,方便开发者进行模块的安装和管理。

  5. 应用场景:Node.js 在 Web 开发、后端服务开发、实时应用、API 开发等领域广泛应用。例如,可以用 Node.js 构建 RESTful API、实时聊天应用、网站后端服务等。

  6. 跨平台:Node.js 是跨平台的,在 Windows、Linux、Mac 等操作系统上都可以运行,方便开发者在不同环境下进行开发和部署。

总的来说,Node.js 是一个强大的 JavaScript 运行环境,具有高效的事件驱动和异步编程能力,适合处理高并发、I/O 密集型的任务。它为开发者提供了丰富的工具和生态系统,是现代 Web 开发中不可或缺的重要技术之一。


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

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

相关文章

汽车网络安全--关于供应商网络安全能力维度的思考

目录 1.关于CSMS的理解 2.OEM如何评审供应商 2.1 质量评审 2.2 网络安全能力评审 3.小结 1.关于CSMS的理解 最近在和朋友们交流汽车网络安全趋势时,讨论最多的是供应商如何向OEM证明其网络安全能力。 这是很重要的一环,因为随着汽车网络安全相关强…

三防平板电脑丨亿道工业三防平板丨三防平板定制丨机场维修应用

随着全球航空交通的增长和机场运营的扩展,机场维护的重要性日益凸显。为确保机场设施的安全和顺畅运行,采取适当的措施来加强机场维护至关重要。其中,三防平板是一种有效的工具,它可以提供持久耐用的表面保护,使机场维…

微信小程序 搜索框实现模糊搜索(带模拟数据,js,wxml,wxss齐全)

最近在做一个小程序的页面,搜索框困扰了我很久,今天终于把搜索框给做了出来,记录一下过程 我主要使用的就是wx的if,当我输入框用户点击的时候,我前面的显示界面添加上false属性,然后我搜索页面显示出true的…

【Jvm】类加载机制(Class Loading Mechanism)原理及应用场景

文章目录 Jvm基本组成一.什么是JVM类的加载二.类的生命周期阶段1:加载阶段2:验证阶段3:准备阶段4:解析阶段5:初始化 三.类初始化时机四.类加载器1.引导类加载器(Bootstrap Class Loader)2.拓展类…

leetcode13题罗马数字转成整数

代码 public static int romanToInt(String s) {// 创建一个HashMap&#xff0c;将罗马数字字符映射为整数值HashMap<Character, Integer> map new HashMap<>();map.put(I, 1);map.put(V, 5);map.put(X, 10);map.put(L, 50);map.put(C, 100);map.put(D, 500);map.…

Eclipse 创建 Hello World 工程

Eclipse 创建 Hello World 工程 1. Hello WorldReferences Download and install the Eclipse IDE. 1. Hello World Eclipse -> double click -> Launch 单击蓝色方框 (右上角) 最大化 IDE File -> New -> C Project -> Finish Project name&#xff1a;工程名…

Matlab|基于支持向量机的电力短期负荷预测【最小二乘、标准粒子群、改进粒子群】

目录 主要内容 部分代码 结果一览 下载链接 主要内容 该程序主要是对电力短期负荷进行预测&#xff0c;采用三种方法&#xff0c;分别是最小二乘支持向量机&#xff08;LSSVM&#xff09;、标准粒子群算法支持向量机和改进粒子群算法支持向量机三种方法对负荷进行…

LeetCode每日一题【209. 长度最小的子数组】

题目&#xff1a; 思路1&#xff1a;暴力循环 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int len INT_MAX;for(int i0;i<nums.size();i){int sum 0;for(int ji;j<nums.size();j){sumnums[j];if(sum>target){len mi…

推荐彩虹知识付费商城免授权7.0源码

彩虹知识付费商城免授权7.0源码&#xff0c;最低配置环境 PHP7.2 1、上传源码到网站根目录&#xff0c;导入数据库文件&#xff1a;xydai.sql 2、修改数据库配置文件&#xff1a;/config.php 3、后台&#xff1a;/admin 账号&#xff1a;admin 密码&#xff1a;123456 4、前…

八、计算机视觉-边界填充

文章目录 前言一、原理二、具体的实现 前言 在Python中使用OpenCV进行边界填充&#xff08;也称为zero padding&#xff09;是一种常见的图像处理操作&#xff0c;通常用于在图像周围添加额外的像素以便进行卷积或其他操作。下面是使用OpenCV进行边界填充的基本原理和方法 一…

BufferedImage 这个类在jdk17中使用哪个import导入

在Java开发中&#xff0c;BufferedImage 类是用于处理图像数据的一个类。在JDK 17中&#xff0c;BufferedImage 类属于 java.awt.image 包。因此&#xff0c;要在你的Java程序中使用 BufferedImage 类&#xff0c;你需要通过以下方式导入该类&#xff1a; import java.awt.ima…

OpenCV DNN 活体检测项目环境配置等各阶段tips

date: 2020-09-22 14:53 资料来源《OpenCV深度学习应用与性能优化实践》第八章。 在复现这个项目的时候发现一些可以调整的小tips。 环境配置阶段 使用conda 创建python 工作环境时&#xff0c;注释掉requirems.txt 里的opencv-python-inference-engine4.1.2.1&#xff0c;安…

Spring6学习技术|简要介绍+安装环境+入门案例+log4j2日志

学习材料 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09; 碎碎念一下吧&#xff0c;javaWeb跟完了全程。还是感觉啥也不知道&#xff0c;啥也没学会。2025年春天能找到实习吗&#xff1f;真的好担心。 环境安装 纠…

基于Java SSM框架实现电影售票系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现电影售票系统演示 SSM框架 当今流行的“SSM组合框架”是Spring SpringMVC MyBatis的缩写&#xff0c;受到很多的追捧&#xff0c;“组合SSM框架”是强强联手、各司其职、协调互补的团队精神。web项目的框架&#xff0c;通常更简单的数据源。Spring属于…

铌酸锂芯片与精密划片机:科技突破引领半导体制造新潮流

在当今快速发展的半导体行业中&#xff0c;一种结合了铌酸锂芯片与精密划片机的创新技术正在崭露头角。这种技术不仅引领着半导体制造领域的进步&#xff0c;更为其他产业带来了前所未有的变革。 铌酸锂芯片是一种新型的微电子芯片&#xff0c;它使用铌酸锂作为基底材料&#x…

Github 2024-02-18 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-18统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目5PowerShell项目1Rust项目1PHP项目1Jupyter Notebook项目1TypeScript项目1 Black&#xff1a;不妥…

【开源】SpringBoot框架开发高校宿舍调配管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能需求2.1 学生端2.2 宿管2.3 老师端 三、系统展示四、核心代码4.1 查询单条个人习惯4.2 查询我的室友4.3 查询宿舍4.4 查询指定性别全部宿舍4.5 初次分配宿舍 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的…

快排——OJ题

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、颜色划分1、题目讲解2、算法原理3、代码实现 二、排序数组1、题目讲解2、算法原理3、代码…

JavaAgent介绍 | 基本介绍及无侵入打印方法耗时

闲聊 最近在配置skywalking的过程中发现了-javaagent:这个配置&#xff0c;这里做一个简单的学习 什么是JavaAgent 网上似乎没有直接的文档介绍这个&#xff0c;只找了instrument包的相关文档&#xff0c;其内容页。其中的内容也都是介绍javaagent相关。 instrument包下核心…

pytorch中dataloader的prefetch_factor出错

今天跑huggingface的示例的时候&#xff0c;遇到了最让我头疼的问题&#xff0c;国内网上还没有对应的解释&#xff0c;我可能是第一人&#xff08;汗&#xff09;先看看报错&#xff1a; Traceback (most recent call last):File "F:\transformer\transformers\examples…