我正在尝试使用 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) {
我会神奇地工作。然而,不仅Arrays
有一个长度属性。String
有它,所以这不是一个广泛的方法。
我怎样才能防止RangeError
但仍然检查length property
?
编辑:我在NodeJS v0.8.12上运行示例