169期题目
1. 请手写“快速排序”?
2. 有哪些方式可以实现样式隔离?
3. html和css中的图片加载与渲染规则是什么样的?
上面问题的答案会在第二天的公众号(程序员每日三问)推文中公布
也可以小程序刷题,已收录500+面试题及答案
168期问题及答案
1. 浏览器有哪几种缓存,各种缓存的优先级是什么样的?
在前端开发中,浏览器缓存是一个重要的概念,它可以提高网页加载速度,减轻服务器压力。浏览器缓存主要分为两大类:HTTP缓存和浏览器存储。HTTP缓存又分为强缓存和协商缓存。
1. 强缓存
强缓存是指浏览器直接从本地缓存中获取资源,而不与服务器进行交互。常见的强缓存控制头有:
Expires: 指定资源的过期时间,是服务器返回的具体日期。
Cache-Control: 通过
max-age
指定资源在本地缓存中的有效时间,单位是秒。
优先级:
如果同时设置了Expires和Cache-Control,浏览器会优先使用Cache-Control。
2. 协商缓存
协商缓存是指浏览器与服务器通信,由服务器决定是否使用缓存。常见的协商缓存控制头有:
Last-Modified: 指定资源最后一次修改的时间。
If-Modified-Since: 当资源在浏览器缓存中有时,浏览器会发送该请求头,询问资源是否有更新。
ETag: 用于唯一标识资源版本,由服务器生成。
If-None-Match: 当资源在浏览器缓存中有时,浏览器会发送该请求头,询问资源是否有更新。
优先级:
如果同时存在Last-Modified和ETag,浏览器会优先使用ETag。
3. 浏览器存储
浏览器存储主要包括LocalStorage和SessionStorage。它们可以在浏览器端存储数据,以便在页面刷新或重新打开时使用。
优先级:
浏览器存储的优先级低于HTTP缓存,因为它们是在客户端存储,不受服务器控制。
综合来说,优先级从高到低排列为:
强缓存
协商缓存
浏览器存储
在实际应用中,合理利用这些缓存机制可以有效提升网页性能,减少资源请求和加载时间。
2. canvas 和 webgl 有什么区别?
Canvas和WebGL都是用于在网页上进行图形渲染的技术,但它们有一些关键的区别,包括渲染方式、功能性和适用场景。
1. 渲染方式:
Canvas: 2D绘图上下文,提供的是简单的绘图API。Canvas使用类似绘画的方式,你可以在上面画线、填充颜色、绘制图像等。
WebGL: 3D绘图上下文,基于OpenGL ES标准,提供了更底层的、基于硬件加速的3D渲染。WebGL允许你使用GLSL语言编写自定义的顶点和片段着色器,实现复杂的图形效果。
2. 功能性:
Canvas: 适用于2D图形绘制,简单而直观。可以用于创建图表、图形和简单的动画,但对于复杂的三维场景,其性能和功能有限。
WebGL: 专注于高性能的3D图形渲染。可以创建复杂的三维场景,处理大量的图形数据,实现更高级的图形效果。由于其底层的硬件加速,WebGL通常比Canvas在渲染复杂图形时更高效。
3. 编程接口:
Canvas: 使用简单的绘图API,主要通过2D上下文对象进行操作。
WebGL: 使用OpenGL ES风格的接口,需要编写复杂的着色器程序来控制图形渲染过程,对于初学者来说学习曲线较陡。
4. 适用场景:
Canvas: 适用于需要简单图形或动画的应用,如图表、小游戏等。
WebGL: 适用于需要高性能、复杂3D图形的应用,如游戏、模拟器、虚拟现实等。
总体而言,选择Canvas还是WebGL取决于项目的需求。Canvas简单易用,适用于2D图形和简单动画,而WebGL更适合处理复杂的三维图形和需要更高性能的场景。
3. 说说你对函数式编程的理解,以及优缺点?
函数式编程是一种编程范式,它将计算视为数学函数的求值,避免了可变状态和可变数据。以下是我对函数式编程的理解以及其优缺点:
理解:
数学函数的思想: 函数式编程强调将程序看作是一系列函数的组合,这些函数接受输入并产生输出,而且对于相同的输入,总是产生相同的输出,类似于数学中的函数。
纯函数: 函数式编程推崇纯函数,即对于相同的输入,函数总是返回相同的输出,而且没有副作用(不修改外部状态或数据)。
不可变性: 数据一旦创建就不可改变,而是通过创建新的数据来表示变化,这有助于避免共享状态引起的问题。
高阶函数: 函数可以作为参数传递给其他函数,也可以作为返回值,这种灵活性使得函数可以更容易地组合和复用。
优点:
可维护性: 函数式编程强调纯函数和不可变性,减少了代码的复杂性,使得程序更易于理解和维护。
并发性: 由于函数式编程的不可变性,函数之间没有共享的状态,因此在并发编程中更容易实现并避免一些常见的并发问题。
测试性: 纯函数的特性使得单元测试更容易,因为函数的输出完全由输入决定,不需要考虑外部状态。
代码复用: 高阶函数、函数组合等特性使得代码更具有可复用性,可以更容易地构建模块化的代码。
缺点:
学习曲线: 对于习惯了命令式编程的开发者来说,切换到函数式编程可能需要一些时间适应新的思维方式。
性能问题: 在一些特定场景下,函数式编程的性能可能不如命令式编程。例如,某些循环操作在函数式编程中可能需要创建新的数据结构,导致性能开销。
不适用所有场景: 并非所有问题都适合用函数式编程解决,有些问题可能更适合使用命令式的、状态可变的范式。
总体而言,函数式编程在可维护性、并发性和测试性方面有很多优点,但也需要权衡学习成本和性能等因素。在合适的场景下,函数式编程可以为开发者提供更清晰、可靠的代码。
因为微信公众号修改规则,如果不标星或点在看,你可能会收不到我公众号文章的推送,原创不易,请大家将本公众号星标,看完文章后记得点下赞或者在看,谢谢各位!
学习不打烊,充电加油只为遇到更好的自己,每天早上9点纯手工发布面试题,每天坚持花20分钟来学习与思考,在千变万化,类库层出不穷的今天,不要等到找工作时才狂刷题,提倡每日学习。