自己實現一個each叠代器
阿新 • • 發佈:2017-11-16
所在 導致 應該 分享 一個 不用 結構 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叠代器