前端基础(之三)

news/2024/11/16 7:52:12/

Q1:介绍一下盒模型

A1:盒模型是用于描述Html在页面总所占空间的方式,盒模型将每个html元素视为一个矩形框,该框主要由四个主要部分组成:内容区域、内边距、边框和外边距。

内容区域是Html元素实际包含内容的部分,如文本、图像或其他嵌套的元素,这是盒模型的核心,决定了元素显示的实际内容。

内边距是内容区域与元素边框之间的空白区域,它可以在css中使用属性padding-top等等。内边距用于控制元素内部内容与边框之间的距离。

边框是围绕内容和内边距的线或边界。边框可以在CSS中使用属性border-width、border-styleh和border-color来设置,它用于装饰和分隔元素的内容。

外边距使元素边框与周围元素之间的空白区域。它可以在CSS中使用属性如margin-top、margin-right、margin-bottom和margin-left来设置。外边距用于控制元素与其他元素之间的距离。

Q2:什么是事件委托?它有什么优势?

A2:事件委托是一种利用事件冒泡机制的编程技巧,它允许将事件处理程序绑定到父元素上,而不是每个子元素上。

优势:减少内存消耗和DOM操作,从而提高性能。通过事件委托,可以在不重新事件处理程序的情况下,动态地添加或删除子元素,同时,新添加的元素也会自动继承之前的事件处理程序。这种设计模式也被称为事件代理,它允许解耦事件处理逻辑,提高代码的可维护性和扩展性。

Q3:什么是闭包?闭包有什么作用?

A3:闭包是一个可以访问其外部词法环境的函数,即使在其外部函数已经执行完毕的情况下,也能保持对外部环境状态的引用。

作用:数据封装;保持状态;控制资源访问;解决变量污染问题;延长变量的声明周期。

Q4:如何实现数组去重? 请写出代码示例

// reduce
var arr = [1,2,3,4,5,6,4,3,8,1]
function newArrFn (arr) {let new Arr = []return arr.reduce((prev, next index, arr) =>{return newArr.includes(next) ? newArr : newArr.push(next)}, 0)
}
console.log(newArrFn(arr))
// Set
var arr = [1,2,3,4,5,6,4,3,8,1]
function  neewArrFn (arr) {return ([...new Set(arr)])
}
console.log(newArrFn(arr))

Q5:介绍一下浏览器的缓存机制

A5:浏览器的缓存机制就是把一个请求过的web资源(例如:htnl页面、图片、js、数据等)拷贝一份副本储存在浏览器中。

缓存会根据进来的请求保存输出内容的副本,当下一个请求到来的时候,如果是相同的URL,缓存会根据缓存机制决定是否直接使用副本响应访问请求,还是向源服务器再次发送请求。

Q6:什么是跨域请求?如何解决跨域问题?

A6:当前发起请求的域与该请求指向的资源所在的域不一样,凡是发送请求的url的协议、域名、端口号三者之间任意一者与当前页面地址不同的请求。这里的域指的是这样一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域。

解决:JSONP;代理; CORS

Q7:如何进行前端性能优化?列举一些常见的性能优化手段

A7:

1. HTML优化:

     压缩HTML;删除不必要的注释;删除不必要的属性;使用语义化标签;减少iframe数量;

     削减DOM数量和层级数量;减少HTP请求次数;减少重绘重排

2.Javascript优化:

     javascript脚本放到页面底部;将javascript和css从外部引入;删除重复的脚本;

     减少DOM访问;节流与防抖;合理的ajax请求;长列表虚拟滚动优化;

     代码结构的优化;

3. CSS优化:

     尽量少用@import;避免!important,可以选择其他选择器;

     不要在ID选择器前面进行嵌套其他选择器;CSS文件压缩;CSS层级嵌套最好不要超过3层;

      删除无用的css;慎用*通配符;删除不必要的单位和零;异步加载非首屏css;

     将样式表放到页面顶部;不使用IE的Filter;检测工具推荐;

4. 图片优化:

    根据实际需要选择色深压缩;小图片引入sprites;图片懒加载;缩小favicon.ico并缓存;

     img图片的alt属性要写,合理使用target="_blank";采用svg图片或者字体图标;Base64;

