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

时间:2015-12-07 15:29:47

标签: javascript arrays methods

[].every(i => i instanceof Node) // -> true

为什么当数组为空时,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)

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

4 个答案:

答案 0 :(得分:9)

请参阅the docs

  

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

作为编辑,因为我看了Vacuous truth。我从上下文中理解它,但我对正式定义感兴趣。这个释义的例子说明了这个含义:

  

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

答案 1 :(得分:3)

在数学上更有效地说"每个"是 - 真空 - 如果没有元素,则为真。

你需要这样的关系"对于所有x,P"与" NOT相同(存在x使得不是P)"。

这在某种程度上是一种常规问题,但它确实能够很好地完成数学运算。"经常。

答案 2 :(得分:3)

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

  

every为数组中的每个元素调用 callbackfn 一次,按升序排列,直到找到 callbackfn 返回{{1> }} 即可。如果找到这样的元素,则每个元素立即返回false。否则,如果 callbackfn 为所有元素返回false,则true将返回every

     

[...] true就像所有""数学中的量词。 特别是,对于空数组,它会返回every

考虑上面的第一个更大胆的短语:因为true找不到回调返回every的元素(因为回调从不运行,因为没有元素),它返回{{1} },正如第二个粗体短语所证实的那样。

答案 3 :(得分:2)

  

MDN Array every()

     

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