返回时退出函数

use*_*603 1 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))
Run Code Online (Sandbox Code Playgroud)

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

但是,这是控制台输出:

Two!
No two :(
false
Run Code Online (Sandbox Code Playgroud)

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

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

function hasTwo(arr) {

let result = false

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

    return result
}
Run Code Online (Sandbox Code Playgroud)

但如果满足 x === 2 条件,我看不出该函数继续存在的意义。有没有办法返回一个值并立即退出函数?

Poi*_*nty 5

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

除了抛出异常之外,您无法停止.forEach()迭代,如果您担心性能,这会适得其反。你可以做的是使用.some()

var result = arr.some((x) => { return x === 2; });
Run Code Online (Sandbox Code Playgroud)

.some()一旦其中一个回调返回,迭代就会停止true

  • @evolutionxbox 在这种情况下没有特殊原因;我只是想与问题中的代码保持一致。 (2认同)

Dan*_*ier 5

也许使用.indexOf而不是自己迭代?

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

let arr = [1,2,3,4,5,6]    
console.log(hasTwo(arr))
Run Code Online (Sandbox Code Playgroud)