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

Javascript 为什么Array.prototype.each在空数组上返回true?,javascript,arrays,methods,Javascript,Arrays,Methods,当数组为空时,为什么JavaScript中数组上的every方法返回true。我正在尝试这样做类型断言 [].every(i => i instanceof Node) // -> true 但即使没有参数传递给它们,它们仍然返回true。如果没有元素,“every”(每一个)在数学上更为有效 您需要它,因此“对于所有x,p”的关系与“不(存在x,因此不存在p)”的关系相同 这在某种程度上是一个惯例问题,但它确实经常“使数学计算得很好” 每一个都像数学中的“为所有人”量词。在里面

当数组为空时,为什么JavaScript中数组上的every方法返回true。我正在尝试这样做类型断言

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

但即使没有参数传递给它们,它们仍然返回true。

如果没有元素,“every”(每一个)在数学上更为有效

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

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

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

作为编辑,因为我查了一下。我从上下文中理解它,但我对正式定义感兴趣。此转述引语举例说明了以下含义:

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

每一个都像数学中的“为所有人”量词。特别是,对于空数组,它返回true。(空集的所有元素都满足任何给定条件,这是完全正确的。)


根据ECMAScript规范(粗体强调):

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

[…]
每一个
都像数学中的“所有”量词特别是对于空数组,它返回
true


考虑上面第一个更粗体的短语:由于
every
找不到回调返回的元素
false
(因为回调从未运行过,因为没有元素),因此它返回
true
,第二个粗体短语证实了这一点。

不知道答案,但您应该能够使用
is.Undef=(…args)=>args.length&&args.every(o=>isT(o,'undefined')这是一个误导性的例子,因为favorite在这里的意思是“1分1秒”。Vacuous往往意味着“0分1秒”。如果你用更详细的措辞,“我比你以外的每个侄子都更喜欢你”,这是一个空洞的例子,因为除了“你”之外没有侄子。“我比你以外的每个新人都更喜欢。”是的,这很清楚。请注意,“除了你之外,我更喜欢每个侄子。”事实证明,“你是我最喜欢和最不喜欢的侄子”,这只是有点奇怪。正如“空房间里的每个手机都是同时开着和关着”的说法一样。我想这是null总是与false比较的对立面:null绝对不是什么东西,但另一方面,空集合绝对不是什么东西。(也就是说:数学很奇怪)。@Draco18snolongertrustsSE只是好奇想知道,但为什么[]。有些(a=>a*a);返回值为false。这不是空洞的事实吗?我认为这是最好的答案。非常感谢。
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)