Javascript之数据结构与算法的Dictionary实现

本文探讨了自定义JavaScript Dictionary类与ES6中的Map、WeakMap的区别。Dictionary类通过size方法获取元素数量,而Map的size属性直接提供此信息。Map的values和keys方法返回迭代器,不同于Dictionary的数组。此外,讨论了WeakMap和WeakSet的特性,如只能用对象作为键,没有entries、keys和values方法,适合于提高性能和实现私有属性。
摘要由CSDN通过智能技术生成

Javascript之数据结构与算法的Dictionary实现

1.自实现Dictionary

class Dictionary{
    constructor(){
        this.items={}
    }
    has(key){
        return key in this.items;
    }
    set(key,value){
        this.items[key]=value;
    }
    delete(key){
        if(this.has(key)){
            delete this.items[key];
            return true;
        }
        return false;
    }
    get(key){
        return this.has(key) ? this.items[key]:undefined;
    }
    values(){
        var values=[];
        for(let k in this.items){
            if(this.has(k)){
                values.push(this.items[k]);
            }
        }
        return values;
    }
    keys(){
        return Object.keys(this.items);
    }
    getItems(){
        return this.items;
    }
    clear(){
        this.items={};
    }
    size(){
        return Object.keys(this.items).length;
    }

}
let dictionary=new Dictionary();
dictionary.set('john','johnsname@email.com');
console.log(dictionary.has('john'));
console.log(dictionary.size());
console.log(dictionary.keys())
console.log(dictionary.values())
console.log(dictionary.get('john'))
console.log(dictionary.getItems())

2.Es6中Map对比

let map=new Map();
map.set('Gandalf', 'gandalf@email.com');
map.set('John', 'johnsnow@email.com');
map.set('Tyrion', 'tyrion@email.com');
console.log(map.has('Gandalf')); //输出true
console.log(map.size); //输出3
console.log(map.keys()); //输出["Gandalf", "John", "Tyrion"]
console.log(map.values()); //输出["gandalf@email.com","johnsnow@email.com", "tyrion@email.com"]
console.log(map.get('Tyrion')); //输出tyrion@email.com
console.log(map.delete("John"));

3.Map总结

和我们的Dictionary类不同, ES6的Map类的values方法和keys方法都返回Iterator,而不是值或键构成的数组。另一个区别是,我们实现的size方法返回字典中存储的值的个数,而ES6的Map类则有一个size属性。
删除map中的元素可以用delete方法:
map.delete(‘John’);
clear方法会重置map数据结构,这跟我们在Dictionary类里实现的一样。

4.Es6中WeakMap类和WeakSet类

//Es6中WeakMap类和WeakSet类
let map=new WeakMap();
var ob1 = {name:'Gandalf'}, //
ob2 = {name:'John'},
ob3 = {name:'Tyrion'};
map.set(ob1, 'gandalf@email.com'); //
map.set(ob2, 'johnsnow@email.com');
map.set(ob3, 'tyrion@email.com');
console.log(map.has(ob1)); // 输出true
console.log(map.get(ob3)); // 输出tyrion@email.com
map.delete(ob2); //

总结:
除了Set和Map这两种新的数据结构, ES6还增加了它们的弱化版本, WeakSet和WeakMap。
基本上, Map和Set与其弱化版本之间仅有的区别是:

  • WeakSet或WeakMap类没有entries、 keys和values等方法;
  • 只能用对象作为键。
  • WeakMap类也可以用set方法,但不能使用数字、字符串、布尔值等基本数据类型,需要将名字转换为对象。
  • 同样的逻辑也适用于WeakSet类

优点:
1.创建和使用这两个类主要是为了性能。 WeakSet和WeakMap是弱化的(用对象作为键),没有强引用的键。这使得JavaScript的垃圾回收器可以从中清除整个入口。
2.必须用键才可以取出值。这些类没有entries、 keys和values等迭代器方法,因此,除非你知道键,否则没有办法取出值。即可使用WeakMap类封装ES6类的私有属性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值