1. 程式人生 > >自己實現一個each叠代器

自己實現一個each叠代器

所在 導致 應該 分享 一個 不用 結構 llb blog

什麽是叠代器?

  其實就是對一個對象內部進行遍歷的方法,比如jquery的each方法,或者原生js的foreach方法。

叠代器的特點

  針對叠代器,這裏有幾個特點:

   ? 訪問一個聚合對象的內容而無需暴露它的內部。

   ? 為遍歷不同的集合結構提供一個統一的接口,從而支持同樣的算法在不同的集合結構上進行操作。

   ? 遍歷的同時更改叠代器所在的集合結構可能會導致問題。

   簡單的說:封裝實現,然後叠代器的聚合對象不用關心叠代的過程,從而符合SRP原則。

ps:SRP單一職責原則(Single Responsibility Principle):就一個類而言,應該僅有一個引起它變化的原因。(說實話我也沒看懂是什麽東西哈哈哈哈)

首先實現一個簡單的each方法,代碼如下

 function  each(obj, callback) {
     var i = 0,
         length = obj.length
     for(i; i < length; i++) {
         callback(obj[i], i);
     }
 }
 var a = [2, 3, 1, 5];

 each(a, function (value, index) {
     console.log("第" + index + "的值為:"+ value);
 })

結果如下圖:

技術分享

可見,基本遍歷的功能已經實現,下面進行一下優化,使之支持參數傳遞,改進代碼如下:

 function  each(obj, callback, arg) {
     var i = 0,
         length = obj.length;
     for(i; i < length; i++) {
         callback.call(window, obj[i], i, arg);
     }
 }
var a = [2, 3, 1, 5]; var b = "我是傳入的參數"; each(a, function (value, index, b) { console.log(
"第" + index + "的值為:"+ value); console.log(b); }, b);

執行結果如下:

技術分享

還有最後一步改進,就是可以通過判斷回調返回的是不是false來提前終止循環,從而節省性能,改進代碼如下:

 function  each(obj, callback, arg) {
     var i = 0,
         value,
         length = obj.length;
     for(i; i < length; i++) {
       value = callback.call(window, obj[i], i, arg);
         if(value === false) {
             break;
         }
     }
 }
 var a = [2, 3, 1, 5];
 var b = "我是傳入的參數";

 each(a, function (value, index, b) {
     console.log("第" + index + "的值為:"+ value);
     console.log(b);
     if(index = 3) {
         return false;
     }
 }, b);

執行結果如下:

技術分享

至此,一個簡單的叠代器就完成啦!

自己實現一個each叠代器