由实现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的实现加进来?
由实现JavaScript中的Map想到的的更多相关文章
- ES6新特性:Javascript中的Map和WeakMap对象
Map对象 Map对象是一种有对应 键/值 对的对象, JS的Object也是 键/值 对的对象 : ES6中Map相对于Object对象有几个区别: 1:Object对象有原型, 也就是说他有默认的 ...
- JavaScript中的Map
1.首先,在新版本的浏览器中,已经实现了对Map的原生支持:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Glob ...
- JavaScript 中的 Map
很多编程语言中都有类似Map这种 键-值对 的数据结构. 可惜,JavaScript没有. 幸运的是,可以自己构建一个Map对象. 对象的定义 <script type="text/j ...
- JavaScript中数组map()方法
JavaScript 数组map()方法创建一个新的数组使用调用此数组中的每个元素上所提供的函数的结果.语法 ? 1 array.map(callback[, thisObject]); 下面是参数的 ...
- JavaScript中的Map和Set
JavaScript的默认对象表示方法{}可以视为其他语言中的Map或者Dictionary的数据结构,即一组键值对. 但是JavaScript的对象有个小问题,就是键必须是字符串,但实际上Numbe ...
- JavaScript中的map方法
假设有一个函数f(x)=x²;作用在一个数组[1,2,3,4,5,6,7,8,9],通常我们会用遍历的方法来实现. function f(x){ return x * x; } var arr = [ ...
- javascript中使用Map
mis.comm.js.Map = function() { this.elements = new Array(); //获取MAP元素个数 this.size = function() { ret ...
- javascript中的map和reduce
今天在看“廖雪峰官方网站”的js教程时,看到了map和reduce.其中有一个练习题是:不使用js内置的parseInt()函数,利用map和reduce操作实现一个string2int()函数(先将 ...
- JavaScript中的Map、Set及其遍历
Map Map是一组键值对的结构,具有极快的查找速度. Map的定义. //空map设值key-value var m = new Map(); m.set("XiaoMing", ...
随机推荐
- Files
write public static void write(CharSequence from, File to, Charset charset) throws IOException { asC ...
- os和os.path模块
Os和os.path模块函数 1. Os模块 函数 描述 文件处理 Mkfifo()/mknod() 创建命名管道/创建文件系统节点 Remove()/unlink() 删除文件 Renam ...
- 解决Socket.IO在IE8下触发disconnect时间过长
本文地址: http://www.cnblogs.com/blackmanba/p/solve-socketIO-IE8-emit-disconnect-too-long.html或者http://f ...
- (转)QR二维码生成及原理
二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字, ...
- ado无法访问数据库问题
现象:以ADO方式访问数据库的C++程序,在一台计算机上能访问成功,在另一台计算机上却访问不成功,报告不能连接错误,并且这两台计算机都装有ado. 原因:ado版本不对 解决方案:下载KB983246 ...
- EventSource (node.js 与 OC)
node.js服务器代码: var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, ...
- 转】MyEclipse使用总结——修改MyEclipse默认的Servlet和jsp代码模板
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/3769058.html 感谢! 一.修改Servlet的默认模板代码 使用MyEclipse创建Servlet时, ...
- Struts ForwardAction Example
In Struts MVC model, you have to go thought the Action Controller to get a new view page. In some ca ...
- lambda表达式和ef的语句转化
这两者转化可以用linqpad进行转化, 首先推荐一个网站可以了解一下orderby的排序方式 http://www.csharpwin.com/csharpspace/614.shtml 然后下面有 ...
- Linux下安装protobuf并实现简单的客户端服务器端通信
http://code.google.com/p/protobuf/downloads/list上可以下载Protobuf的源代码. 安装步骤如下所示: 1>tar -xzf protobuf- ...