5.webpack构建优化:

    线程加载器;缓存加载器;Hot  update; exclude & include;缩小CSS代码;

    缩小Javascript代码;tree-shaking;source-map; BundleAnalyzer; 模块懒加载;

  压缩包; base64; 正确配置哈希;

6. 资源加载优化:

    使用Web Workers  ;  DNS预解析;预加载preload

7.浏览器缓存策略:

    缓存位置;缓存策略;缓存场景; 用户操作行为与缓存

8.服务器优化:

    静态资源使用CDN;添加Expires或者Cache-Control响应头;对组件使用Gzip压缩;

    配置ETag;提供来自相同协议的文件;开启http2(多路复用,并行加载);服务端渲染;

     分域存放资源;减少页面重定向

9. 性能测试网站推荐:

     WebPage Test;Web Page Analyzer; GTMatrix;Piingdom;36全球网站性能测试 

Q8:什么是Webpack?它的作用是什么?配置文件中常见的配置有哪些?

A8:Webpack是一个用于Javascript应用程序的静态模块打包工具。

作用:模块打包、资源打包、代码分割、使用加载器和处理非JavaScript文件、使用插件执行各种任务如代码压缩、生成HTML文件、拷贝静态文件等。能够识别、加载、转换和打包各种类型的模块,包括CommonJS、ES6模块、AMD等。它还可以处理各种其他类型的文件,如CSS、Sass、Less、图片、字体等,并将它们打包到输出目录。

配置文件:1.babelrc文件  2..editorconfig文件   3. .eslintrc.js文件   4..eslintignore文件   5..gitignore文件   6.package.json    7.build/build.js文件     8.build/check-versions.js文件

9.build/dev-client.js文件     10.build/dev-sesrver.js     11.build/util.js   

12.build/vue-loader.conf.js文件          13.build/webpack.base.conf.js文件

 14.build/webpack.dev.conf.js文件      15.build/webpack.prod.conf.js文件

 16.build/webpack.test.conf.js文件      17.config/dev.env.js文件   18.config/index.js文件

  19.config/prod.env.js文件      20.config/test.env.js文件

Q9:介绍一下前端项目中的CI/CD(持续集成/持续部署)流程。

A9:

CI流程: 1.选择一个适合前端开发的版本控制系统,例如Git

                2.创建一个代码仓库,并将代码推送到仓库中

                3.设置一个自动化构建和测试工具,例如Jenkins

                4.配置构建和测试工具,以便在每次提交代码时自动触发构建和测试过程

                5.开发人员在每次提交代码时,都需要触发构建和测试过程

                6.当构建和测试通过后,代码将被合并到主分支中

                 7.持续监控代码库,以便及时发现和修复错误

CD流程:1.选择一个适合前端开发的版本控制系统,例如git

                 2.创建一个代码仓库,并将代码推送到仓库中

                 3.设置一个自动化部署工具,例如Spinnaker

                 4.配置部署工具,以便在代码通过自动化构建和测试后自动将代码部署到生产环境

                 5.持续监控生产环境,以便及时发现和修复错误

Q10:什么是模块化开发?常见的模块化规范有哪些?

A10:模块化开发是指一个模块就是实现特定功能的文件,有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块。模块开发需要遵循一定的规范,否则就都乱套了。根据AMD规范,我们可以使用define定义模块,使用require调用模块。

模块化规范:1.浏览器端模块化规范(AMD,CMD)

                      2.服务器端模块化规范(

                             模块分为单文件模块与包;

                             使用require引入其他模块或者包;

                             使用exports或者module.exports导出模块成员;

                             一个文件就是一个模块,都拥有独立的作用域)

                      3.ES6模块化(

                              每个js文件都是一个独立的模块;

                              导入模块成员使用import关键字;

                               暴露模块成员使用export关键字)

Q11:请实现一个简单的快速排序算法

A11:

//前后指针法
int PartSort3(int* a, int left, int right)
{int midi = GetMidIndex(a, left, right);Swap(&a[midi], &a[left]);//end找小,如果	a[end]<a[keyi],++begin(这时begin位置的值一定比keyi位置值大),再交换begin和end的位置	int keyi = left;int begin = left;int end = left+1;while (end <=right){if (a[end] < a[keyi] ){++begin;Swap(&a[begin], &a[end]);}++end;}Swap(&a[begin], &a[keyi]);return begin;
}//快排
void QuickSort(int* a, int left,int right)
{if (left >= right){return ;}int keyi = PartSort3(a, left, right);//[left,keyi-1][keyi][keyi+1,right]QuickSort(a, left, keyi - 1);QuickSort(a, keyi + 1, right);
}

