重载toString实现JS HashMap分析

不过请仔细对比一下,你会发现其中差别还是很大的。Java HashMap的key是Object类型,所以可以任何类型的参数,而JS的key只能是字符串或是数字。 你也许会说,obj={};map[obj]=1;这段代码传入了既不是数字也不是字符的key,但也没发生错误啊。那是因为解释器将obj对象通过内置的toString方法转换成“[object Object]”这段字符了,你可以用for each下map看看。而java之所以能够接受任何类型的key,是因为其Object实现了HashCode方法,而每个类都继承或重写了Object的HashCode,所以任何变量都有一个哈希值。我们也可以用JS来尝试一下。

前面提到了toString方法,用于任何类型转成字符;和它类似的还有另一个方法:valueOf,用于转型成数字。因为数字比较容易索引,我们先尝试valueOf:


代码如下:

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"]里面。但若我们返回一个数值,并且能保证每个变量唯一的数值,那么就可以用最原始的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始终对应着同个索引。

当然,如果object自身重写了toString方法就不一定了,它也许每次返回都不一样的值。所以运用的时候,要根据实际情况做相应的调整。(2011/3/12)

(0)

相关推荐

  • Javascript中valueOf与toString区别浅析

    前言 基本上,所有JS数据类型都拥有这两个方法,null除外.它们俩解决javascript值运算与显示的问题,重写会加大它们调用的优化. 测试分析 先看一例: 复制代码 代码如下: var aaa = {  i: 10,  valueOf: function() { return this.i+30; },  toString: function() { return this.valueOf()+10; } } alert(aaa > 20); // true alert(+aaa); //

  • js中toString()和String()区别详解

    我们知道String()与 .toString()都是可以转换为字符串类型,但是String()与 .toString()的还是有区别的 1..toString()可以将所有的的数据都转换为字符串,但是要排除null 和 undefined 例如将false转为字符串类型 var str = false.toString(); console.log(str, typeof str); 返回的结果为 false,string 看看null 和 undefined能不能转换为字符串javascri

  • js资料toString 方法

    toString 方法 返回对象的字符串表示. objectname.toString([radix])参数 objectname  必选项.要得到字符串表示的对象.  radix  可选项.指定将数字值转换为字符串时的进制.  说明 toString 方法是所有内建的 JScript 对象的成员.它的操作依赖于对象的类型: 对象 操作  Array 将 Array 的元素转换为字符串.结果字符串由逗号分隔,且连接起来.  Boolean 如果 Boolean 值是 true,则返回 "true

  • JavaScript中valueOf函数与toString方法深入理解

    JavaScript中valueOf函数方法是返回指定对象的原始值.使用方法: object.valueOf( )object是必选项参数是任意固有 JScript 对象. 每个JavaScript固有对象的 valueOf 方法定义不同. 对象 返回值 Array 数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起.其操作与 Array.toString 和 Array.join 方法相同. Boolean Boolean 值. Date 存储的时间是从 1970 年 1 月 1 日午

  • 判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解

    1.typeof(param) 返回param的类型(string) 这种方法是JS中的定义的全局方法,也是编译者们最常用的方法,优点就是使用简单.好记,缺点是不能很好的判断object.null.array.regexp和自定义对象. 示例代码: 复制代码 代码如下: var str='str';var arr=['1','2'];var num=1;var bool=true;var obj={name:'test'};var nullObj=null;var undefinedObj=un

  • js字符串的各种格式的转换 ToString,Format

    如果我们都计算出对的格式,然后再显示的话,显然浪费代码和效率,今天看见了许多ToString可以解决的格式,总结给大家,希望可以方便大家. 1.转换钱的格式,仅限int型,float型,double型 double d = 400; d.ToString("C"); //¥400.00 2.10进制数,仅限int型的数字 int i=400; i.ToString("D5"); // 00400 3.科学型数字,仅限int型,float型,double型 float

  • 非常好用的JsonToString 方法 简单实例

    非常好用的JsonToString方法Jsontostring代码 复制代码 代码如下: function JsonToString(o) {        var arr = [];     var fmt = function(s) {         if (typeof s == 'object' && s != null) return JsonToStr(s);         return /^(string|number)$/.test(typeof s) ? "

  • JavaScript中Object.prototype.toString方法的原理

    在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. var arr = []; console.log(Object.prototype.toString.call(arr)) //"[object Array]" 本文要讲的就是,toString方法是如何做到这一点的,原理是什么. ECMAScript 3 在ES3中,Object.prototype.toString方法的规范如下: 15.2.

  • node.js中的buffer.toString方法使用说明

    方法说明: 将buffer对象转换成指定的字符编码的字符串. 语法: 复制代码 代码如下: buffer.toString([encoding], [start], [end]) 接收参数: encoding       转换成字符串后的字符编码,默认为 'utf8′ start                buffer 转换的起始位置,默认为 0 end                 buffer 转换的结束位置,默认为buffer长度 例子: 复制代码 代码如下: var b = new

  • javascript中Number对象的toString()方法分析

    本文实例讲述了toString()方法的定义和用法.分享给大家供大家参考.具体分析如下: 此方法可以把Number对象转换成字符串,并返回此字符串. 语法结构如下: 复制代码 代码如下: NumberObject.toString(radix) 参数列表: 参数 描述 radix 可选.规定表示数字的基数,使2 ~ 36 之间的整数.若省略该参数,则使用基数10.但是要注意,如果该参数是10以外的其他值,则ECMAScript标准允许实现返回任意值. 实例代码如下: 复制代码 代码如下: var

随机推荐