重载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 相关文章推荐
jQuery中使用Ajax获取JSON格式数据示例代码
Nov 26 Javascript
JS自调用匿名函数具体实现
Feb 11 Javascript
javascript自定义的addClass()方法
May 28 Javascript
Javascript中数组方法汇总(推荐)
Apr 01 Javascript
jQuery progressbar通过Ajax请求实现后台进度实时功能
Oct 11 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
Mar 15 Javascript
vue v-model表单控件绑定详解
May 17 Javascript
iconfont的三种使用方式详解
Aug 05 Javascript
微信小程序实现发送模板消息功能示例【通过openid推送消息给用户】
May 05 Javascript
JavaScript获取某一天所在的星期
Sep 05 Javascript
解决layui使用layui-icon出现默认图标的问题
Sep 11 Javascript
element-ui 实现响应式导航栏的示例代码
May 08 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自动生成后台导航网址的最佳方法
2013/08/27 PHP
php缓冲 output_buffering和ob_start使用介绍
2014/01/30 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
js 实现无缝滚动 兼容IE和FF
2009/07/15 Javascript
JavaScript打字小游戏代码
2011/12/26 Javascript
DOM2非标准但却支持很好的几个属性小结
2012/01/21 Javascript
jquery高效反选具体实现
2013/05/05 Javascript
JS常见问题整理(持续更新)
2013/08/06 Javascript
JQuery对class属性的操作实现按钮开关效果
2013/10/11 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
JavaScript时间转换处理函数
2015/04/14 Javascript
jquery实现的代替传统checkbox样式插件
2015/06/19 Javascript
jQuery时间轴插件使用详解
2015/07/16 Javascript
如何防止INPUT按回车自动提交表单FORM
2016/12/06 Javascript
js+html制作简单验证码
2017/02/16 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
2018/02/22 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
p5.js 毕达哥拉斯树的实现代码
2018/03/23 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
2019/09/21 Javascript
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
vue使用原生swiper代码实例
2020/02/05 Javascript
js实现扫雷源代码
2020/11/27 Javascript
[06:53]2018DOTA2国际邀请赛寻真——为复仇而来的Newbee
2018/08/15 DOTA
python操作mysql数据库
2017/03/05 Python
基于Python实现的ID3决策树功能示例
2018/01/02 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
Python实现简易过滤删除数字的方法小结
2019/01/09 Python
django和flask哪个值得研究学习
2020/07/31 Python
基于IE10/HTML5 开发
2013/04/22 HTML / CSS
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
JavaScript实现前端网页版倒计时
2021/03/24 Javascript
十佳美德少年事迹材料
2014/02/05 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书