刷刷题3

141 阅读5分钟

观察者模式和订阅-发布模式的区别?

观察者模式(Observer Pattern)

观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系。当一个对象的状态发生变化时,所有依赖于它的对象都会收到通知并自动更新。观察者模式通常有一个主题(Subject)和多个观察者(Observer) ,主题直接通知观察者。

  • 特点:主题和观察者直接耦合。
  • 适用场景:当一个对象的变化需要影响到多个对象,并且这些对象之间的关系是直接的、紧密的。

发布订阅模式(Publish-Subscribe Pattern)

发布订阅模式与观察者模式非常相似,但存在一些重要区别。在发布订阅模式中,消息的发布者(Publisher)并不知道订阅者(Subscriber)的存在。发布者和订阅者之间没有直接的依赖关系。相反,通过一个中介(Broker) (通常是一个事件总线),发布者发布消息,订阅者可以根据需要选择接收这些消息。

  • 特点:发布者和订阅者解耦,通过中介进行消息传递。
  • 适用场景:当发布者和订阅者之间的关系较松散,并且消息的传递是异步的。

image.png

全局作用域中,用 const 和 let 声明的变量不在 window 上,那到底在哪里?如何去获取?

对于使用 const 和 let 声明的变量,它们只会存在于块级作用域中,而不是全局作用域中。因此,它们并不会被添加到 window 对象上,也无法通过 window 对象进行访问。

如果想要获取在块级作用域中声明的变量,可以在定义时使用 var 关键字或者将该变量赋值给一个全局对象属性。例如:

// 使用 var 定义的变量会被添加到 window 对象中
var a = 1;
console.log(window.a); // 1

// 将 let 定义的变量赋值给全局对象属性
let b = 2;
window.b = b; // 或者使用 globalThis.b = b;
console.log(window.b); // 2

需要注意的是,在代码中滥用全局变量是一种不良的编程习惯,容易造成命名冲突和代码耦合度过高等问题。如果可能的话,应该尽量避免在全局作用域中定义变量和函数,并采用模块化开发的方式来管理代码。

opacity: 0visibility: hiddendisplay: none 有啥区别, 主要使用场景是啥

  • opacity: 0 :设置元素透明度为 0,元素依然占据原来的空间,并且可以接收到鼠标事件。通常用于实现淡出效果。
  • visibility: hidden :元素不可见,但是仍然占据原来的空间,并且可以接收到鼠标事件。常用于实现菜单的展开和收起。
  • display: none :元素不可见,且不占据空间,也不接收鼠标事件。通常用于实现元素的隐藏和显示。

因为这三种属性的区别,它们在使用场景上也有所不同:

  • opacity: 0 :适用于需要实现淡出效果的场景,比如弹出层的显示和隐藏。
  • visibility: hidden :适用于需要占据原来空间的元素,但不需要显示的场景,比如菜单的展开和收起。
  • display: none :适用于需要完全隐藏元素的场景,比如实现一个开关,点击开关后可以隐藏或者显示某个元素。

介绍下如何实现 token 加密?【网络】

Token 是一种常用的身份验证机制,通常被用于 Web 应用程序的用户身份验证。Token 的生成和使用可以使用加密技术来增强安全性,下面介绍一下如何实现 Token 加密。

Token 加密一般有两个步骤:

  1. 生成 Token
  2. 加密 Token

1. 生成 Token

在生成 Token 时,需要将用户的一些信息进行组合,生成一个字符串,该字符串通常包括以下信息:

  1. 用户的唯一标识(如用户 ID)
  2. 时间戳
  3. 有效期

这些信息可以用分隔符分隔开,如用“.”分隔。

2. 加密 Token

加密 Token 有多种方式,下面介绍两种常用的方式:

1. 对称加密

对称加密是指加密和解密使用同一密钥的加密算法。对称加密的优点是加解密速度快,缺点是密钥传输容易被截获,从而影响安全性。

常用的对称加密算法有 DES、3DES、AES 等。

2. 非对称加密

非对称加密是指加密和解密使用不同密钥的加密算法。非对称加密的优点是密钥传输安全,缺点是加解密速度较慢。

常用的非对称加密算法有 RSA、DSA 等。

一般情况下,为了兼顾安全性和效率,通常采用混合加密,即先使用非对称加密算法对 Token 进行加密,再使用对称加密算法对加密后的 Token 进行加密。

综上所述,实现 Token 加密的关键在于对 Token 的生成和加密,需要根据具体业务需求来选择合适的加密算法和加密方式。

数组里面有10万个数据,取第一个元素和第10万个元素的时间相差多少?

数组可以直接根据索引取的对应的元素,所以不管取哪个位置的元素的时间复杂度都是 O(1)

得出结论:消耗时间几乎一致,差异可以忽略不计

原因

JavaScript 没有真正意义上的数组,所有的数组其实是对象,其“索引”看起来是数字,其实会被转换成字符串,作为属性名(对象的 key)来使用。所以无论是取第 1 个还是取第 10 万个元素,都是用 key 精确查找哈希表的过程,其消耗时间大致相同。

Chrome 浏览器 JS 引擎 V8 中,数组有两种存储模式,一种是类似 C 语言中的线性结构存储(索引值连续,且都是正整数的情况下),一种是采用 Hash 结构存储(索引值为负数,数组稀疏,间隔比较大)