在后端语言(如C#、Java)中,通常具备List类型,它是一种集合类型,能够放置某个类型的数据;它与数组(Array)相似,可是相对于数组,它又会有不少更加便捷的API,如:add、remove、clear等方法;后端
JavaScript中是没有原生的支持List类型的,因此你们在想要使用的时候,都会去本身封装一个类,而后去实现它,下面我也给出一种实现方式,这个实现知足了基本的API,并且是在JS Array类型的基础上扩展的,也能够在它上面使用Array的方法,另一大 亮点 是能够直接引用length属性得到集合的元素个数。数组
//兼容IE8-,为Array原型添加indexOf方法; if (!Array.prototype.indexOf) { Array.prototype.indexOf = function (item) { var index = -1; for (var i = 0; i < this.length; i++) { if (this[i] === item) { index = i; break; } } return index; } } //List类实现 var List = function (args) { var self = this; if (List.isArray(args)) { self = args; } self.constructor = List; //向集合追加新元素 self.add = function (item) { self.push(item); return self; }; //在指定索引处插入新元素 self.insert = function (index, item) { self.splice(index, 0, item); return self; }; //删除元素,仅删除第一个索引处的元素 self.remove = function (item) { var index = self.indexOf(item); if (index != -1) { return self.splice(index, 1)[0]; } else { return undefined; } }; //删除元素,若是元素在多个索引处存在,则所有删除 self.removeAll = function (item) { var result = []; var removeItem = undefined; do { removeItem = self.remove(item); if (removeItem !== undefined) { result.push(removeItem); } } while (removeItem !== undefined); return result; }; //根据index删除元素 self.removeAt = function (index) { if (index != -1) { return self.splice(index, 1)[0]; } else { return undefined; } }; //判断元素是否包含在集合中 self.contains = function (item) { return self.indexOf(item) != -1; }; //清空集合的全部元素 self.clear = function () { return new List(self.splice(0, self.length)); }; self.size = function () { return self.length; }; if (List.isArray(args)) { return self; } else if (arguments.length > 0) { for (var i = 0; i < arguments.length; i++) { self.add(arguments[i]); } } }; List.isArray = Array.isArray || function (target) { return Object.prototype.toString.call(target) === "[object Array]"; }; /*下面这段代码是关键,它设定了List类的原型是Array的原型(继承关系),因此List类也一样拥有Array的特征*/ List.prototype = Array.prototype;
这段代码仍是有改进的空间的,就是还能够添加一些其余的便捷方法,不过我就先实现到这里,后续的改进我会更新这段代码。this