Q12:什么是栈和队列?它们有什么区别?

A12:栈和队列是两种基本的数据结构。

栈是一种后进先出的数据结构

队列是一种先进先出的数据结构

区别:1.操作方式不同,栈遵循后进先出的原则,这意味着最后一个进入栈的数据第一个被删除;队列遵循先进先出的原则,这意味着第一个进入队列的数据第一个被删除。

2.应用场景不同。栈在处理递归、表达式求值、内存管理等场合非常实用;队列则在处理任务调度、缓存管理、消息处理等需要按照顺序处理的场合中使用更多。

Q13:介绍一下二叉树及常见的操作。

二叉树:是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。

常见操作:顺序存储;链式存储


http://www.ppmy.cn/news/1423111.html

相关文章

java | 多线程 | ThreadLocal

场景&#xff1a; web app中&#xff0c;每个request都会有一个Thread去处理&#xff0c;但是多个request可能对应一个资源&#xff1a;userInfo&#xff0c;常用ThreadLocal来存储userInfo。 网上搜&#xff0c;ThreadLocal的定义&#xff0c;大概就是&#xff1a;让每个线程…

FFmpeg: 自实现ijkplayer播放器--04消息队列设计

文章目录 播放器状态转换图播放器状态对应的消息&#xff1a; 消息对象消息队列消息队列api插入消息获取消息初始化消息插入消息加锁初始化消息设置消息参数消息队列初始化清空消息销毁消息启动消息队列终止消息队列删除消息 消息队列&#xff0c;用于发送&#xff0c;设置播放…

加载 docker 镜像文件 centos7 系统 lnmp 环境 php8.2 php5.2 php7.4

# 加载镜像从tar文件 链接&#xff1a;https://pan.baidu.com/s/1s2yf7iroI-tBTK5b9zxxnA 提取码&#xff1a;6666 docker load < my_migration_image.tar # 运行新容器&#xff0c;可以使用相同的参数和命令 8233 电脑访问时对应的端口 80 docker 上的nginx 端口号 …

初学python记录:力扣705. 设计哈希集合

题目&#xff1a; 不使用任何内建的哈希表库设计一个哈希集合&#xff08;HashSet&#xff09;。 实现 MyHashSet 类&#xff1a; void add(key) 向哈希集合中插入值 key 。bool contains(key) 返回哈希集合中是否存在这个值 key 。void remove(key) 将给定值 key 从哈希集合…

【NLP】大语言模型基础之Transformer结构

大语言模型基础之Transformer结构 1. Transformer结构总览2. 嵌入表示层2. 注意力层3. 前馈层4. 残差连接与层归一化5. 编码器和解码器结构参考文献 Transformer是一种深度学习模型架构&#xff0c;由Vaswani等人于2017年在论文《Attention is All You Need》中首次提出。它在自…

本地启用并操作Redis

本篇文章将向各位讲解redis的基础用法&#xff0c;废话不多说我们直接开始吧&#xff01; 首先需要下载redis到你本地&#xff0c;我这儿是下载到以下文件夹中&#xff1a; 双击redis-server.exe文件运行redis&#xff1a; 然后我们另外启用一个命令窗口&#xff08;需要进入你…

IOS H5页面中 HLS视频无法正常播放,使用hls.插件

IOS H5页面中 HLS视频无法正常播放&#xff0c;使用hls.插件 HLS.js依靠 HTML5 视频和 MediaSource Extensions 进行播放。 所有 iPhone 浏览器 &#xff08;iOS&#xff09; 都没有可用的 MediaSourceExtension&#xff0c;因此Hls.js将不起作用。如果您在 iPhone 上检查 Hl…

LeetCode-热题100:230. 二叉搜索树中第K小的元素

题目描述 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 1 开始计数&#xff09;。 示例 1&#xff1a; 输入&#xff1a; root [3,1,4,null,2], k 1 输出&#xff1a; 1 示例 2&#…