如果forEach的匿名函数内的条件不起作用

nit*_*ian -1 javascript foreach

请考虑以下代码段:

function isUniform(myArray) {
    myArray.forEach(function(element) {
        if (element !== myArray[0]) {
            return false;
        }
    });

    return true;
}
Run Code Online (Sandbox Code Playgroud)

目的是该函数应该将数组作为输入,并且true如果数组中的所有元素都相同false则返回.

例如:

isUniform([1,2,1,1]); //应返回false isUniform([1,1,1,1]); //应该返回true

但是,if条件:

if (element !== myArray[0])
Run Code Online (Sandbox Code Playgroud)

在isUniform([1,2,1,1])的情况下似乎永远不会成立.

我错过了什么?

sva*_*don 5

因此,return true不返回函数的值isUniform,它返回您为forEach方法提供的回调值.forEach实际上只用于创建副作用.因此forEach,对每个元素执行回调,看到回调返回false,但之后没有与该值有任何关系,因此它将其抛出并继续到数组中的下一个元素.在遍历数组之后,它继续到下一行代码并返回true该函数.

您可以使用的一种方法forEach是声明一个初始化为true的变量,并在回调中操作该变量.这是必要的,因为没有办法forEach尽早结束循环的执行.所以你可能改用:

function isUniform(myArray) {
    var passing = true;
    myArray.forEach(function(element) {
        if (element !== myArray[0]) {
            passing = false;
        }
    });

    return passing;
}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用for循环或for-of循环,在这种情况下,return语句将按照您最初的预期工作.你可能已经熟悉了for循环.For-ofES2015中引入了循环(因此它们可能无法在所有JS引擎上运行).一个for-of循环是这样的:

function isUniform(myArray) {
    for (element of myArray) {
        if (element !== myArray[0]) {
            return false
        }
    }
    return true
}
Run Code Online (Sandbox Code Playgroud)

但是,执行此操作的最佳方法可能是使用内置数组方法every,true如果数组中的每个元素都通过了回调中提供的测试,则返回该方法.因此,您可以测试每个元素,看它们是否等于数组中的第0个元素,因此彼此相等:

function isUniform(myArray) {
    return myArray.every(function (currentElement,index,array) {
        return currentElement === array[0]
    })
}
Run Code Online (Sandbox Code Playgroud)

这很短,你甚至不需要把它放在它自己的函数中 - 如果你不这样做,你的代码可能会更具可读性.

文档:Array.prototype.every:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every

For-of循环:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of