javascript 王者归来一书里的一段Array扩展
最近在看这本书,感觉很不错。建议想学js的童鞋买本看看。
//any是一个集合迭代函数,它接受一个闭包作为参数 //当集合中的任何一个元素调用闭包的结果返回非false时,any()返回计算结果,否则返回false Array.prototype.any = function(closure,_set){ //第二个参数是一个处理计算结果的集合 //这么设计的止的是为了在each方法中重用any _set = _set || false; //如果closure参数未定义 if(typeof closure == 'undefined'){ //规定为返回数组元素自身的值的函数 closure = function(x){return x}; }; //如果closure参数不是函数 if(typeof closure != 'function'){ //那么它应该被转换成返回这个值的一个函数 var c = closure; closure = function(x){return x == c}; }; //将第3个开始的参数转换为数组,因为这些值也将作为迭代调用时的参数 var args = Array.apply(this,arguments).slice(2); //循环遍历数组中的每一个元素 for(var i=0;i<this.length;i++){ //以自定义的参数和数组的下标i为参数调用closure参数引用的闭包 var rval = closure.apply(this,[this[i]].concat(args).concat(i)); //如果返回值转换为boolean时为'真' 并且不是数值0 if(rval || rval === 0){ //如果_set存在,将计算结果放入_set集合 if(_set && _set.put){ _set.put(rval); }else{ //否则,将第一个满足条件的结果的返回 return rval; } } } //返回结果集 return _set; }; //each是一个集合迭代函数,它接受一个闭包作为参数和一组可选参数 //这个迭代函数依次将集合的每一个元素和可选参数用闭包进行计算,并将计算结果集返回 Array.prototype.each = function(closure){ closure = closure || undefined; var _set = []; _set.put = _set.push; return this.any.apply(this,[closure,_set].concat(Array.apply(this,arguments).slice(1))); } //当且仅当集合中的每一个元素调用闭包函数的返回结果为true时,它才返回true Array.prototype.all = function(closure){ return this.each.apply(this,arguments).length = this.length; } //除去数组中的null,false元素 Array.prototype.trim = function(){ return this.each(); } //判断数组中是否包含某个元素 Array.prototype.contains = function(el){ return this.any(function(x){ return x==el}); } //返回数组中值等于el的第一个索引,若不存在,返回-1 Array.prototype.indexOf = function(el){ return this.any(function(x,i){return el==x ? i : -1}); } //获取从start到end的子数组 Array.prototype.subarr = function(start,end){ end = end || Math.Infinity; return this.each(function(x,i){return i>=start && i<end ? x : null}); } //这是一个集合迭代函数,它接受一个list和一个闭包 //返回这个闭包对于集合和list元素的一组匹配 Array.prototype.map = function(list,closure){ if(typeof list == 'function' && typeof closure != 'function'){ var li = closure; closure = list; list = li; }; closure = closure || Array; return this.each(function(x,i){return closure(x,list[i])}); }