- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
已经有一些关于 map 和弱 map 的问题,像这样:What's the difference between ES6 Map and WeakMap?但我想问一下在什么情况下我应该赞成使用这些数据结构?或者当我偏爱其中一个时我应该考虑什么?
数据结构示例来自:https://github.com/lukehoban/es6features
// Sets
var s = new Set();
s.add("hello").add("goodbye").add("hello");
s.size === 2;
s.has("hello") === true;
// Maps
var m = new Map();
m.set("hello", 42);
m.set(s, 34);
m.get(s) == 34;
// Weak Maps
var wm = new WeakMap();
wm.set(s, { extra: 42 });
wm.size === undefined
// Weak Sets
var ws = new WeakSet();
ws.add({ data: 42 });
// Because the added object has no other references, it will not be held in the set
奖金。以上哪些数据结构会产生相同/相似的结果: let hash = object.create(null); hash[index] = something;
最佳答案
这包含在 §23.3 中规范:
If an object that is being used as the key of a
WeakMap
key/value pair is only reachable by following a chain of references that start within thatWeakMap
, then that key/value pair is inaccessible and is automatically removed from theWeakMap
.
所以弱映射中的条目,如果它们的键没有被其他任何东西引用,将在某个时候被垃圾收集回收。
相比之下,Map
持有对其键的强引用,如果 map 是唯一引用它们的对象,则可以防止它们被垃圾回收。
MDN puts it like this :
The key in a
WeakMap
is held weakly. What this means is that, if there are no other strong references to the key, then the entire entry will be removed from theWeakMap
by the garbage collector.
WeakSet
也是如此。
...in which situation should I favor the use of this data structures?
任何你不希望你有一个使用键的映射/集合的情况,以防止该键被垃圾收集。以下是一些示例:
拥有对实例真正私有(private)的特定于实例的信息,如下所示:(注意:此示例来自 2015 年,远早于 private fields 是一个选项。在 2021 年,我会为此使用私有(private)字段。)
let Thing = (() => {
var privateData = new WeakMap();
class Thing {
constructor() {
privateData[this] = {
foo: "some value"
};
}
doSomething() {
console.log(privateData[this].foo);
}
}
return Thing;
})();
作用域函数之外的代码无法访问 privateData
中的数据。该数据由实例本身键入。如果没有 WeakMap
,您将不会这样做,因为这会导致内存泄漏,您的 Thing
实例将永远不会被清理。但是 WeakMap
只包含 weak 引用,因此如果您使用 Thing
实例的代码完成了它并释放了它对该实例的引用, WeakMap
不会阻止实例被垃圾回收;相反,实例键入的条目将从映射中删除。
持有您无法控制的对象的信息。假设您从某个 API 获得了一个对象,您需要记住有关该对象的一些附加信息。您可以向对象本身添加属性(如果它不是密封的),但是向您控制之外的对象添加属性只是自找麻烦。相反,您可以使用以对象为键的 WeakMap
来存储您的额外信息。
WeakSet
的一个用例是跟踪或标记:假设在“使用”一个对象之前,您需要知道该对象过去是否曾经被“使用过”,但是不将其存储为对象上的标志(也许是因为如果它是对象上的标志,其他代码可以看到它[尽管您可以使用私有(private)字段来防止这种情况];或者因为它不是您的对象[所以私有(private)字段不会'帮助])。例如,这可能是某种一次性访问 token 。 WeakSet
是一种无需强制对象保留在内存中的简单方法。
Which of the above data structures will produce the same/similar result of doing:
let hash = Object.create(null); hash[index] = something;
这将最接近 Map
,因为字符串 index
(属性名称)将由对象中的强引用持有(它及其关联的属性将如果没有其他引用它,则不会被回收)。
关于javascript - ES6 集合、WeakSet、Map 和 WeakMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32710432/
编辑:我似乎问错了这个问题。 我正在尝试寻找一种方法来查询一个集合是否在另一个集合中可用。例如: SELECT * FROM something WHERE (1, 3) IN (1, 2, 3, 4
这两种方法似乎 produce the same results ,但我一直很难真正说服人们第二种方法有效,因为它显然并不为人所知。 // Create some data var foo = { '
我一直在学习Kotlin,并且遇到过Collections API。在Kotlin之前,我一直在学习Java,并且我知道Java中有很多不同类型的Collections API。例如,我们使用List
为什么我会得到不同的行为: Collection col2 = new ArrayList(col); 集合 col2 = new ArrayList(); col2.addAll(col) 我正在与
所以我有一个代表专辑信息的 JSON 对象。给定“function updateRecords(id, prop, value)”我希望能够更新每个条目。正确的完成代码如下。 我得到了指示,粗体部分,
我想存储一个对象集合,这些对象根据它们所代表的值进行键控。这些键可以重复。例如: [4] => Bob [5] => Mary [5] => Sue [9] => Steve [10] =>
在检查 ArrayList API 时,我注意到一些看起来很奇怪的东西。 确实,这里是 ArrayList 构造函数实现,其中 Collection 作为参数传递: public ArrayList(
我正在为 API 编写一个 swagger 定义文件。 API 是用于 GET 请求的 /path/to/my/api: get: summary: My Custom API d
我知道scala.collection包中有两个非常有用的对象,可以帮助我们实现这个目标: JavaConverters(如果我想明确说明并准确说明我要转换的内容) JavaConversions(如
我已经阅读了无数其他帖子,但似乎无法弄清楚发生了什么,所以是时候寻求帮助了。 我正在尝试将包含集合的域实体映射到也包含集合的 dtos。 这是一个原始示例; (我提前为代码墙道歉,我尽量保持简短):
我正在创建一个具有 ArrayList 的类,因此当我调用构造函数时,它会初始化该数组: public class ElementsList { private ArrayList list;
我正在阅读事件指南和指南的开头,它说: You can also add an event listener to any element in the this.$ collection using
我是 Python 新手,想知道如何使用键在字典中存储不同数据类型的列表 例如 - {[Key1,int1,int1,String1] , [Key2,int2,int2,String2], [Key
int[] mylist = { 2, 4, 5 }; IEnumerable list1 = mylist; list1.ToList().Add(1); // why 1 does not get
我在 UI 表单中的每一行之后将以下内容添加到 HashMap 集合中 声明 Map> map = new HashMap>(); List valSetOne = new ArrayList();
我正在开发我的第一个 Java 项目,我有一个问题。问题应该很简单(虽然代码不是那么短,但没有理由被吓倒:))。我创建了一个基本的角色扮演游戏,并且有一个定义每个角色的抽象类“Character”。在
我正在开发一款应用程序,可以为用户收集推文、Facebook 状态和 Facebook 照片。目前,用户确切地设定了他们希望这种收获发生的时间和时间,并且蜘蛛会在此期间拉取数据。 when 和 to
有谁知道在 C# 中是否有与 Java 的 Set 集合等效的好方法?我知道您可以通过填充但忽略值来使用 Dictionary 或 HashTable 在某种程度上模仿集合,但这不是一种非常优雅的方式
EXISTS 该函数返回 集合中第一个元素的索引,如果集合为空,返回NULLNULLNULL Collecti
RDF集合是通过属性 rdf:parseType="Collection" 来描述仅包含指定成员的组 rdf:parseType="Collection" 属
我是一名优秀的程序员,十分优秀!