重载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 相关文章推荐
Grid得到选择行数据的方法总结
Jan 17 Javascript
jQuery探测位置的提示弹窗(toolTip box)详细解析
Nov 14 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
Mar 05 Javascript
JQuery创建DOM节点的方法
Jun 11 Javascript
CSS或者JS实现鼠标悬停显示另一元素
Jan 22 Javascript
jQuery操作cookie
Aug 08 Javascript
jQuery选择器实例应用
Jan 05 Javascript
React Native react-navigation 导航使用详解
Dec 01 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
Jun 28 Javascript
微信小程序实现发送验证码按钮效果
Dec 20 Javascript
Node.js控制台彩色输出的方法与原理实例详解
Dec 01 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
Nov 12 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的无限分类实现想法~
2007/01/02 PHP
如何实现php图片等比例缩放
2015/07/28 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
详解PHP+AJAX无刷新分页实现方法
2015/11/03 PHP
PHP数组的定义、初始化和数组元素的显示实现代码
2016/11/05 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
2018/06/01 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
2018/09/04 PHP
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
JavaScript实现点击自动选择TextArea文本的方法
2015/07/02 Javascript
JavaScript学习笔记之ES6数组方法
2016/03/25 Javascript
jquery ezUI 双击行记录弹窗查看明细的实现方法
2016/06/01 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
angularjs中ng-attr的用法详解
2016/12/31 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
2017/02/28 Javascript
Angular实现图片裁剪工具ngImgCrop实践
2017/08/17 Javascript
详解JS构造函数中this和return
2017/09/16 Javascript
总结js函数相关知识点
2018/02/27 Javascript
微信小程序实现自定义加载图标功能
2018/07/19 Javascript
微信小程序自定义键盘 内部虚拟支付
2018/12/20 Javascript
js实现小星星游戏
2020/03/23 Javascript
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
pytorch 自定义数据集加载方法
2019/08/18 Python
解决pycharm最左侧Tool Buttons显示不全的问题
2019/12/17 Python
Python cookie的保存与读取、SSL讲解
2020/02/17 Python
Pycharm中切换pytorch的环境和配置的教程详解
2020/03/13 Python
keras使用Sequence类调用大规模数据集进行训练的实现
2020/06/22 Python
微信小程序实现可实时改变转速的css3旋转动画实例代码
2018/09/11 HTML / CSS
linux下进程间通信的方式
2014/12/23 面试题
Servlet都有哪些方法?主要作用是什么?
2014/03/04 面试题
2014年国庆节寄语
2014/09/19 职场文书
全国法院系统开展党的群众路线教育实践活动综述(全文)
2014/10/25 职场文书
《雪地里的小画家》教学反思
2016/02/16 职场文书
四年级语文教学反思
2016/03/03 职场文书
HR必备:超全面的薪酬待遇管理方案!
2019/07/12 职场文书
2019关于实习生工作安排及待遇的管理方案!
2019/07/16 职场文书
MySQL基础(二)
2021/04/05 MySQL