重载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文本框中的事件应用以输入邮箱为例
May 06 Javascript
jquery ezUI 双击行记录弹窗查看明细的实现方法
Jun 01 Javascript
学习Javascript闭包(Closure)知识
Aug 07 Javascript
jQuery联动日历的实例解析
Dec 02 Javascript
JS实现超简单的汉字转拼音功能示例
Dec 22 Javascript
详解前端构建工具gulpjs的使用介绍及技巧
Jan 19 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
May 17 Javascript
详解Webpack + ES6 最新环境搭建与配置
Jun 04 Javascript
在 Vue.js中优雅地使用全局事件的方法
Feb 01 Javascript
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
May 18 Javascript
微信小程序自定义联系人弹窗
May 26 Javascript
解决Vue大括号字符换行踩的坑
Nov 09 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中json_decode()和json_encode()的使用方法
2012/06/04 PHP
php顺序查找和二分查找示例
2014/03/27 PHP
PHP生成json和xml类型接口数据格式
2015/05/17 PHP
thinkPHP引入类的方法详解
2016/12/08 PHP
兼容Mozilla必须知道的知识。
2007/01/09 Javascript
ExtJS 2.0实用简明教程 之Ext类库简介
2009/04/29 Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
2013/01/11 Javascript
AngularJS中取消对HTML片段转义的方法例子
2015/01/04 Javascript
探讨JavaScript中的Rest参数和参数默认值
2015/07/29 Javascript
windows下安装nodejs及框架express
2015/08/07 NodeJs
实例代码详解javascript实现窗口抖动及qq窗口抖动
2016/01/04 Javascript
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
jQuery中通过ajax调用webservice传递数组参数的问题实例详解
2016/05/20 Javascript
ES6中的箭头函数实例详解
2017/04/06 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
基于ionic实现下拉刷新功能
2018/05/10 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
layer.prompt输入层的例子
2019/09/24 Javascript
通过实例了解Render Props回调地狱解决方案
2020/11/04 Javascript
详解Python3中yield生成器的用法
2015/08/20 Python
Python 使用requests模块发送GET和POST请求的实现代码
2016/09/21 Python
python实现自动登录后台管理系统
2018/10/18 Python
linux安装python修改默认python版本方法
2019/03/31 Python
在线学习西班牙语、法语或其他语言:Babbel.com
2018/02/07 全球购物
DNA基因检测和分析:23andMe
2019/05/01 全球购物
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
二手书店创业计划书
2014/01/16 职场文书
保健品市场营销方案
2014/03/31 职场文书
反对四风自我剖析材料
2014/10/07 职场文书
乡镇计划生育工作汇报
2014/10/28 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书
幼儿园春季开学通知
2015/07/16 职场文书
《玩出了名堂》教学反思
2016/02/17 职场文书
python 模块重载的五种方法
2021/04/24 Python
vue实现水波涟漪效果的点击反馈指令
2021/05/31 Vue.js
使用refresh_token实现无感刷新页面
2022/04/26 Javascript