为啥 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 为所有元素返回true
,every
将返回true
。[...]
every
就像数学中的“所有人”量词。 特别是对于空数组,它返回true
。
考虑上面第一个更粗的短语:因为every
没有找到回调返回false
的元素(因为回调甚至从未运行,因为没有元素),所以它返回true
,正如第二个粗体短语。
【讨论】:
我认为最好的答案。谢谢。【参考方案3】:如果没有元素,则说“每个”都是 - 空洞 - 真实在数学上更有效。
您需要它,因此“对于所有 x,P”的关系与“NOT(存在 x 非 P)”相同。
这在某种程度上是一个惯例问题,但它确实经常“使数学计算得很好”。
【讨论】:
【参考方案4】:MDN Array every()
every 就像数学中的“所有人”量词。特别是,对于一个空数组,它返回 true。 (空集的所有元素都满足任何给定条件,这是空洞的事实。)
【讨论】:
以上是关于为啥 Array.prototype.every 在空数组上返回 true?的主要内容,如果未能解决你的问题,请参考以下文章