interview
frontend-classic
JS 中 Map 和 WeakMap 有什么区别

前端经典面试题合集, JS 中 Map 和 WeakMap 有什么区别?

前端经典面试题合集, JS 中 Map 和 WeakMap 有什么区别?

QA

Step 1

Q:: JS 中 Map 和 WeakMap 有什么区别?

A:: Map 和 WeakMap 都是 ES6 引入的数据结构。Map 是一种键值对集合,任何类型的值(对象或原始值)都可以作为键。WeakMap 也是一个键值对集合,但它只接受对象作为键名,并且这些对象是弱引用,即垃圾回收机制不考虑 WeakMap 对该对象的引用。具体区别如下:1. 键的类型:Map 的键可以是任何类型,WeakMap 的键只能是对象。2. 垃圾回收:WeakMap 中的键是弱引用,如果没有其他引用,键所对应的对象会被垃圾回收。3. 迭代:Map 是可迭代的,可以使用 for...of 循环遍历,WeakMap 不可迭代。4. 应用场景:Map 适用于存储任意键值对,WeakMap 适用于存储键为对象且需要弱引用的情况,比如缓存或者 DOM 元素的临时存储。

Step 2

Q:: JS 中的闭包是什么?

A:: 闭包是指那些能够访问自由变量的函数。换句话说,函数可以记住并访问它的词法作用域,即使函数是在当前词法作用域之外执行。闭包可以用来实现数据的私有性、回调函数和函数工厂等。

Step 3

Q:: JavaScript 中的事件循环机制是什么?

A:: JavaScript 是单线程语言,但通过事件循环机制,可以实现异步编程。事件循环负责协调消息队列和调用栈。当调用栈为空时,事件循环会将消息队列中的第一个任务推入调用栈并执行。常见的异步任务有 setTimeout、Promise、事件监听等。事件循环使得 JavaScript 可以处理 I/O 操作、用户交互等,而不会阻塞主线程。

Step 4

Q:: 如何解释 JavaScript 中的原型和原型链?

A:: JavaScript 中每个对象都有一个内置属性 [[Prototype]],可以通过 proto 访问,这个属性指向该对象的原型。原型是一个对象,也可以有自己的原型,以此形成一个链条,即原型链。当访问对象的属性时,如果属性不存在于对象本身,会沿着原型链向上查找,直到找到该属性或到达原型链的末端(null)。原型和原型链是 JavaScript 实现继承和共享方法的基础。

Step 5

Q:: JS 中的 'this' 关键字如何工作?

A:: 'this' 关键字的值取决于函数调用的方式。在全局范围内或普通函数中,'this' 指向全局对象(在浏览器中是 window);在方法中,'this' 指向该方法所属的对象;在构造函数中,'this' 指向新创建的对象;在箭头函数中,'this' 取决于外层(函数或全局)作用域。通过 call、apply 或 bind 方法,可以显式地绑定 'this' 的值。

用途

面试这些内容是因为它们是 JavaScript 核心概念和高级特性的基础,理解它们有助于编写高效、可维护的代码。在实际生产环境中,这些概念和特性常用于解决复杂问题、优化性能、实现模块化设计和处理异步编程等。\n

相关问题

🦆
什么是 JavaScript 中的执行上下文和调用栈?

执行上下文是代码执行时的环境,每次函数调用都会创建新的执行上下文。执行上下文包含变量对象、作用域链和 'this' 绑定。调用栈是一个栈数据结构,用于追踪程序执行位置,当函数调用时,执行上下文压入栈顶,函数返回时,执行上下文弹出栈。

🦆
解释 JavaScript 中的浅拷贝和深拷贝的区别.

浅拷贝只复制对象的第一层属性,如果属性是对象,拷贝的是对象的引用。深拷贝会递归复制对象的所有层次,生成一个全新的对象。浅拷贝可以使用 Object.assign() 或展开运算符,深拷贝可以使用 JSON.parse(JSON.stringify()) 或手动递归实现。

🦆
什么是 JavaScript 中的异步编程,如何实现?

异步编程使得代码在等待某些任务(如 I/O 操作)完成时不会阻塞主线程。常见的实现方法有回调函数、Promise 和 async/await。回调函数通过传递函数处理异步结果,Promise 提供链式调用处理异步操作,async/await 是 Promise 的语法糖,使异步代码看起来像同步代码。

🦆
解释 JavaScript 中的模块化和模块系统.

模块化是将代码分成独立的模块,每个模块只实现一个功能,便于维护和复用。JavaScript 的模块系统包括 CommonJS、AMD 和 ES6 模块。CommonJS 主要用于 Node.js,使用 require 和 module.exports 导入导出模块。AMD 主要用于浏览器环境,使用 define 和 require。ES6 模块使用 import 和 export 语法,支持静态分析和树摇优化。

🦆
JavaScript 中的事件代理是什么?

事件代理是将事件监听器添加到父元素,而不是每个子元素。当事件发生时,事件会从事件目标向上冒泡到父元素,父元素上的监听器会捕获并处理事件。事件代理减少了内存占用,提高了性能,特别适用于动态添加的子元素。