重载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 相关文章推荐
如何将php数组或者对象传递给javascript
Mar 20 Javascript
基于jQuery实现网页打印功能
Dec 01 Javascript
JS中生成随机数的用法及相关函数
Jan 09 Javascript
JS正则表达式比较常见用法
Jan 26 Javascript
js定时器实例分享
Dec 20 Javascript
BootStrap Fileinput的使用教程
Dec 30 Javascript
js手机号批量滚动抽奖实现代码
Apr 17 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
Mar 01 Javascript
React 子组件向父组件传值的方法
Jul 24 Javascript
vue2.0+ 从插件开发到npm发布的示例代码
Apr 28 Javascript
JS学习笔记之数组去重实现方法小结
May 29 Javascript
微信小游戏中three.js离屏画布的示例代码
Oct 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查询搜索引擎排名位置的代码
2010/01/05 PHP
php ftp文件上传函数(基础版)
2010/06/03 PHP
php的memcache类分享(memcache队列)
2014/03/26 PHP
php字符串截取函数mb_substr用法实例分析
2019/06/25 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
2019/10/08 PHP
JavaScript 继承的实现
2009/07/09 Javascript
Javascript Global对象
2009/08/13 Javascript
js常用排序实现代码
2010/12/28 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
网页中JS函数自动执行常用三种方法
2016/03/30 Javascript
JavaScript仿微博输入框效果(案例分析)
2016/12/06 Javascript
Ext JS 实现建议词模糊动态搜索功能
2017/05/13 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
2017/07/04 Javascript
react native带索引的城市列表组件的实例代码
2017/08/08 Javascript
微信小程序slider组件使用详解
2018/01/31 Javascript
微信小程序自定义多选事件的实现代码
2018/05/17 Javascript
Vue快速实现通用表单验证功能
2019/12/05 Javascript
JavaScript事件概念详解(区分静态注册和动态注册)
2021/02/05 Javascript
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
2016/04/13 Python
python实现多线程抓取知乎用户
2016/12/12 Python
Python中使用多进程来实现并行处理的方法小结
2017/08/09 Python
Python实现曲线点抽稀算法的示例
2017/10/12 Python
python3之模块psutil系统性能信息使用
2018/05/30 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
CSS3 制作旋转的大风车(充满童年回忆)
2013/01/30 HTML / CSS
应届生自我鉴定
2013/12/11 职场文书
国庆节文艺活动方案
2014/02/03 职场文书
出国英文推荐信
2014/05/10 职场文书
个人作风建设剖析材料
2014/10/11 职场文书
商超业务员岗位职责
2015/02/13 职场文书
MySQL数字类型自增的坑
2021/05/07 MySQL
Python 读写 Matlab Mat 格式数据的操作
2021/05/19 Python
spring项目中切面及AOP的使用方法
2021/06/26 Java/Android
spring注解 @PropertySource配置数据源全流程
2022/03/25 Java/Android