新物网

当前位置:首页 > 百科

百科

轻载tostring真正实现JSHashmapp

时间:2023-10-18 10:16:07 静子
任何使用过Java的人都知道有一个强大的算法设计——HashMap,它可以给键和系数匹配浏览。但是认识JS的朋友会说,JS里到处都有hashmap,每个目标都提供map[key]访问方式。但请仔细比较,你会发现差别还是比较大的。Java Hashmap的key是Object类
任何使用过Java的人都知道有一个强大的算法设计——HashMap,它可以给键和系数匹配浏览。但是认识JS的朋友会说,JS里到处都有hashmap,每个目标都提供map[key]访问方式。

但请仔细比较,你会发现差别还是比较大的。Java Hashmap的key是Object类型,因此可以使用任何类型的主要参数,而JS的key只能是字符串数组或数据。 也许你会说,obj={};map[obj]=1;这个代码传输到key,既不是数据,也不是识别符,但没有错。这是因为编译器根据内置tostring将obj目标转化为“”[object Object]“这段标识符,我们可以使用for 看看each下的map。java之所以能接受任何类型的key,是因为它的object完成了hashcode,每个类都继承或重写了hashcode,所以任何自变量都有一个哈希值。也可以用JS试试。

前面提到了tostring方法,用于将所有类型转换为标识符;还有另一种类似于它的方法:valueOf,它被用来转换成数据。因为数据很容易检索,首先,我们尝试valueoff:

Object.prototype.valueOf = function()

{

alert("Hello~")

};



var map = [];

var obj = {};

map[obj] = 1;

结论非常令人失望,提示框没有跳出来,说明JS模块没有考虑将obj目标转换为数据。下面试着修改tostring的方式:

Object.prototype.toString = function()

{

alert("Hello~")

};



var map = {};

var obj = {};

map[obj] = 1;

这时,提示框跳了出来。自然,我们没有回到数据信息中,这1被存储到map[”undefined"]里边。自然,我们没有回到数据信息中,这1被存储到map[”undefined“]里面。但是,如果您返回一个标值,并且能够确保每个自变量的唯一标值,您可以使用最原始的map[key]检索所有类型的形式。轻载Object的tostring方式:

var HASH_ID = 0;


Object.prototype.toString = function()

{

if(this._HASH == null)

this._HASH = HASH_ID ;

return "Obj:" this._HASH;

};

以下是测试:

var HashMap = {};

var obj1 = {};

var obj2 = {};


HashMap[obj1] = "Foo1";

HashMap[obj2] = "Foo2";

alert(HashMap[obj1] " & " HashMap[obj2];



HashMap[obj1] = "Bar1";

HashMap[obj2] = "Bar2";

alert(HashMap[obj1] " & " HashMap[obj2];

各自导出:Foo1 & Foo2 和 Bar1 & Bar2,这也说明obj1,obj2自始至终对应于同一个检索。