我正在試驗JavaScript,僅用於學習目的,我正在編寫一個forEach迭代器,它可以遍歷嵌套數組或其他任何包含length property
的可迭代對象。遞歸迭代器上的最大調用堆棧大小錯誤
這是我寫的:
var forEach = function(obj, callback, options) {
var options = options || {};
var context = options.context || this;
if(!isEmpty(obj)) { // isEmpty function just evaluates `return !(!!obj.length);`
for(var x = 0; x < obj.length; x++) {
if(!isEmpty(obj[x]) && options.deep === true) {
forEach.call(context, obj[x], callback, options);
continue;
}
callback.call(context, obj[x]);
}
}
};
如果我通過一個嵌套的數組,我得到RangeError: Maximum call stack size exceeded
:
forEach(['a', 'b', ['c', 'd']], function(x) {
console.log(x);
}, { deep: true });
但這似乎只如果我在obj[x]
如果我替換:
if(!isEmpty(obj[x]) && options.deep === true) {
爲:
if((obj[x] instanceof Array) && options.deep === true) {
我會奇蹟般地工作。 Hovewer,不僅Arrays
有一個長度屬性。 String
有它,所以它不是一個廣泛的方法。
如何防止RangeError
但仍檢查length property
?
編輯:我上運行的NodeJS v0.8.12的例子
考慮到' 'A'[0] [0] [0] [0] [0] [0] [0] ...'是有效的循環往復,和每個值都是'string'類型。如果類型是'string',那麼你不應該遞歸迭代它。 – mellamokb
@mellamokb是的,我想這更有意義:) – jviotti
@mellamokb請張貼您的建議作爲答案,以便我可以接受它 – jviotti