Set类的实现:
Set
对象允许存储任何类型的唯一值,无论是原始值或者是对象引用。
function Set() {
var items = {};
this.add = function(value){
if(!this.has(value)){
items[value] = value;
return true;
}
return false;
};
this.remove = function(value){
if(this.has(value)){
delete items[value];
return true;
}
return false;
};
this.has = function(value){
// return value in items;
return items.hasOwnProperty(value);
};
this.clear = function(){
items = {};
};
this.size = function(){
return Object.keys(items).length;
};
/**返回包含集合中所有值的数组 */
this.values = function(){
return Object.keys(items);
}
}
Map类的实现:
Map
对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。
function Dictionary(){
var items = {};
/**是否存在该值 */
this.has = function(key){
return key in items;
};
this.set = function(key, value){
items[key] = value;
};
/**移除特定的值 */
this.remove = function (key){
if (this.has(key)) {
delete items[key];
return true;
}
return false;
};
/**查找特定的值 */
this.get = function (key) {
return this.has(key) ? items[key] : undefined;
}
this.clear = function(){
items = {};
};
this.size = function(){
return Object.keys(items).length;
};
}
Objects 和 maps 的比较
Objects
和 Maps
类似的是,它们都允许你按键存取一个值、删除键、检测一个键是否绑定了值。因此(并且也没有其他内建的替代方式了)过去我们一直都把对象当成 Maps
使用。不过 Maps
和 Objects
有一些重要的区别,在下列情况里使用 Map
会是更好的选择:
- 一个
Object
的键只能是字符串
或者Symbols
,但一个Map
的键可以是任意值,包括函数、对象、基本类型。 - Map 中的键值是有序的,而添加到对象中的键则不是。因此,当对它进行遍历时,Map 对象是按插入的顺序返回键值。
- 你可以通过
size
属性直接获取一个Map
的键值对个数,而Object
的键值对个数只能手动计算。 Map
可直接进行迭代,而Object
的迭代需要先获取它的键数组,然后再进行迭代。Object
都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。虽然 ES5 开始可以用map = Object.create(null)
来创建一个没有原型的对象,但是这种用法不太常见。Map
在涉及频繁增删键值对的场景下会有些性能优势。