重载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 保存数组到Cookie的代码
Apr 14 Javascript
jquery解析xml字符串示例分享
Mar 25 Javascript
IE8中动态创建script标签onload无效的解决方法
Dec 22 Javascript
原生js模拟淘宝购物车项目实战
Nov 18 Javascript
JavaScript面向对象之私有静态变量实例分析
Jan 14 Javascript
jQuery实例—选项卡的简单实现(js源码和jQuery)
Jun 14 Javascript
手机端实现Bootstrap简单图片轮播效果
Oct 13 Javascript
jquery select2的使用心得(推荐)
Dec 04 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
May 07 Javascript
vue检测对象和数组的变化分析
Jun 30 Javascript
对vue 键盘回车事件的实例讲解
Aug 25 Javascript
JavaScript对象的特性与实践应用深入详解
Dec 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
获得Google PR值的PHP代码
2007/01/28 PHP
php中自定义函数dump查看数组信息类似var_dump
2014/01/27 PHP
PHP实现的方程求解示例分析
2016/11/11 PHP
jquery中的$(document).ready()与window.onload的区别
2009/11/18 Javascript
ExtJS 工具栏 分页事件参数
2010/03/05 Javascript
JQuery1.4+ Ajax IE8 内存泄漏问题
2010/10/15 Javascript
纯Javascript实现Windows 8 Metro风格实现
2013/10/15 Javascript
js实现的map方法示例代码
2014/01/13 Javascript
javascript检测浏览器的缩放状态实现代码
2014/09/28 Javascript
js 操作符汇总
2014/11/08 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
使用jquery操作session方法分享
2015/01/22 Javascript
javascript实现倒计时(精确到秒)
2015/06/26 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
2016/06/12 Javascript
bootstrap vue.js实现tab效果
2017/02/07 Javascript
JavaScript实现图片切换效果
2017/08/12 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
vue-cli 使用vue-bus来全局控制的实例讲解
2018/09/15 Javascript
element-ui的回调函数Events的用法详解
2018/10/16 Javascript
AngularJS实现的自定义过滤器简单示例
2019/02/02 Javascript
详解微信小程序自定义组件的实现及数据交互
2019/07/22 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
2019/10/26 Javascript
python实现代码行数统计示例分享
2014/02/10 Python
python脚本监控docker容器
2016/04/27 Python
离线安装Pyecharts的步骤以及依赖包流程
2020/04/23 Python
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
python IDLE添加行号显示教程
2020/04/25 Python
使用CSS3设计地图上的雷达定位提示效果
2016/04/05 HTML / CSS
css3实现二维码扫描特效的示例
2020/10/29 HTML / CSS
英国领先的电视购物零售商:Ideal World
2019/03/18 全球购物
世界上最大的铁人三项商店:Tri UK
2020/11/04 全球购物
编程输出如下图形
2013/11/24 面试题
农村党支部书记党群众路线四风问题整改措施
2014/09/26 职场文书
购房个人委托书范本
2014/10/11 职场文书
游戏《东方异文石:爱亚利亚黎明》正式版发布
2022/04/03 其他游戏