JavaScript空数组调用every方法筛选素数的运行逻辑疑问
关于sumPrimes代码中every方法空数组行为的解答
问题1:空数组调用every方法为什么可以正常运行?
这是ECMAScript标准对Array.prototype.every()的明确定义:当调用every方法的数组长度为0时,会直接返回布尔值true,属于符合规范的正常行为,不会抛出任何错误。
你可以直接运行测试代码验证这个规则:
console.log([].every(() => false)) // 输出true,哪怕回调直接返回false,空数组调用every依然返回true
问题2:空数组时回调的prime参数从哪来,判断逻辑如何生效?
空数组调用every方法时,传入的回调函数根本不会被执行,所以不存在prime参数取值的问题。
这里的判断逻辑依赖的是逻辑学中的「空真(Vacuous truth)」规则:对于一个空集合,我们默认「集合中所有元素都满足条件」的命题为真——因为不存在不满足条件的元素,所以判定命题成立。
对应到这段代码的执行逻辑:
- 第一次循环
i=2时,primeNumbers是空数组,every直接返回true,符合2是素数的事实,所以2被推入数组 - 后续循环数组不为空时,才会实际执行回调,逐个判断当前i是否能被已找到的素数整除,都不能整除的才是新的素数,推入数组后最后累加求和。
内容的提问来源于stack exchange,提问作者3rfan
相关产品推荐
相关产品推荐

