zepto学习之路--数组去重和原生reduce

  好吧开始读zepto的源代码,最前面给处理trim和reduce的原生实现,感觉写的很紧凑,其中reduce写的有点晦涩,个人感觉还不错。主要zepto的作者是无分号党,看起了有点不习惯。

  3  if (String.prototype.trim === undefined) // fix for iOS 3.2
   4   String.prototype.trim = function() {
   5     return this.replace(/^\s+|\s+$/g, '')//类似php的trim函数
   6   }
   7 
   8   // For iOS 3.x
   9   // from https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/reduce
  10   //这个方法的作用就是累似一个累计处理的作用,将前一条数据的处理结果用作下一次的处理
  11   //比如[1,2,3,4,].reduce(function(x,y){ return x+y}); ==> ((1+2)+3)+4,
  12 
  13   if (Array.prototype.reduce === undefined) Array.prototype.reduce = function(fun) {
  14     if (this === void 0 || this === null) throw new TypeError()
  15     var t = Object(this),//t就是数组自己this的拷贝
  16       len = t.length >>> 0,//数组长度
  17       k = 0,//数组下标变量
  18       accumulator//存放结果的变量
  19     if (typeof fun != 'function') throw new TypeError()
  20     if (len == 0 && arguments.length == 1) throw new TypeError()
  21     //取初始值  
  22     if (arguments.length >= 2) accumulator = arguments[1] //如果参数长度大于2个,则将第二个参数作为初始值
  23     else do {
  24       if (k in t) {
  25         accumulator = t[k++] //否则将数组的第一条数据作为初绍值
  26         break
  27       }
  28       if (++k >= len) throw new TypeError() //什么情况下会执行到这里来???
  29     } while (true)
  30     //遍历数组,将前一次的结果传入处理函数进行累计处理
  31     while (k < len) {
  32       if (k in t) accumulator = fun.call(undefined, accumulator, t[k], k, t)//核心运算代码
  33       k++
  34     }
  35     return accumulator
  36   }

  

posted @ 2015-04-06 17:13  低调的大白兔  阅读(947)  评论(0编辑  收藏  举报