集合是一种数据结构,用以表示非重复值的无序集合。集合的基础方法包括添加值、检测值是否在集合中,这种集合需要一种通用的实现,以保证操作效率。

  JavaScript的对象是属性名以及与之对应的值的基本集合。用JavaScript实现了一个通用的Set类,它实现了从js值到唯一字符串的映射,然后将字符串用做属性名。对象和函数都不具备如此简明可靠的唯一字符串表示。

  因此集合类必须给集合中的每一个对象或函数定义一个唯一的属性标识。

 //通用集合类
function Set(){ //这是一个构造函数
this.value={}; //集合数据保存在对象的属性里
this.n=0; //集合中值的个数
this.add.apply(this,arguments); //把所有参数都添加进这个集合
} //将每个参数都添加至集合
Set.prototype.add=function(){
for(var i=0;i<arguments.length;i++){ //遍历每个参数
var val=arguments[i]; //待添加到集合中的值
var str=Set._v2s(val); //把它转换为字符串
if(!this.value.hasOwnProperty(str)){ //如果不在集合中
this.value[str]=val; //将字符串和值对应起来
this.n++; //集合中值的计数
}
}
return this; //支持链式方法调用
} //从集合中删除元素,删除元素由参数指定
Set.prototype.remove=function(){
for(var i=0;i<arguments.length;i++){
var str=Set._v2s(arguments[i]);
if(this.values.hasOwnProperty(str)){
delete this.value[str];
this.n--;
}
}
return this;
} //遍历集合中的所有元素,在指定上下文中调用f
Set.prototype.foreach=function(f,context){
for(var s in this.values){
if(this.value.hasOwnProperty(s)) //忽略继承的属性
f.call(context,this.value[s]);
}
} //这是一个内部函数,用以将任意JavaScript值和唯一的字符串对应起来
Set._v2s=function(val){
switch(val){
case undefined: return 'u';
case null: return 'n';
case true: return 't';
case false: return 'f';
default: switch(typeof val){
case 'number': return '#'+val;
case 'string': return '"'+val;
default: return '@'+objectId(val);
}
} //对任意对象来说,都会返回一个字符串
//针对不同的对象,这个函数会返回不同的字符串
//对于同一个对象的多次调用,总是返回相同的字符串
//为了做到这一点,它给o创建了一个属性,在ES5中,这个属性是不可枚举且是只读
function objectId(o){
var prop="|**objectid**|"; //私有属性,用以存放id
if(!o.hasOwnProperty(prop)) //如果对象没有id
o[prop]=Set._v2s.next++; //将下一个值赋给它
return o[prop]; //返回这个id
}
};
Set._v2s.next=100; //设置初始id值

  来源于《JavaScript权威指南 9.6.1》

JavaScript实现通过的集合类的更多相关文章

  1. JavaScript学习笔记-自定义集合类

    //集合类Set( ES6标准才有的类,目前兼容性较差)//自定义集合类:extend = function (o,p){ //定义一个复制对象属性的类函数 for(var x in p){ o[x] ...

  2. javascript——集合类

    /** * Created by Administrator on 2015/4/14. */ function Set() { this.values = {}; this.n = 0; this. ...

  3. 学习javascript数据结构(三)——集合

    前言 总括: 本文讲解了数据结构中的[集合]概念,并使用javascript实现了集合. 原文博客地址:学习javascript数据结构(三)--集合 知乎专栏&&简书专题:前端进击者 ...

  4. javascript中一些常见的兼容性问题

    下面是一些Javascript的IE和Firefox(火狐)兼容性的常用例子 1. document.formName.item("itemName") 问题 说明:IE下,可以使 ...

  5. js/javascript代码注释规范与示例

    文件注释 文件注释位于文件的最前面,应包括文件的以下信息:概要说明及版本(必须)项目地址(开源组件必须)版权声明(必须)开源协议(开源组件必须)版本号(必须)修改时间(必须),以ISO格式表示(可使用 ...

  6. 使用javascript实现贪吃蛇游戏

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  7. Javascript 多浏览器兼容性问题及解决方案

    一.document.formName.item(”itemName”) 问题 问题说明:IE下,可以使用 document.formName.item(”itemName”) 或 document. ...

  8. 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!【转载+整理】

    原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructu ...

  9. 第九章:Javascript类和模块

    (过年了,祝大家新年好!) 第6章详细介绍了javascript对象,每个javascript对象都是一个属性集合,相互之间没有任何联系.在javascript中也可以定义对象的类,让每个对象都共享某 ...

随机推荐

  1. <canvas>drawImage()方法无法显示图片

    在书上看到用<canvas>绘制图像就动手试试,刚开始,我的代码是这样的: <!DOCTYPE html> <html> <head> <meta ...

  2. 体验了微信小程序,发现安卓用户终于把果粉“碾压”了一次

    今天早上,张小龙在微信公开课上分享了小程序的理念,并且公布了小程序将于1月9日上线. 为了体现张小龙对未来程序形态的理解,小程序有四个特定:无需安装.触手可及.用完即走.无需卸载.今天,36氪刚好有机 ...

  3. PHP制作查询租房表

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. Java 网络爬虫获取页面源代码

    原博文:http://www.cnblogs.com/xudong-bupt/archive/2013/03/20/2971893.html 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网 ...

  5. C#实现二维码功能,winform 以及 asp.net均可以用

    二维码现在用途很多,怎么用C#编程生成呢? 准备 ThoughtWorks.QRCode.dll 需要 一个类 QRCode,这个类专门来生成二维码的 using System; using Syst ...

  6. Java环境变量

    很简单的问题!配置Java环境变量 准备 下载安装Java,官方地址 打开系统环境变量,我的电脑右键 JAVA_HOME 添加JAVA_HOME,设置jdk安装目录,比如"C:\Progra ...

  7. markdown语法练习

    Markdown练习 这篇文章 主要用于练习markdown各种基本语法. 这篇文章 主要用于练习markdown各种基本语法. 1.标题设置 1.通过在文字下方添加"="或者&q ...

  8. 深入理解CSS Media媒体查询

    × 目录 [1]媒介类型 [2]媒体属性 [3]语法[4]方法 前面的话 一说到响应式设计,肯定离不开媒体查询media.一般认为媒体查询是CSS3的新增内容,实际上CSS2已经存在了,CSS3新增了 ...

  9. How to make a not-so-boring speech?

    For almost 26 years, even a trivial boy like me, have made over 100 and listened uncountable speeche ...

  10. 在Windows中安装NodeJS的正确姿势

    NodeJS已经非常流行了,而且可以预见他将继续受到追捧.这确实是一个不错的创举,想想看他现在能做什么吧 1.服务器程序(典型的就是用来做网站或者restful服务,主打就是多线程,非阻塞,最后,一个 ...