JavaScript WeakMap对象的用途

JavaScript WeakMap对象的用途

什么是WeakMap

WeakMap是一种由键值对组成的集合,其中键是对象,值是任何JavaScript对象。

它类似于 Map ,但有一些区别:

  • 它不可枚举,键是私有的。
  • 如果键在WeakMap之外的地方没有引用到,它允许任何值进行垃圾回收。
  • 只有对象可以作为键。
  • 它依赖于垃圾回收,引入了不确定性。

注意: 键不能是原始数据类型(例如,字符串不能作为WeakMap的键)。

语法:

new WeakMap([iterable])

实例方法: 共有4个实例方法。

  1. WeakMap.prototype.delete( key ) 删除具有给定键的任何值。
  2. WeakMap.prototype.get( key ) 返回具有给定键的值,否则返回undefined。
  3. WeakMap.prototype.has( key ) 返回一个布尔值,判断一个值是否为WeakMap对象。
  4. WeakMap.prototype.set( key, value ) 在WeakMap对象中设置给定键的值。

WeakMap的应用场景:

  • 可用于跟踪对象调用。
  • 可用于跟踪库。
  • 可用作类中的私有属性。
  • 在浏览器中存储关于宿主对象(如DOM节点)的数据。

注意: 使用node.js执行以下示例

步骤:

  • 安装node.js
  • 在命令行中执行node <filename.js>

示例1: 这是一个WeakMap的基本用例,我们将一个空对象作为WeakMap的键引用,当赋值为“null”时,该对象会被垃圾回收,WeakMap也会自动设置为“undefined”。

JavaScript

const wm = new WeakMap();
let obj = {};
wm.set(obj, "value");
console.log(wm.get(obj));
obj = null;
console.log(wm.get(obj));

输出:

value
undefined

示例2: 在这个示例中,你将理解如何使用WeakMap追踪对象。你可以统计对象被传递给函数 foo() 的次数。

JavaScript

const objTracker = (() => {
    const wm = new WeakMap();
    return (obj) => {
        wm.set(obj, (wm.get(obj) || 0) + 1);
        return wm.get(obj);
    }
})();
 
function foo(args) {
    const count = objTracker(args);
    console.log(`{JSON.stringify(args)} is called{count} times`)
}
 
const obj1 = { key: 1 }
const obj2 = { key: 2 }
 
foo(obj1);
foo(obj1);
foo(obj2);

输出:

{"key":1} is called 1 times
{"key":1} is called 2 times
{"key":2} is called 1 times

示例3: 在这个示例中,我们在类中创建了私有属性。这类似于使用私有属性并在前面加上 #。

JavaScript

const Foo = (() => {
    const wm = new WeakMap();
    return class Fooclass {
        constructor() {
            wm.set(this, {
                classname: 'Fooclass'
            });
        }
        get name() {
            return wm.get(this).classname;
        }
    }
})();
 
const obj1 = new Foo()
console.log(obj1.name)

输出结果:

Fooclass

示例4: 在这个示例中,你将会了解如何通过对库方法进行特殊处理,在调用它们时做一些特殊的事情。直到 mod() 函数存在之前,你可以做一些操作。

JavaScript

function mod(a, b) {
    return a % b;
}
 
const lib = new WeakMap();
lib.set(mod, {
    do: () => {
        console.log('Something done');
    }
})
lib.get(mod).do();

输出:

Something done

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程