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
循环如下所示:
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