JavaScript-带键的集合
Map对象
可以使用for...of
循环来得到所有的[key,value]
Object和Map的比较
一般的,objects
会被用于将字符串类型映射到数值。Object
允许设置健值对、根据键获取值、删除键、检测某个键是否存在。Map
具有更多优势
Object
的键均为String
类型,在Map
里键可以是任意类型。- 必须手动计算
Object
的尺寸,但是可以很容易地获取使用Map
的尺寸。 Map
的遍历遵循元素的插入顺序。Object
有原型,所以映射中有一些缺省的键。(可以用map = Object.create(null) 回避
)。
这三条提示可以帮你决定用Map
还是Object
:
- 如果键在运行时才能知道,或者所有的键类型相同,所有的值类型相同,那就使用
Map
。 - 如果需要将原始值存储为键,则使用
Map
,因为Object
将每个键视为字符串,不管它是一个数字值、布尔值还是任何其他原始值。 - 如果需要对个别元素进行操作,使用
Object
。
WeakMap对象
键必须为对象类型,值可以是任意类型。键被弱保持,也就是说,当其键所指对象没有被其他地方引用的时候,会被GC回收掉。
与Map
对象不同的是,WeakMap
的键是不可枚举的。不提供列出其键的方法。列表是否存在取决于垃圾回收器的状态,是不可预知的。
const privates = new WeakMap();
function Public() {
const me = {
// Private data goes here
};
privates.set(this, me);
}
Public.prototype.method = function () {
const me = privates.get(this);
// Do stuff with private data in `me`...
};
module.exports = Public;
Set集合
Set
对象是一组值的集合,这些值是不重复的,可以按照添加顺序来遍历。
数组和集合的转换,可以使用Array.from
或展开操作符
来完成集合到数组的转换。同样,Set
的构造器接受数组作为参数,可以完成从Array
到Set
到转换。
Array.from(mySet);
[...mySet2];
mySet2 = new Set([1,2,3,4]);
Array和Set的对比
一般情况下,在 JavaScript 中使用数组来存储一组元素,而新的集合对象有这些优势:
- 数组中用于判断元素是否存在的
indexOf
函数效率低下。 Set
对象允许根据值删除元素,而数组中必须使用基于下标的 splice 方法。- 数组的
indexOf
方法无法找到NaN
值。 Set
对象存储不重复的值,所以不需要手动处理包含重复值的情况。
- 本文链接:https://archer-lan.github.io/2023/11/20/JavaScript-%E5%B8%A6%E9%94%AE%E7%9A%84%E9%9B%86%E5%90%88/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。