重载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简单实现鼠标经过导航条改变背景图
Dec 17 Javascript
Jquery实现顶部弹出框特效
Aug 08 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
Nov 07 Javascript
基于JQuery的购物车添加删除以及结算功能示例
Mar 08 Javascript
使用JavaScript根据图片获取条形码的方法
Jul 04 Javascript
redux中间件之redux-thunk的具体使用
Apr 17 Javascript
vue-cli3脚手架的配置及使用教程
Aug 28 Javascript
Node.js Stream ondata触发时机与顺序的探索
Mar 08 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
Sep 06 Javascript
layui监听单元格编辑前后交互的例子
Sep 16 Javascript
vant picker+popup 自定义三级联动案例
Nov 04 Javascript
vue实现验证用户名是否可用
Jan 20 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使用PHPMailer发送邮件的简单使用方法
2013/11/12 PHP
php实现可以设置中奖概率的抽奖程序代码分享
2014/01/19 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
2014/02/13 PHP
PHP判断远程图片是否存在的几种方法
2014/05/04 PHP
JSON字符串传到后台PHP处理问题的解决方法
2016/06/05 PHP
Laravel监听数据库访问,打印SQL的例子
2019/10/24 PHP
Thinkphp5框架中引入Markdown编辑器操作示例
2020/06/03 PHP
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
IE浏览器不支持getElementsByClassName的解决方法
2014/08/27 Javascript
js对象基础实例分析
2015/01/13 Javascript
javascript简单判断输入内容是否合法的方法
2016/05/11 Javascript
在 webpack 中使用 ECharts的实例详解
2018/02/05 Javascript
layer弹出层父子页面事件相互调用方法
2018/08/17 Javascript
微信小程序提取公用函数到util.js及使用方法示例
2019/01/10 Javascript
Vue Element UI + OSS实现上传文件功能
2019/07/31 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
2019/09/03 jQuery
解决layui的input独占一行的问题
2019/09/10 Javascript
vue 解决数组赋值无法渲染在页面的问题
2019/10/28 Javascript
[59:44]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 paiN vs iG
2018/03/31 DOTA
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
Python环境Pillow( PIL )图像处理工具使用解析
2019/09/12 Python
利用python实现凯撒密码加解密功能
2020/03/31 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
Python错误的处理方法
2020/06/23 Python
我的五年职业生涯规划
2014/01/23 职场文书
两只小狮子教学反思
2014/02/05 职场文书
团拜会策划方案
2014/06/07 职场文书
布达拉宫导游词
2015/02/02 职场文书
班主任培训研修日志
2015/11/13 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书
导游词之四川熊猫基地
2020/01/13 职场文书
SQL Server #{}可以防止SQL注入
2022/05/11 SQL Server
redis lua限流算法实现示例
2022/07/15 Redis
利用Python脚本写端口扫描器socket,python-nmap
2022/07/23 Python