重载toString实现JS HashMap分析


Posted in Javascript onMarch 13, 2011

不过请仔细对比一下,你会发现其中差别还是很大的。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)

Javascript 相关文章推荐
一种JavaScript的设计模式
Nov 22 Javascript
jQuery EasyUI API 中文文档 - EasyLoader 加载器
Sep 29 Javascript
引用外部js乱码问题分析及解决方案
Apr 12 Javascript
js网页实时倒计时精确到秒级
Feb 10 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
Jul 08 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
Jun 21 Javascript
JS中原始值和引用值的储存方式示例详解
Mar 23 Javascript
JS实现520 表白简单代码
May 21 Javascript
Vue.js 利用v-for中的index值实现隔行变色
Aug 01 Javascript
elementUI table表格动态合并的示例代码
May 15 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
Jul 12 Javascript
JavaScript异步操作的几种常见处理方法实例总结
May 11 Javascript
JavaScript获取页面上某个元素的代码
Mar 13 #Javascript
jQuery hover 延时器实现代码
Mar 12 #Javascript
js中if语句的几种优化代码写法
Mar 12 #Javascript
鼠标事件延时切换插件
Mar 12 #Javascript
autoIMG 基于jquery的图片自适应插件代码
Mar 12 #Javascript
再谈javascript图片预加载技术(详细演示)
Mar 12 #Javascript
在jQuery1.5中使用deferred对象 着放大镜看Promise
Mar 12 #Javascript
You might like
在Javascript中为String对象添加trim,ltrim,rtrim方法
2006/09/22 Javascript
JQuery 无废话系列教程(二) jquery实战篇上
2009/06/23 Javascript
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
jquery实现动态画圆
2014/12/04 Javascript
JavaScript实现弹出模态窗体并接受传值的方法
2016/02/12 Javascript
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
Vue中控制v-for循环次数的实现方法
2018/09/26 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
微信小程序获取用户信息及手机号(后端TP5.0)
2019/09/12 Javascript
layui实现根据table数据判断按钮显示情况的方法
2019/09/26 Javascript
JS实现简单省市二级联动
2019/11/27 Javascript
python多重继承新算法C3介绍
2014/09/28 Python
python 数据的清理行为实例详解
2017/07/12 Python
python django 增删改查操作 数据库Mysql
2017/07/27 Python
Python之读取TXT文件的方法小结
2018/04/27 Python
对python生成业务报表的实例详解
2019/02/03 Python
Python批量启动多线程代码实例
2020/02/18 Python
10张动图学会python循环与递归问题
2021/02/06 Python
详解Canvas事件绑定
2018/06/27 HTML / CSS
HTML5教程之html 5 本地数据库(Web Sql Database)
2014/04/03 HTML / CSS
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
使用phonegap播放音频的实现方法
2017/03/31 HTML / CSS
从零实现一个自定义html5播放器的示例代码
2017/08/01 HTML / CSS
法律专业推荐信范文
2013/11/29 职场文书
法学函授自我鉴定
2014/02/06 职场文书
求职自荐信怎么写
2014/03/06 职场文书
同事去世追悼词
2015/06/23 职场文书
在Windows下安装配置CPU版的PyTorch的方法
2021/04/02 Python
关于Python中*args和**kwargs的深入理解
2021/08/07 Python
redis调用二维码时的不断刷新排查分析
2022/04/01 Redis
Python+DeOldify实现老照片上色功能
2022/06/21 Python
PostgreSQL怎么创建分区表详解
2022/06/25 PostgreSQL
win10电脑双屏显示一个黑屏怎么办?win10电脑双屏显示一个黑屏解决方法
2022/07/15 数码科技