Javascript 谁能解释此代码行为的原因

Javascript 谁能解释此代码行为的原因,javascript,Javascript,函数every(数组、谓词){ 让瓦尔; for(让elt表示数组){ val=谓词(elt); } if(val==true)console.log(true); else console.log(false); } 每([1,2,3,4,5],n=>n>0)Edit 如果希望每次都记录日志,可以尝试添加另一个控制变量。您需要当前结果和最终结果。这不会造成短路,而且会检查数组中的每个值。我不建议这样做,所以考虑一下我最初的反应。 函数every(数组、谓词){ 设finalVal=true,

函数every(数组、谓词){
让瓦尔;
for(让elt表示数组){
val=谓词(elt);
}
if(val==true)console.log(true);
else console.log(false);
}
每([1,2,3,4,5],n=>n>0)
Edit 如果希望每次都记录日志,可以尝试添加另一个控制变量。您需要当前结果和最终结果。这不会造成短路,而且会检查数组中的每个值。我不建议这样做,所以考虑一下我最初的反应。
函数every(数组、谓词){
设finalVal=true,currentVal;
for(让elt表示数组){
currentVal=谓词(elt);
console.log(elt,currentVal);
if(最终值和当前值){
最终结果=假;
}
}
返回最终值;
}

every([1,2,3,4,5],n=>n>0)
您只查看最后一个结果,因为每次运行循环时都会重新分配
val
。循环结束后,将保留上次分配的值

相反,如果您想发现一个假值,您需要在循环中发现它,并在那里停止该过程。只有在循环完成后才返回true,因为这样您就知道没有检测到假值

最后,为了使函数在更大的程序中真正有用,它需要将结果返回给调用者,而不仅仅是将结果记录到控制台

正如评论中指出的,JS数组对象中内置了一个“every”方法。下面的演示既展示了您的函数是否正常工作,也展示了如何使用内置方法(因此根本不需要自定义方法):

函数every(数组、谓词){
for(让elt表示数组){
if(谓词(elt)=false)返回false;
}
返回true;
}
log(每([1,2,3,4,5],n=>n>0));
log(每([1,2,3,-4,5],n=>n>0));
log([1,2,3,4,5]),每((n)=>n>0);

log([1,2,3,-4,5]),每((n)=>n>0)个
val
将仅作为
predict()
最后一次求值的结果。循环会在每次迭代时重新分配值,因此,例如,在进行下一次迭代时,数组第一个元素上的
predict()
的结果将丢失。您知道这是内置的()?只是说。谢谢,但是如何解决这个问题呢?是的,劳伦斯,我知道,但这是一个练习,我是一个初学者。如果你做比较,请始终使用typesafe
==
标识运算符。并且您应该避免与
true
false
进行比较,除非您希望将显式值
true
/
false
与其他truthy/falsy值区分开来。但这个问题不是这样的。我甚至会将它简化,并完全删除变量
val
(如果其他地方不需要ofc),那么为什么我不能在函数中直接调用console.log呢?像这个函数一样,every(array,predict){for(让数组的elt){if(predict(elt)=false)console.log(false);}console.log(true);}(every([1,2,-3,4,5],n=>n>0))@SanlexSandro为什么需要登录?该方法应返回布尔值,不应将其视为void函数。