我们经常给 String,Function,Array 的原型加上自定义的扩展函数,比如去除字符串空格,数组排序等 今天重点讲下 如何给Array对象扩展 (function(){ var YArray; YArray = function(o,idx,arraylike){ var t = (arraylike) ? 2 : YArray.test(o), l, a, start = idx || 0; if (t) { try { return Array.prototype.slice.call(o, start); //借助Array原生方法来把aguments转换为JS数组 } catch(e) { a = []; l = o.length; for (; start<l; start++) { a.push(o[start]); } return a; } } else { return [o]; } } YArray.test = function(o){ var r = 0; if (o && (typeof o == 'object' ||typeof o == 'function')) { if (Object.prototype.toString.call(o) === "[object Array]") { r = 1; } else { try { if (('length' in o) && !o.tagName && !o.alert && !o.apply) { r = 2; } } catch(e) {} } } return r; } YArray.each = (Array.prototype.forEach) ? //先检测浏览器是否已支持,若有则调用原生 function (a, f, o) { Array.prototype.forEach.call(a || [], f, o || Y); return YArray; } : function (a, f, o) { var l = (a && a.length) || 0, i; for (i = 0; i < l; i=i+1) { f.call(o || Y, a[i], i, a); } return YArray; }; YArray.hash = function(k, v) { var o = {}, l = k.length, vl = v && v.length, i; for (i=0; i<l; i=i+1) { if (k[i]) { o[k[i]] = (vl && vl > i) ? v[i] : true; } } return o; }; YArray.indexOf = (Array.prototype.indexOf) ? function(a, val) { return Array.prototype.indexOf.call(a, val); } : function(a, val) { for (var i=0; i<a.length; i=i+1) { if (a[i] === val) { return i; } } return -1; //寻找不到的情况 }; YArray.numericSort = function(a, b) { return (a - b); //从小到大排序, return (b - a); 从大到小 }; YArray.some = (Array.prototype.some) ? function (a, f, o) { return Array.prototype.some.call(a, f, o); } : function (a, f, o) { var l = a.length, i; for (i=0; i<l; i=i+1) { if (f.call(o, a[i], i, a)) { return true; } } return false; }; })();
Array.apply(null,arguments); [].slice.call(arguments,0); [].splice.call(arguments,0,arguments.length); [].concat.apply([],arguments); ...
a = []; l = o.length; for (; start<l; start++) { a.push(o[start]); } return a;
|