小丁6/15 日报

117 阅读4分钟

1. Map和Object有什么区别?

  • 语法结构不同:Map 是一个类,而 Object 是一个内置对象。Map 使用 new 关键字进行实例化,而 Object 则以字面量形式创建。
  • 键的类型:Object 只支持字符串和 Symbol 作为键,而 Map 支持任意值作为键,包括基本数据类型和引用类型。
  • 内存占用:在处理大量数据时,Map 的内存占用通常比 Object 更优。
  • 遍历顺序:Map 中的元素按照插入顺序进行迭代,而 Object 中的属性没有特定的顺序。
  • 原型链上的方法:Map 类型提供了诸如 sizeforEach 等方法,方便开发者进行集合操作;而 Object 类型则继承了原型链上的方法,例如 hasOwnPropertytoString 等方法。
  • 应用场景:Map 通常在需要对键值对集合进行频繁的增删改查操作时使用,而 Object 则更适合作为普通的键值对集合使用,如 JSON 对象。

2. 哪些情况会导致内存泄漏?

  • 意外的全局变量:如果在函数内部忘记使用 letconst 声明变量,那么该变量会成为全局变量,从而长期占据着内存。
  • 闭包:对于不再需要的函数或变量,由于闭包的存在,可能仍然被引用,导致无法释放内存。
  • 定时器和回调函数:如果使用 setTimeoutsetInterval 函数创建定时器,但忘记及时清除定时器,或者将函数作为回调函数传递给其它函数中去,也有可能导致内存泄漏。
  • DOM 节点引用:如果对于 DOM 节点的引用一直存在,但页面上该节点被删除了,那么该节点仍然会一直占用内存。
  • 大量数据存储:如果在客户端存储了大量数据,而这些数据并不再需要使用,也可能造成内存泄漏。
  • 循环引用:如果两个对象之间相互引用,而没有及时断开引用,那么就会形成循环引用,导致内存泄漏。
  • 内存泄漏的三种情况:悬垂指针、内存堆积、缓存导致的内存泄漏等情况。

3. await到底在等啥?

  • 在 JavaScript 中使用 await 关键字可以等待一个异步操作完成并返回其结果,这个异步操作通常是一个返回 Promise 的函数调用。在等待异步操作的过程中,await 会暂停当前函数的执行,直到异步操作完成并返回 Promise 对象的 resolved 值或 rejected 值,然后再继续执行函数。

  • 具体来说,当遇到一个带有 await 关键字的表达式时,JavaScript 引擎会先计算表达式中的异步操作的 Promise 对象的值(即要么是 resolved 状态的结果值,要么是 rejected 状态的原因值),然后将这个值返回给表达式所处的上下文环境,同时暂停该上下文环境的执行,直到异步操作的 Promise 对象被 resolved 或 rejected。

  • 需要注意的是,await 只能在异步函数(async function) 内部使用,否则会导致语法错误。另外,由于 await 会暂停函数执行,因此在使用它的时候要特别注意不要阻塞代码执行,否则可能会影响应用程序的性能和响应速度。

4.Promise.all和Promise.race的区别和使用场景?

  1. 返回结果不同:Promise.all() 方法返回一个 Promise 对象,该对象在所有的 Promise 对象都变为 Fulfilled 状态后 resolve,将每个 Promise 对象 resolve 的结果存储在一个数组中返回;而 Promise.race() 方法也返回一个 Promise 对象,但是只要有一个 Promise 对象的状态变为 Fulfilled 或 Rejected,就会 resolve 或 reject。
  2. 处理方式不同:Promise.all() 会等待所有的 Promise 对象都完成,才返回一个包含所有 Promise 对象结果的数组;而 Promise.race() 只要有一个 Promise 对象完成(无论是 FulFilled 状态还是 Rejected 状态),就会立即返回该 Promise 对象的结果。

使用场景方面:

  1. Promise.all() 适用于需要等待所有 Promise 对象都完成再执行后续操作的场景,例如并行处理多个请求,然后将所有数据集中处理。
  2. Promise.race() 适用于需要在最短时间内得到 Promise 对象的结果的场景,例如限制某一请求的最长等待时间,或者需要获取多个接口返回的结果中最先返回的那个结果。

总之,根据具体场景的需求来选择合适的方法,这两个方法都可以有效地帮助我们管理多个 Promise 对象的状态,提高代码的可读性和易用性。 Promise.all() 一荣俱荣 一损俱损 Promise.race() 以最快的结果为结果