重载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 相关文章推荐
js不完美解决click和dblclick事件冲突问题
Jul 16 Javascript
javascript实现简单的ajax封装示例
Dec 28 Javascript
JS数组搜索之折半搜索实现方法分析
Mar 27 Javascript
完美解决UI-Grid表格元素中多个空格显示为一个空格的问题
Apr 25 Javascript
vue.js获取数据库数据实例代码
May 26 Javascript
jQuery结合jQuery.cookie.js插件实现换肤功能示例
Oct 14 jQuery
详细分析jsonp的原理和实现方式
Nov 20 Javascript
基于AngularJs select绑定数字类型的问题
Oct 08 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
Sep 11 Javascript
JS实现吸顶特效
Jan 08 Javascript
谈谈JavaScript中的垃圾回收机制
Sep 17 Javascript
基于p5.js 2D图像接口的扩展(交互实现)
Nov 30 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
PHP模拟SQL Server的两个日期处理函数
2006/10/09 PHP
php+mysql数据库实现无限分类的方法
2014/12/12 PHP
php一个文件搞定微信jssdk配置
2016/12/12 PHP
详解php中serialize()和unserialize()函数
2017/07/08 PHP
雄兵连第三季海报曝光,艾妮熙德成主角,蔷薇新造型
2021/03/09 国漫
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
jquery操作angularjs对象
2015/06/26 Javascript
JavaScript生成SQL查询表单的方法
2015/08/13 Javascript
基于Javascript实现倒计时功能
2016/02/22 Javascript
bootstrapfileinput实现文件自动上传
2016/11/08 Javascript
jQuery插件imgAreaSelect基础讲解
2017/05/26 jQuery
vue-router 组件复用问题详解
2018/01/22 Javascript
JS实现集合的交集、补集、差集、去重运算示例【ES5与ES6写法】
2019/02/18 Javascript
微信小程序通过js实现瀑布流布局详解
2019/08/28 Javascript
vue实现浏览器全屏展示功能
2019/11/27 Javascript
详解vue 组件注册
2020/11/20 Vue.js
[31:00]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS iG
2014/05/25 DOTA
[02:15]2014DOTA2国际邀请赛 专访LGD.lin小兔子是大腿
2014/07/14 DOTA
详解Python中的分组函数groupby和itertools)
2018/07/11 Python
如何导出python安装的所有模块名称和版本号到文件中
2020/06/05 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
Python获取浏览器窗口句柄过程解析
2020/07/25 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
来自圣地亚哥的实惠太阳镜:Knockaround
2018/08/27 全球购物
毕业生机械建模求职信
2013/10/14 职场文书
大一新生学期自我评价
2014/04/09 职场文书
骨干教师培训方案
2014/05/06 职场文书
幼儿园小班见习报告
2014/10/31 职场文书
兵马俑的导游词
2015/02/02 职场文书
大班上学期个人总结
2015/02/13 职场文书
春节随笔
2015/08/15 职场文书
2016保送生自荐信范文
2016/01/29 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
五年级作文之劳动作文
2019/11/12 职场文书