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

Posted

技术标签:

【中文标题】为啥 Array.prototype.every 在空数组上返回 true?【英文标题】:Why does Array.prototype.every return true on an empty array?为什么 Array.prototype.every 在空数组上返回 true? 【发布时间】:2016-03-12 06:33:03 【问题描述】:
[].every(i => i instanceof Node) // -> true

为什么当数组为空时,javascript 中数组的every 方法返回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。

【问题讨论】:

不知道答案但应该可以使用is.Undef = (...args) => args.length && args.every(o => isT(o,'undefined')); 【参考方案1】:

见the docs

every 就像数学中的“所有人”量词。在 特别是,对于一个空数组,它返回 true。 (这是空洞的真实 空集的所有元素都满足任何给定条件。)

作为编辑,因为我看了Vacuous truth。我是从上下文中理解的,但我对正式的定义很感兴趣。这段转述的引文举例说明了含义:

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

【讨论】:

这是一个误导性的例子,因为这里最喜欢的意思是“1st out of 1”。 Vacuous 往往意味着“全为 0”。如果你措辞得更冗长,“我喜欢你胜过除了你以外的所有侄子”,这是空洞的,因为除了“你”之外没有任何侄子。 “我不喜欢除了你之外的每一个新人。” 是的,这很清楚。请注意,“我更喜欢除了你之外的每个侄子”也是事实。原来,“你既是我最喜欢又最不喜欢的侄子”,这只是有点奇怪。 正如“空房间里的每部手机同时开启”的陈述。我想这是 null 总是与 false 比较的对立面:null 绝对是 not 的东西,但另一方面,一个空集绝对是 not not-something。 (即:数学很奇怪)。 @Draco18snolongertrustsSE 只是想知道,但为什么 [].some(a => a*a);正在返回错误。这不是空洞的真理吗?【参考方案2】:

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

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

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

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

【讨论】:

我认为最好的答案。谢谢。【参考方案3】:

如果没有元素,则说“每个”都是 - 空洞 - 真实在数学上更有效。

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

这在某种程度上是一个惯例问题,但它确实经常“使数学计算得很好”。

【讨论】:

【参考方案4】:

MDN Array every()

every 就像数学中的“所有人”量词。特别是,对于一个空数组,它返回 true。 (空集的所有元素都满足任何给定条件,这是空洞的事实。)

【讨论】:

以上是关于为啥 Array.prototype.every 在空数组上返回 true?的主要内容,如果未能解决你的问题,请参考以下文章

弗雷奇。如何打破?

js中的内置方法的兼容写法

FCC 中级算法题 Everything Be True

Js中Array 函数使用方法

es6 非常实用的必备技能, 代替for循环,方法有很多哦

Everything Be True