为什么Array.prototype.every在空数组上返回true?

Sau*_*ode 14 javascript arrays methods

[].every(i => i instanceof Node) // -> true
Run Code Online (Sandbox Code Playgroud)

为什么当数组为空时,JavaScript中数组上的每个方法都返回true.我正在尝试做类似的断言,就像这样......

const isT = (val, str) => typeof val === str
const nT = (val, str) => !isT(val, str)
const is = {}

is.Undef = (...args) => args.every(o => isT(o, 'undefined'))
is.Def = (...args) => args.every(o => nT(o, 'undefined'))
is.Null = (...args) => args.every(o => o === null)
is.Node = (...args) => args.every(o => o instanceof Node)
is.NodeList = (...args) => args.every(n => n instanceof NodeList)
Run Code Online (Sandbox Code Playgroud)

但即使没有传递任何参数,这些仍然会返回true.

Dra*_*18s 11

查看文档

每一个行为都像数学中的"为所有人"量词.特别是,对于空数组,它返回true.(空集的所有元素都满足任何给定条件,这是真实的.)

作为编辑,因为我看起来很奇怪.我从上下文中理解它,但我对正式定义感兴趣.这个解释的引用举例说明了这个含义:

"你是我最喜欢的侄子",如果他是唯一的侄子,那么这是一个空洞的陈述:没有其他人可以考虑.

  • 这是一种误导性的例子,因为这里的最爱意味着"1中的第1个".Vacuous倾向于暗示"全部为0".如果你更详细地说,"除了你以外,我比你所有的侄子更喜欢你",因为除了"你"之外没有侄子,所以它是空的. (4认同)
  • “除了你以外,我对每个新来的人都比较不喜欢。” (2认同)

aps*_*ers 10

来自Array.prototype.every的 ECMAScript 规范(粗体强调我的):

every对数组中存在的每个元素按升序调用callbackfn一次,直到找到callbackfn返回的false元素。如果找到这样的元素,则 every 立即返回false。否则,如果callbackfn返回true所有元素,every将返回true

[...]every就像数学中的“for all”量词。特别是,对于空数组,它返回true

考虑上面的第一个粗体短语:由于every没有找到回调返回的元素false(因为回调甚至从未运行,因为没有元素),它返回true,正如第二个粗体短语所证实的那样。


dje*_*lin 5

如果没有元素,那么说“每一个”都是空洞的真,这在数学上更有效。

您需要它,因此关系“对于所有 x,P”与“NOT(存在 x 不存在 P)”相同。

这在某种程度上是一个约定俗成的问题,但它确实经常“让数学得到很好的结果”。