重载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 相关文章推荐
关于viewport,Ext.panel和Ext.form.panel的关系
May 07 Javascript
Domino中运用jQuery读取视图内容的方法
Oct 21 Javascript
JS实现鼠标滑过链接改变网页背景颜色的方法
Oct 20 Javascript
Webwork 实现文件上传下载代码详解
Feb 02 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
Sep 08 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
Dec 17 Javascript
浅谈JS中的常用选择器及属性、方法的调用
Jul 28 Javascript
vue.js实例对象+组件树的详细介绍
Oct 20 Javascript
jQuery实现的卷帘门滑入滑出效果【案例】
Feb 18 jQuery
jQuery实现checkbox全选、反选及删除等操作的方法详解
Aug 02 jQuery
vue.js实现双击放大预览功能
Jun 23 Javascript
微信小程序反编译的实现
Dec 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
基于PHP读取TXT文件向数据库导入海量数据的方法
2013/04/23 PHP
解析php中反射的应用
2013/06/18 PHP
兼容ie6浏览器的php下载文件代码分享
2014/07/14 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
让你的网站可编辑的实现js代码
2009/10/19 Javascript
JS事件Event元素(兼容IE,Firefox,Chorme)
2012/11/01 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
2014/03/07 Javascript
jQuery对html元素的取值与赋值实例详解
2015/12/18 Javascript
javascript实现简单的全选和反选功能
2016/01/05 Javascript
canvas实现钟表效果
2017/02/13 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
Angular.js中处理页面闪烁的方法详解
2017/03/09 Javascript
判断颜色是否合法的正则表达式(详解)
2017/05/03 Javascript
Vue实现用户自定义字段显示数据的方法
2018/08/28 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
vue.js实现简单购物车功能
2020/05/30 Javascript
基于Element封装一个表格组件tableList的使用方法
2020/06/29 Javascript
使用python获取CPU和内存信息的思路与实现(linux系统)
2014/01/03 Python
在Python程序和Flask框架中使用SQLAlchemy的教程
2016/06/06 Python
用python实现简单EXCEL数据统计的实例
2017/01/24 Python
详解用python自制微信机器人,定时发送天气预报
2019/03/25 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
解决pytorch下出现multi-target not supported at的一种可能原因
2021/02/06 Python
挪威太阳镜和眼镜网上商城:SmartBuyGlasses挪威
2016/08/20 全球购物
猫咪家具:CatsPlay
2018/11/03 全球购物
高级3D打印市场:Gambody
2019/12/26 全球购物
自我鉴定范文200字
2013/10/02 职场文书
青年志愿者事迹材料
2014/02/07 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
感恩教育月活动总结
2014/07/07 职场文书
2015年度校学生会工作总结报告
2015/05/23 职场文书
同学会感言
2015/07/30 职场文书
2016年大学生就业指导课心得体会
2015/10/09 职场文书
HTML基础详解(下)
2021/10/16 HTML / CSS