プロの数学者として、私はに見Javscriptの同一性演算子 ==
(も「抽象比較」と呼ばれ、「緩い平等」)を構築しようとすると同値関係であることを含むエンティティの間に、反射的、対称と推移を。残念ながら、これら3つの基本的なプロパティのうち2つは失敗します。
==
再帰的ではありません:
A == A
間違っている可能性があります、例えば
NaN == NaN // false
A == B
そして、B == C
一緒に意味しないA == C
、例えば
'1' == 1 // true
1 == '01' // true
'1' == '01' // false
対称プロパティのみが存続します。
A == B
はB == A
、どの違反でもおそらくどの違反が考えられず、深刻な反乱につながることを意味します;)
なぜ同値関係が重要なのですか?
なぜなら、それは最も重要で一般的なタイプの関係であり、多数の例とアプリケーションによってサポートされているからです。最も重要なアプリケーションは、エンティティを等価クラスに分解することです。これは、それ自体が関係を理解する非常に便利で直感的な方法です。そして、等価であることに失敗すると、等価クラスの欠如につながり、それが、直観性の欠如および周知の不必要な複雑さの原因になります。
==
非同値関係を記述するのはなぜそんなにひどい考えですか?
なぜなら、文字通り、類似性、平等性、合同性、同型性、同一性などの興味深い関係は同等であるからです。
型変換
JavaScriptは直感的な同等性に依存する代わりに、型変換を導入します。
等価演算子は、オペランドが同じ型でない場合にオペランドを変換し、厳密な比較を適用します。
しかし、型変換はどのように定義されていますか?多数の例外を伴う複雑なルールのセットを介して?
同値関係を構築しようとする
ブール。はっきりtrue
とfalse
同じではありませんし、異なるクラスにする必要があります。
数字。幸いなことに、数値の等価性はすでに明確に定義されており、2つの異なる数値が同じ等価クラスに属することはありません。数学では、つまり。JavaScriptでは数の概念がされ、やや変形し、よりエキゾチックの存在を経由して-0
、Infinity
そして-Infinity
。我々の数学的直観はそれを指示する0
と-0
(実際には同じクラスであるべき-0 === 0
であり、true
無限大のそれぞれが別個のクラスであるのに対し、)。
数値とブール値。数のクラスを考えると、どこにブール値を入れますか?false
に似てい0
ますtrue
が、似て1
いますが、他の数字はありません:
true == 1 // true
true == 2 // false
任意のロジックは置くためにここにあるのtrue
と一緒1
?確か1
に区別されますが、そうでもあり-1
ます。私は個人的に、に変換true
する理由がありません1
。
そしてさらに悪化します:
true + 2 // 3
true - 1 // 0
だから、true
実際に変換された1
すべての番号のうち!論理的ですか?直感的ですか?答えは演習として残されています;)
しかし、これはどうですか:
1 && true // true
2 && true // true
唯一のブールx
とx && true
ビーイングがtrue
ありますx = true
。これは、1
および2
(および以外の任意の数0
)の両方がtrue
!に変換されることを証明します それが示すことは、私たちの変換が別の重要な特性- 全単射である -に失敗することです。2つの異なるエンティティが同じエンティティに変換できることを意味します。それ自体は大きな問題である必要はありません。この変換を使用して、それを何と呼んでも「同じ」または「緩やかな平等」の関係を記述するときに大きな問題が発生します。しかし、1つはっきりしていることは、それが同値関係にならないことと、同値クラスを介して直感的に記述されないことです。
しかし、もっとうまくできるでしょうか?
少なくとも数学的に-間違いなくはい!ブール値と数値の間で単純な同値関係のみで構成することができたfalse
と0
同じクラスです。だからfalse == 0
、唯一の非自明な緩い平等です。
文字列はどうですか?
先頭と末尾の空白から文字列をトリムして数値に変換できます。また、先頭のゼロを無視することもできます。
' 000 ' == 0 // true
' 0010 ' == 10 // true
そのため、文字列の単純なルールを取得します。前の空白とゼロを削除します。数値または空の文字列を取得します。その場合、その数値またはゼロに変換します。または、数値を取得しません。この場合、変換しないため、新しいリレーションは取得されません。
このようにして、ブール値、数値、および文字列の合計セットで完全な等価関係を実際に取得できます!それを除いて... JavaScriptデザイナーは明らかに別の意見を持っています:
' ' == '' // false
そのため、両方が変換さ0
れる2つの文字列は、突然非類似になります!なぜまたはなぜですか?規則によれば、文字列は厳密に等しい場合、厳密に厳密に等しくなります!このルールは、私たちが見ているように推移性を破壊するだけでなく、冗長です!他の演算子==
と厳密に同一にするために別の演算子を作成するポイントは何===
ですか?
結論
緩やかな等式演算子==
は、いくつかの基本的な数学的法則に従っていれば、非常に有用でした。しかし、悲しいことにそうではないように、その有用性は損なわれます。