重载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 运算数的求值顺序
Aug 23 Javascript
jQuery实现简单二级下拉菜单
Apr 12 Javascript
浅析javascript中的事件代理
Nov 06 Javascript
使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条
Jan 04 Javascript
详解使用fetch发送post请求时的参数处理
Apr 05 Javascript
浅谈ES6新增的数组方法和对象
Aug 08 Javascript
微信小程序实现保存图片到相册功能
Nov 30 Javascript
JAVA面试题 static关键字详解
Jul 16 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
Sep 16 Javascript
layui自定义工具栏的方法
Sep 19 Javascript
Vue可自定义tab组件用法实例
Oct 24 Javascript
Vue + ts实现轮播插件的示例
Nov 10 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
php5数字型字符串加解密代码
2008/04/24 PHP
php array_intersect()函数使用代码
2009/01/14 PHP
memcached 和 mysql 主从环境下php开发代码详解
2010/05/16 PHP
PHP中使用循环实现的金字塔图形
2014/11/08 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
如何利用PHP实现上传图片功能详解
2020/09/24 PHP
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
2010/09/17 Javascript
js获取网页高度(详细整理)
2012/12/28 Javascript
js日期、星座的级联显示代码
2014/01/23 Javascript
跟我学习javascript的undefined与null
2015/11/17 Javascript
Jquery Ajax Error 调试错误的技巧
2015/11/20 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
2015/11/25 Javascript
设置点击文本框或图片弹出日历控件的实现代码
2016/05/12 Javascript
浅析angularJS中的ui-router和ng-grid模块
2016/05/20 Javascript
JavaScript简单获取页面图片原始尺寸的方法
2016/06/21 Javascript
js 获取范围内的随机数实例代码
2016/08/02 Javascript
推荐三款不错的图片压缩上传插件(webuploader、localResizeIMG4、LUploader)
2017/04/21 Javascript
vue-cli初始化项目中使用less的方法
2018/08/09 Javascript
node.js连接mysql与基本用法示例
2019/01/05 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
2019/05/08 Javascript
vue中node_modules中第三方模块的修改使用详解
2019/05/31 Javascript
echarts饼图各个板块之间的空隙如何实现
2020/12/01 Javascript
用Python写冒泡排序代码
2016/04/12 Python
Python实现信用卡系统(支持购物、转账、存取钱)
2016/06/24 Python
Python 转义字符详细介绍
2017/03/21 Python
详解Python中最难理解的点-装饰器
2017/04/03 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
2017/12/09 Python
python3.x 将byte转成字符串的方法
2018/07/17 Python
解决tensorflow读取本地MNITS_data失败的原因
2020/06/22 Python
Python实现迪杰斯特拉算法过程解析
2020/09/18 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
英国外籍人士的在线超市:British Corner Shop
2019/06/03 全球购物
学校安全工作汇报材料
2014/08/16 职场文书
清明扫墓感想
2015/08/11 职场文书
Win11电脑显示本地时间与服务器时间不一致怎么解决?
2022/04/05 数码科技