Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果forEach内的条件为';的匿名函数不起作用_Javascript_Foreach - Fatal编程技术网

Javascript 如果forEach内的条件为';的匿名函数不起作用

Javascript 如果forEach内的条件为';的匿名函数不起作用,javascript,foreach,Javascript,Foreach,考虑下面的代码片段: function isUniform(myArray) { myArray.forEach(function(element) { if (element !== myArray[0]) { return false; } }); return true; } 其目的是函数应将数组作为输入,如果数组中的所有元素都相同,则返回true,否则返回false 例如: isUniform([1,2,

考虑下面的代码片段:

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

    return true;
}
其目的是函数应将数组作为输入,如果数组中的所有元素都相同,则返回
true
,否则返回
false

例如:

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

但是,如果条件:

if (element !== myArray[0])
在isUniform([1,2,1,1])的情况下,似乎从来都不是这样


我缺少的是什么?

因此
返回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;
}
或者您可以使用
for
循环或
for of
循环,在这种情况下
return
语句将按照您最初的预期工作。您可能已经熟悉了
for
循环For of循环(因此它们可能无法在所有JS引擎上工作)。of循环的
如下所示:

function isUniform(myArray) {
    for (element of myArray) {
        if (element !== myArray[0]) {
            return false
        }
    }
    return true
}
但是,最好的方法可能是使用内置的数组方法
every
,如果数组中的每个元素都通过了回调中提供的测试,那么该方法将返回
true
。因此,您可以测试每个元素,看看它们是否等于数组中的第0个元素,从而彼此相等:

function isUniform(myArray) {
    return myArray.every(function (currentElement,index,array) {
        return currentElement === array[0]
    })
}
这足够短,您甚至不需要将它放在自己的函数中——如果不这样做,代码的可读性可能会更高

文件: Array.prototype.every:


对于of循环:

因此
返回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;
}
或者您可以使用
for
循环或
for of
循环,在这种情况下
return
语句将按照您最初的预期工作。您可能已经熟悉了
for
循环For of
循环(因此它们可能无法在所有JS引擎上工作)。of循环的
如下所示:

function isUniform(myArray) {
    for (element of myArray) {
        if (element !== myArray[0]) {
            return false
        }
    }
    return true
}
但是,最好的方法可能是使用内置的数组方法
every
,如果数组中的每个元素都通过了回调中提供的测试,那么该方法将返回
true
。因此,您可以测试每个元素,看看它们是否等于数组中的第0个元素,从而彼此相等:

function isUniform(myArray) {
    return myArray.every(function (currentElement,index,array) {
        return currentElement === array[0]
    })
}
这足够短,您甚至不需要将它放在自己的函数中——如果不这样做,代码的可读性可能会更高

文件: Array.prototype.every:


对于of循环:

为什么在
forEach()中使用
return
?这没有意义,因为forEach()不返回。。。使用
[].some()
并返回some()调用,或者执行额外的迭代和闭包变量并坚持使用forEach…@dandavis:谢谢!。JS入门!好吧,很高兴看到新来者使用
forEach
而不是
,因为(
),你走对了。@dandavis所以
forEach
的唯一目的是对它的
数组执行副作用。没有使用它。不会使用它。你可以使用第二个参数[].forEach注入目标对象而不是使用副作用,但很少有人使用它,而是选择[].map/[].some/[].each/[].filter为什么在
forEach()中使用
return
?这没有意义,因为forEach()不返回…使用
[].some()
并返回some()调用,或者执行额外的迭代和闭包变量,并坚持使用forEach…@dandavis:谢谢!开始使用JS!很高兴看到新来者使用
forEach
而不是
来(
,你说得对。@dandavis所以
forEach
的唯一目的是对它的
数组执行副作用。没有使用它。不会使用它。你可以使用[]的第二个参数。forEach注入目标对象而不是使用副作用,但是很少有人使用它,而是选择[].map/[].some/[].each/[].filter@dandavis你指的是
数组。each()
块?我很有信心它工作得很好,我已经在repl中测试过了。你是在什么情况下使它失败的?哇,我今天真是哑巴。你说得对,它很好,我应该阅读代码(包括函数名)下次会有更多。很抱歉造成混淆。请使用箭头:
const isUn