重载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 相关文章推荐
给artDialog 5.02 增加ajax get功能详细介绍
Nov 13 Javascript
js解决弹窗问题实现班级跳转DIV示例
Jan 06 Javascript
javascript模拟post提交隐藏地址栏的参数
Sep 03 Javascript
JS基于Mootools实现的个性菜单效果代码
Oct 21 Javascript
jquery判断iPhone、Android设备类型
Sep 14 Javascript
一个极为简单的requirejs实现方法
Oct 20 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
Mar 09 Javascript
详谈JS中数组的迭代方法和归并方法
Aug 11 Javascript
jQuery EasyUI Layout实现tabs标签的实例
Sep 26 jQuery
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
Oct 24 Javascript
AJAX检测用户名是否存在的方法
Mar 24 Javascript
Vue.js中v-for指令的用法介绍
Mar 13 Vue.js
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中输出转义JavaScript代码的实现代码
2011/04/22 PHP
理解PHP中的stdClass类
2014/04/18 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
2014/10/16 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
2014/12/01 PHP
php遍历目录方法小结
2015/03/10 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
2016/10/11 PHP
在 Laravel 6 中缓存数据库查询结果的方法
2019/12/11 PHP
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
JavaScript让IE浏览器event对象符合W3C DOM标准
2009/11/24 Javascript
jQuery实现批量判断表单中文本框非空的方法(2种方法)
2015/12/09 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
详解如何使用Node.js编写命令工具——以vue-cli为例
2017/06/29 Javascript
layer.confirm取消按钮绑定事件的方法
2018/08/17 Javascript
webpack中如何使用雪碧图的示例代码
2018/11/11 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
javascript防抖函数debounce详解
2019/06/11 Javascript
微信小程序实现多选框功能的实例代码
2020/06/24 Javascript
[53:52]OG vs EG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
python爬取网站数据保存使用的方法
2013/11/20 Python
利用python实现简单的邮件发送客户端示例
2017/12/23 Python
用Eclipse写python程序
2018/02/10 Python
python 识别图片中的文字信息方法
2018/05/10 Python
python实现彩色图转换成灰度图
2019/01/15 Python
Django微信小程序后台开发教程的实现
2020/06/03 Python
Python3爬虫中pyspider的安装步骤
2020/07/29 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
HTML5 visibilityState属性详细介绍和使用实例
2014/05/03 HTML / CSS
初中家长评语大全
2014/12/26 职场文书
2015年司法局工作总结
2015/05/22 职场文书
就业推荐表院系意见
2015/06/05 职场文书
小时代观后感
2015/06/10 职场文书
Python基础之数据结构详解
2021/04/28 Python
SQL Server使用T-SQL语句批处理
2022/05/20 SQL Server