2015-12-07 10 views
6
[].every(i => i instanceof Node) // -> true 

配列が空の場合、JavaScriptの配列のすべてのメソッドがtrueを返すのはなぜですか?私はタイプアサーションをそうしようとしています...空の配列でArray.prototype.everyがtrueを返すのはなぜですか?

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

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) => Array.from(args).every(n => is.Node(n)); 

しかし、引数が渡されていなくても、これらは引き続き真です。

+1

回答がわかりませんが、 'is.Undef =(... args)=> args.length && args.every(o => isT(o、 'undefined'))を使用することができます。 ; ' – synthet1c

答えて

5

は数学で、 "すべてのための" 数量詞のようなthe docs

すべての行為を参照してください。 では、空の配列の場合はtrueを返します。 (空のセットのすべての要素が任意の与えられた条件を満たすこと意味をなさない 本当です。)編集として

、私はVacuous truthアップに見えたので。私は文脈から理解しましたが、私は正式な定義に興味がありました。この言い換え引用の意味を例示:考慮に他の人が存在しない:

「あなたは私のお気に入りの甥です」と彼はだけ甥である場合には空虚な文です。

+1

これは誤解を招くような例です。ここでのお気に入りは「1のうち1」を意味するからです。 Vacuousは「すべて0」を意味する傾向があります。もしあなたがそれをもっと冗長に言えば、「私はあなた以外のすべての甥よりもあなたが好きです。」と言いました。「あなた」以外の甥がいないので、それは空です。 – djechlin

+1

"私は皆さんのそばの新聞がすべて好きです。" – Draco18s

+0

はい、それは明らかです。 「私はあなた以外のすべての甥が好きです」ということにも注意してください。 「あなたは私の好きで嫌な甥だ」ということは、ほんの少し奇妙なことであることが判明しました。 – djechlin

3

"every"は - vacuously - 要素がない場合はtrueです。

"for all x、P"の関係は "NOT(存在しないxが存在します)"と同じです。

これは多少の慣習ではありますが、「数学がきちんと機能するように」することは非常に多いです。

2

MDN Array every()

数学で "すべてのための" 数量詞のようなすべての行為。特に、空の配列の場合、trueを返します。 (空集合のすべての要素は、任意の与えられた条件を満足することが意味をなさない真である。)

2

Array.prototype.every(太字の強調鉱山)のECMAScript仕様から:

everyは、それぞれについて一度callbackfnを呼び出し要素が配列内に存在する場合は、昇順にとなり、callbackfnが返されます。falseが返されます。そのような要素が見つかった場合、everyはすぐにfalseを返します。そうでない場合、callbackfnがすべての要素に対してtrueを返した場合、everytrueを返します。

[...] everyは、数学では "for all"のように機能します。 特に、空の配列の場合、trueを返します。上記の最初の大胆なフレーズを考えると

everyが要素のコールバックのリターンfalse(要素がないので、コールバックも、実行されることはありませんので)見つけたので、第二太字の語句によって確認されたように、それは、trueを返します。 。

関連する問題