重载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 相关文章推荐
WEB高性能开发之疯狂的HTML压缩
Jun 19 Javascript
jquery select多选框的左右移动 具体实现代码
Jul 03 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
Jun 24 Javascript
详解Bootstrap的aria-label和aria-labelledby应用
Jan 04 Javascript
jQuery制作input提示内容(兼容IE8以上)
Jul 05 jQuery
react-native ListView下拉刷新上拉加载实现代码
Aug 03 Javascript
vue-cli项目中使用Mockjs详解
May 14 Javascript
js实现每日签到功能
Nov 29 Javascript
原生JS实现随机点名项目的实例代码
Apr 30 Javascript
Vue+Express实现登录状态权限验证的示例代码
May 05 Javascript
详解vuex的简单todolist例子
Jul 14 Javascript
vuex实现数据状态持久化
Nov 11 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
日本十大惊悚动漫
2020/03/04 日漫
PHP垃圾回收机制简单说明
2010/07/22 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
分享php邮件管理器源码
2016/01/06 PHP
微信公众号开发之语音消息识别php代码
2016/08/08 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
2019/05/06 PHP
js substr、substring和slice使用说明小记
2011/09/15 Javascript
JS隐藏参数post传值实例
2013/04/18 Javascript
jquery实现的淡入淡出下拉菜单效果
2015/08/25 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
JavaScript编写九九乘法表(两种任选)
2017/02/04 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
面包屑导航详解
2017/12/07 Javascript
VS Code转换大小写、修改选中文字或代码颜色的方法
2017/12/15 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
webpack4.x CommonJS模块化浅析
2018/11/09 Javascript
Koa日志中间件封装开发详解
2019/03/09 Javascript
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
js实现拖拽元素选择和删除
2020/08/25 Javascript
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
python迭代器的使用方法实例
2013/11/21 Python
python实现带错误处理功能的远程文件读取方法
2015/04/29 Python
Python实现求最大公约数及判断素数的方法
2015/05/26 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
Pyqt QImage 与 np array 转换方法
2019/06/27 Python
Python range、enumerate和zip函数用法详解
2019/09/11 Python
Python读写文件模式和文件对象方法实例详解
2019/09/17 Python
在django admin中配置搜索域是一个外键时的处理方法
2020/05/20 Python
Python collections.defaultdict模块用法详解
2020/06/18 Python
离婚协议书范本及离婚须知
2014/10/15 职场文书
授权委托书协议书
2014/10/16 职场文书
2015年试用期工作总结
2014/12/12 职场文书