返回时退出功能

时间:2016-04-25 12:48:04

标签: javascript

我有一个数组。我有一个函数检查数组是否包含数字'2'。

如果找到了数字,我希望该函数返回true。如果没有,它应该返回false。

我写了这个:

function hasTwo(arr) {
    arr.forEach((x) => {
        if (x === 2) {
            console.log("Two!")
            return true
        }
    })
    console.log("No two :(")
    return false
}

let arr = [1,2,3,4,5,6]    
console.log(hasTwo(arr))

我的期望是,在第二次forEach迭代中,将满足if条件并且函数将返回true。

但是,这是控制台输出:

Two!
No two :(
false

我相信第一个return语句是从条件块返回的,而不是封闭函数。 (是吗?)

我用一个变量来重写函数来存储返回值:

function hasTwo(arr) {

let result = false

    arr.forEach((x) => {
        if (x === 2) {
            console.log("Two!")
            result = true
        }
    })

    return result
}

但是如果满足x === 2条件,我看不到函数的重点。有没有办法返回一个值并立即退出函数?

4 个答案:

答案 0 :(得分:4)

return语句会立即从其所在的函数返回,而不是从所有周围函数返回。

除了通过抛出异常之外,您不能停止.forEach()次迭代,如果您关注性能,这将会适得其反。您可以做的是使用.some()代替:

var result = arr.some((x) => { return x === 2; });

只要其中一个回调返回.some()true的迭代就会停止。

答案 1 :(得分:4)

也许使用.indexOf代替自己迭代?

function hasTwo(arr) {
    return arr.indexOf(2) !== -1
}

let arr = [1,2,3,4,5,6]    
console.log(hasTwo(arr))

答案 2 :(得分:2)

你不能return来自forEach回调中的外部函数 - 只能从回调函数返回。

你不能打破forEach循环(没有例外),你不应该尝试。您实际需要的是some Array method

function hasTwo(arr) {
    var result = arr.some(x => x === 2);
    console.log(result ? "Two!" : "No two :(");
    return result;
}

let arr = [1,2,3,4,5,6]    
console.log(hasTwo(arr))

答案 3 :(得分:0)

你有两个功能。所以它从第一个函数而不是父函数返回。父函数按预期执行。相反,你可以做类似的事情:

function hasTwo(arr) {
    for (i = 0; i < arr.length; i++) {
        if (arr[i] === 2) {
        console.log("Two!");
        return true;
    }
    console.log("No two :(");
    return false;
}

let arr = [1,2,3,4,5,6]    
console.log(hasTwo(arr));