私は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) {
私は魔法のように働きます。HovewerArrays
は、長さのプロパティだけではありません。String
持っているので、それは広いアプローチではありません。
どうすれば防ぐことができますRangeError
が、それでもチェックできlength property
ますか?
編集:NodeJSv0.8.12で例を実行しています