169. 面试官:请手写“快速排序”?

169期题目

1. 请手写“快速排序”?
2. 有哪些方式可以实现样式隔离?
3. html和css中的图片加载与渲染规则是什么样的?

上面问题的答案会在第二天的公众号(程序员每日三问)推文中公布

也可以小程序刷题,已收录500+面试题及答案e010fb5a0ca69806de30a2608295b8a0.jpeg

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. 浏览器存储

浏览器存储主要包括LocalStorageSessionStorage。它们可以在浏览器端存储数据,以便在页面刷新或重新打开时使用。

优先级:

浏览器存储的优先级低于HTTP缓存,因为它们是在客户端存储,不受服务器控制。

综合来说,优先级从高到低排列为:

  1. 强缓存

  2. 协商缓存

  3. 浏览器存储

在实际应用中,合理利用这些缓存机制可以有效提升网页性能,减少资源请求和加载时间。

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. 说说你对函数式编程的理解,以及优缺点?

函数式编程是一种编程范式,它将计算视为数学函数的求值,避免了可变状态和可变数据。以下是我对函数式编程的理解以及其优缺点:

理解:

  1. 数学函数的思想: 函数式编程强调将程序看作是一系列函数的组合,这些函数接受输入并产生输出,而且对于相同的输入,总是产生相同的输出,类似于数学中的函数。

  2. 纯函数: 函数式编程推崇纯函数,即对于相同的输入,函数总是返回相同的输出,而且没有副作用(不修改外部状态或数据)。

  3. 不可变性: 数据一旦创建就不可改变,而是通过创建新的数据来表示变化,这有助于避免共享状态引起的问题。

  4. 高阶函数: 函数可以作为参数传递给其他函数,也可以作为返回值,这种灵活性使得函数可以更容易地组合和复用。

优点:

  1. 可维护性: 函数式编程强调纯函数和不可变性,减少了代码的复杂性,使得程序更易于理解和维护。

  2. 并发性: 由于函数式编程的不可变性,函数之间没有共享的状态,因此在并发编程中更容易实现并避免一些常见的并发问题。

  3. 测试性: 纯函数的特性使得单元测试更容易,因为函数的输出完全由输入决定,不需要考虑外部状态。

  4. 代码复用: 高阶函数、函数组合等特性使得代码更具有可复用性,可以更容易地构建模块化的代码。

缺点:

  1. 学习曲线: 对于习惯了命令式编程的开发者来说,切换到函数式编程可能需要一些时间适应新的思维方式。

  2. 性能问题: 在一些特定场景下,函数式编程的性能可能不如命令式编程。例如,某些循环操作在函数式编程中可能需要创建新的数据结构,导致性能开销。

  3. 不适用所有场景: 并非所有问题都适合用函数式编程解决,有些问题可能更适合使用命令式的、状态可变的范式。

总体而言,函数式编程在可维护性、并发性和测试性方面有很多优点,但也需要权衡学习成本和性能等因素。在合适的场景下,函数式编程可以为开发者提供更清晰、可靠的代码。

因为微信公众号修改规则,如果标星或点在看,你可能会收不到我公众号文章的推送,原创不易,请大家将本公众号星标,看完文章后记得点下赞或者在看,谢谢各位!

学习不打烊,充电加油只为遇到更好的自己,每天早上9点纯手工发布面试题,每天坚持花20分钟来学习与思考,在千变万化,类库层出不穷的今天,不要等到找工作时才狂刷题,提倡每日学习。

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值