轻载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自始至终对应于同一个检索。
但请仔细比较,你会发现差别还是比较大的。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自始至终对应于同一个检索。