重载toString轻松实现JSHashMap

作者:小菜 更新时间:2025-02-25 点击数:
简介:用过Java的都知道,里面有个功能强大的数据结构——HashMap,它能提供键与值的对应访问。

不过熟悉JS的朋友也会说,JS里面到处都是hashmap,因为每个

【菜科解读】

用过Java的都知道,里面有个功能强大的数据结构——HashMap,它能提供键与值的对应访问。

不过熟悉JS的朋友也会说,JS里面到处都是hashmap,因为每个对象都提供了map[key]的访问形式。

不过请仔细对比一下,你会发现其中差别还是很大的。

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方法就不一定了,它也许每次返回都不一样的值。

所以运用的时候,要根据实际情况做相应的调整。

重载,toString,轻松,实现,JSHashMap,用过

世界上最深的地下洞穴:墨西哥燕子洞 轻松装下帝国大厦

墨西哥燕子洞是世界上最深最大的地下洞穴,墨西哥燕子洞的深度已经达到了426米,这是一种什么概念呢?美国纽约的帝国大厦高度大概在381米,将整座帝国大厦放到墨西哥燕子洞里面都是绰绰有余的,很多户外探险的爱好者对于这里更是由衷的爱慕,下面让我们一起去探秘墨西哥燕子洞吧。

墨西哥燕子洞:墨西哥中部的燕子洞深达1400英尺(约426米),是世界上最深最大的洞穴之一。

它是如此深邃,可以容纳下整座美国纽约帝国大厦(381米)。

燕子洞也因此得了一个“大洞”的外号。

墨西哥燕子洞探险:为了替英国广播公司科学系列片《行星地球》拍摄世界各地从未有人探索过的深邃洞穴,一名勇敢的探险者只在头上绑上一个摄像机、在背上系上一个降落伞,就奋不顾身地纵身跳下了世界上最大的洞穴之一——深达约426米的墨西哥燕子洞。

英国广播公司为了拍摄科学系列片《行星地球》,对地球上许多著名的洞穴进行了探索,其中就包括墨西哥的燕子洞。

令人震惊的是,为了能够拍摄到燕子洞内的神奇风景,一名电视台探险者竟然只在后背系上一个降落伞,就勇敢地纵身跳下这一深达426米深的黑暗洞穴。

这名探险者的头上绑着一个摄像机,在他纵身跳进黑暗洞穴时,摄像机将开始拍摄洞内的情景。

在5秒钟的自由落体降落后,这名探险者打开背上的降落伞,安全地降落在燕子洞底部一个27米长、10米宽的平台上。

燕子洞内栖居着成千上万只蝙蝠和燕子,这也正是“燕子洞”得名的真相。

因此,当这名探险者落地后,不得不降落在深达2米的鸟粪山上。

这名勇敢跳向“地球中心”的探险者,跳到洞底的过程不足一分钟,然而当他探索完洞穴后,却需要花整整两小时时间,才干沿着一根绳索艰难地爬出这个很大的深坑。

拓展:惊艳世人的迷人地下洞穴1.猛犸洞猛犸洞是世界上最长的洞穴,位于美国肯塔基州中部的猛犸洞国家公园,是世界自然遗产之一。

猛犸洞以古时候长毛巨象猛犸命名,这个“巨无霸”洞穴截至2006年,已探出的长度近600公里,究竟有多长,至今仍在探索。

二百多年来,探险家的前赴后继,他们的探索精神已被镂刻在猛犸洞每一公里的发现史上。

2.拉斯科岩洞拉斯科岩洞于1940年9月12日被4个孩子偶然发现。

1963年法国zheng府已基本将山洞关闭,公众不得入内参观。

只有科学家和获准的少数人能在洞内逗留,且每周只开放5天,每天限入5人。

1983年起,忠于原作、足可以假乱真的复制品拉斯科洞穴壁画2号问世,每年接待游客达25万人次以上。

3.钻石洞钻石洞位于美国肯塔基州,其最吸引游人的所在便是方解石垂悬结构。

因其外观酷似熏肉,人们形象地将它们称之为“洞穴熏肉”。

熏肉是猪肉食品家族中最万能同时也最美味的成员之一,采纳这个名字似乎有向熏肉表达敬意的意思。

在描述洞内的层状流石时,“洞穴熏肉”显然是另一个更为恰当而形象的选择。

层状流石由水传播的矿物质沿着一条重复路线不断沉积而成。

表面降雨量变化、矿物质含量平衡以及其它水文学和洞穴现象都能影响流石上方水的移动速度以及矿物质含量,最后造就了让人联想到熏肉的层状结构。

推荐阅读:直达地狱的梅尔洞穴俄罗斯神奇坑洞谜团重庆鬼洞会是白莲教避难之所吗?阿苏伊尔幽谷 神奇无底洞两次探险未果印尼爪哇谷洞吃人谜团 谷洞会是时光隧道吗?

世界上最强大的男人,轻松举起5000公斤的物体 堪比绿巨人

美国漫威系列电影中,绿巨人给人留下非常深刻的印象,也认为是最强大的超级英雄,而在巴基斯坦有人自诩世界上最强大的男人,有着能够媲美绿巨人的大块肌肉,也有庞大的体格,还有那令人畏惧的力量,这一系列都能够证明其有让人望尘莫及的能力,可能真的只有传说中的绿巨人能够跟其并论。

世界上最强大的男人——Arbab Khizer Hayat在伊朗的邻国巴基斯坦,也有着可以和绿巨人"媲美"的大块头——Arbab Khizer Hayat,体重436公斤的他自诩世界上最强大的男人。

由于粗壮的身体和一些令人印象深刻的壮举,这哥们已经在互联网上声名鹊起。

在互联网上广为流传的视频里,这老哥单手就拖住了拖拉机和小汽车,而且毫不费力,看起来就像拎着一只小鸡那样轻松。

但这显然不是他取得的最亮眼成就,面对蜂拥而至的记者,Hayat老哥表示,早在2012年日本的一个举重比赛上,他一下子举起了5000公斤。

他越说越兴奋,继续吹嘘道:"没人能打破我的记录,只有真正的绿巨人才干挑战我。

"现年25岁的Hayat是个富二代。

18岁以前的身材还是属正常。

但之后并没像其他少年一样停止变壮,他发现自己体态的发育速度停不下来。

不过身高没咋长,整个人越来越宽,像个充了气的皮球。

加入收藏
               

重载toString轻松实现JSHashMap

点击下载文档

格式为doc格式

  • 账号登录
社交账号登录