所以我正在创建一个函数来检查数组中的元素是否相等,如果是,则返回true,如果不是则返回false。我最终得到了:
var uni;
function isUniform(uni) {
// capture first number of array
var base = uni[0];
// check if next numbers are equal to first number
for (var i = 0; i < uni.length; i++ ) {
if(uni[i] !== base){
return false;
}
else{return true;} }
}
我的问题是,无论我输入什么数组,它都会一直存在 返回true。经过一些实验后,我最终将返回值设置在循环之外,最终有效。
var uni;
function isUniform(uni) {
// capture first number of array
var base = uni[0];
// check if next numbers are equal to first number
for (var i = 0; i < uni.length; i++ ) {
if(uni[i] !== base){
return false;
}}
return true;
}
所以我的问题是:为什么我需要在for循环之外放置“return true”才能使函数工作? 我想我知道原因,但我希望有一个解释清楚。
答案 0 :(得分:7)
当解释器在return
上运行时,它会立即终止当前函数 - 而不仅仅是当前正在运行的块。因此,在您的第一个代码段中,第一个匹配元素将导致return true
- isUniform
只会导致false
如果每个元素不同且你从第二个元素开始比较而不是从第一个元素开始比较(因为arr[0] === arr[0]
总是为真,除非arr[0]
是NaN或类似的奇怪,例如对getter的引用)
但是按照以下方式编写函数会更容易:
const isUniform = (input) => {
const base = input[0];
return input.every(element => element === base);
}
console.log(isUniform([0, 1, 2]));
console.log(isUniform([0, 0, 0]));
&#13;
答案 1 :(得分:2)
假设您有以下内容:
[0,0,1]
前两个元素相同,这将导致return true
执行。 return
终止函数,从而终止循环,因此最后一个条目(不同),甚至都不会被比较!
自己查看以下循环如何只执行一次:
const loop = function () {
for(let i=1; i<100000; i++) {
console.log("I looped " + i + " time")
return true
}
}
loop()
答案 2 :(得分:0)
在循环外部,您将基数设置为等于列表中的第一项。然后,您将迭代列表中的所有项目,包括第一项。因此,第一次迭代总是如此,因为base = uni [0]。
答案 3 :(得分:0)
如果你只处理数字,你可以试试这个:
function allNumbersEqual (arr) {
return Math.min(...arr) === Math.max(...arr);
}
console.log(allNumbersEqual([0.1, 0.1, 0.1, 0.1, 0.1, 0.1]));
// true
console.log(allNumbersEqual([0.1, 0.2, 0.3, 1, 2, 3]));
// false
当你可以在 O(n*2) 中完成时,为什么要在 O(n) 中完成? :D