Javascript forEach没有给出与正常for循环相同的输出

时间:2017-01-20 11:07:23

标签: javascript foreach callback

您好我正在运行一些测试,看看两者的输出是否为真。问题是,鉴于这些条件:



var callback = function (num) {
	return num % 2 === 0
}

console.log($$$.any([1, 3, 4], callback) === true)
console.log($$$.any([1, 11, 111], callback) === false)




我必须创建一个函数,结果在两种情况下都是真的。我用for循环做了但是我不能用forEach得到相同的结果,为什么会这样?:



// My for loop function:

$$$ = {
		any: function (arr, callback) {
		for (var i = 0, l = arr.length; i < l; i ++) {
				if (callback(arr[i])) {
				return true;
				}
			}
		return false;
		}
}

// My forEach function:

$$$={
	any: function(array, callback){
		array.forEach(function(value){
			// console.log(value)
			if (callback(value)) {
				return true;
			} 
			// return false;
		})
		return false;
	}
}
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

在你的第二个版本中,内部回调函数中的return true仅从该回调函数返回,并且不会导致外部函数返回。

.forEach循环将运行完成,然后.any函数本身始终返回false

FWIW,.forEach并不适合.any函数,因为一旦找到匹配项,就无法终止元素的迭代,并且&&因此效率低于可能的效率。例如,你可能有一个包含10000个元素的数组,但是使用.forEach它会继续循环,即使第一个元素满足你的谓词。

那就是说,如果你真的必须使用.forEach,那么解决办法就是:

function all(array, callback) {
    var result = false;
    array.forEach(function(value) {
        if (callback(value)) {
            result = true;
        }
    });
    return result;
}

进一步优化可能至少避免在找到匹配项后调用用户提供的回调:

function all(array, callback) {
    var result = false;
    array.forEach(function(value) {
        if (!result && callback(value)) {
            result = true;
        }
    });
    return result;
}

注意:JavaScript已经有一个能够满足您需求的功能 - Array.prototype.some