重载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 this调用规则说明
Mar 08 Javascript
分享XmlHttpRequest调用Webservice的一点心得
Jul 20 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
Feb 26 Javascript
js图片翻书效果代码分享
Aug 20 Javascript
JS原型链 详解及示例代码
Sep 06 Javascript
js中Number数字数值运算后值不对的解决方法
Feb 28 Javascript
jQuery实现所有验证通过方可提交的表单验证
Nov 21 jQuery
JS数组方法concat()用法实例分析
Jan 18 Javascript
将Vue组件库更换为按需加载的方法步骤
May 06 Javascript
js面试题之异步问题的深入理解
Sep 20 Javascript
vue.js Router中嵌套路由的实用示例
Jun 27 Vue.js
JavaScript流程控制(分支)
Dec 06 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
AM/FM收音机的安装与调试
2021/03/02 无线电
php的memcache类分享(memcache队列)
2014/03/26 PHP
Laravel中的chunk组块结果集处理与注意问题
2018/08/15 PHP
关于Aptana Studio生成自动备份文件的解决办法
2009/12/23 Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
2013/11/13 Javascript
JavaScript实现在标题栏上显示当前日期的方法
2015/03/19 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
JS+CSS实现类似QQ好友及黑名单效果的树型菜单
2015/09/22 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
2017/07/17 jQuery
Node.js 的模块知识汇总
2017/08/16 Javascript
js解决软键盘遮挡输入框的问题分享
2017/12/19 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
layer父页获取弹出层输入框里面的值方法
2019/09/02 Javascript
微信小程序实现简单文字跑马灯
2020/05/26 Javascript
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
python使用urllib2提交http post请求的方法
2015/05/26 Python
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
Django Highcharts制作图表
2016/08/27 Python
Django跨域请求问题的解决方法示例
2018/06/16 Python
django在保存图像的同时压缩图像示例代码详解
2020/02/11 Python
python之pygame模块实现飞机大战完整代码
2020/11/29 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
python如何用matplotlib创建三维图表
2021/01/26 Python
使用分层画布来优化HTML5渲染的教程
2015/05/08 HTML / CSS
美国电力供应商店/电气批发商:USESI
2018/10/12 全球购物
N.Peal官网:来自伦敦的高档羊绒品牌
2018/10/29 全球购物
澳大利亚珍珠首饰购物网站:Vayo Pearls
2019/03/11 全球购物
学生顶撞老师的检讨书
2014/09/17 职场文书
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
考试作弊检讨书
2014/10/21 职场文书
关于感谢信的范文
2015/01/23 职场文书
银行自荐信范文
2015/03/25 职场文书
汽车质检员岗位职责
2015/04/08 职场文书
董事长致辞
2015/07/29 职场文书
Python必备技巧之字符数据操作详解
2022/03/23 Python
CentOS7安装GlusterFS集群以及相关配置
2022/04/12 Servers