Skip to content

13. [].every(item => false)

Array.prototype.every() 方法测试一个数组内的所有元素是否都能通过某个指定函数的测试,只有所有元素都能通过测试时才返回 true,否则返回 false。

那么对于一个空数组呢?一个空数组中没有元素,那么按我们思路来说,应该是返回 false 的。

但是请看下面这个表达式,它的返回值为 true

js
[].every(item => false) // true
1

“计算机没有黑魔法”,遇到 JS 的奇怪的行为,首先是看 MDN 文档,其次是看 ES 规范。

MDN Array.prototype.every

every acts like the "for all" quantifier in mathematics. In particular, for an empty array, it returns true. (It is vacuously true that all elements of the empty set satisfy any given condition.)

首先这段文档明确说明了,对于空数组,arr.every(cbk) 返回 true,无论 cbk 中的条件函数是什么。

js
[].every(item => false) // true
[].every(item => true) // true
1
2

其次,它解释了为什么会这样,在数学里有一种 “vacuously true”(虚真论断),也就是说对于命题 “若 p,则 q”,在 p 为假时,无论 q 是什么,此命题都为真。所以对于一个空数组,都没有元素了,也就无所谓对其中的元素进行判断,那么就直接返回 true 了,(JS 试图甩锅给数学(bushi))。