前端经典面试题合集, 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'
的值。