日期:2014-05-16  浏览次数:20414 次

由实现JavaScript中的Map想到的

项目中要用到JavaScript中的Map数据类型,它不像JDK那样有自带的,怎么办?搜了找到一个不错的(http://darkmasky.iteye.com/blog/454749)。用这个可以满足项目中要求。在找的过程中,发现这么个轻量级的实现。http://www.iteye.com/topic/196610帖子中,二楼myy的回复内容。应该说这个简单地实现可以满足我的一些需求,但它少了size方法。

?

在这个简单实现的基础上,自己能不能加一个size方法呢?而不地通过封装Array那样的重量级实现。

?

围绕这个问题,仔细想想还是有点嚼头儿的。

1, ?JavaScript中“var map = {}” 这样的声明,实质上是什么?是不是等价于“ar map = new Object()”不?

2, ?如果像问题1描述那样,是等价的。应该可以通过给Object类prototype地增加size方法。不过这个size方法怎么实现?

3, ?Size方法的实现,不外乎两种模式:遍历式和注册式。

a) ? ? ? ? 遍历式:实现起来简单,其思想是,每调用size方法时,遍历Object中的属性,算出其属性(关于属性还有一个问题,见下面的讨论)个数。可以看出,这样的实现其执行效率很低。

b) ? ? ? ? 注册式:实现思想是,先给Object加一个名为elementSize的属性,在通过map["key1"] = "Value1"方式往Object中另加属性时,通过某种机制自动地增长这个elementSize。如何在map["key1"] = "Value1"执行后,恰当地自增长elementSize?是个问题。毕竟不能像AOP那样地给map["key1"] = "Value1"操作再加一个回调函数。

c) ? ? ? ? 不论是遍历式还是注册式,它们有一个共性问题,就是如何区分开Object原有的属性和通过map["key1"] = "Value1"方式新加的属性?Object原有的属性又有哪些?

4, ?经过3的思考,感觉可以参考JavaScript中Array类的实现,那么这个Array是怎么实现的?能不能像看JDK中的ArrayList那样地看这个Array的源码?

5, ?既然有Array,为什么当初设计JavaScript时,没有把Map的实现加进来?