またはのような標準演算子ではなく、 のtimeDifference
メソッドを使用NotesDateTime
して日付インスタンスを比較します。<
>
if (date1.timeDifference(date2) < 0) {
return "Pass";
} else {
return "Fail";
}
注:上記は、条件演算子を使用してより簡潔に表現することもできます。
return (date1.timeDifference(date2) < 0) ? "Pass" : "Fail";
メソッドはtimeDifference
本質的に、メソッドが呼び出された日付インスタンスから渡された日付を「減算」し、差を秒単位で返します。
したがって、上記の例では、date2
が より遅い場合date1
、メソッドは負の数を返します。date1
が より遅い場合、date2
結果は正の数になります。0
両方のオブジェクトが正確に同じ日付と時刻を表している場合、結果は次のようになります。
ボーナス情報:
標準の比較演算子を使用してこれら 2 つの変数の値の量的な違いを特定できない理由は、変数が「プリミティブ」値ではなく「オブジェクト」へのポインターであるためです。
JavaScript はほぼ完全に型のない言語であるため、等値演算子 ( ==
) は通常、文字列、数値、およびブール値を比較する場合にのみ信頼でき、比較演算子 ( <
、>
など) は通常、数値を比較する場合にのみ信頼できます。それ以外のほぼすべてのもの (配列を含む) は、オブジェクトと見なすことができます。
プリミティブな数値を持つ変数は、現在の値へのポインターにすぎません。その結果、次の式は を返しtrue
ます。
1 <= 2
しかし、次の式は決して真ではありません。
date1 <= date2
...ある時点で、両方の変数を明示的に同じオブジェクトへのポインターに設定しない限り:
date1 = date2
これらはオブジェクトであるため、それらが表す値<=
を比較しません。は、それらがまったく同じメモリ内オブジェクトへのポインターであるかどうかを確認します。オペランドがプリミティブでない限り、演算子の半分は無意味です。2 つのオブジェクト変数が互いに「小さい」ことはあり得ず、同じオブジェクトへのポインターまたは異なるオブジェクトへのポインターのいずれかしかあり得ないためです。前者はそれらを「等しく」しますが、後者は、2 つの変数によって識別される 2 つのオブジェクトが同一の内部値を格納している場合でもそうしません。それらは別々のメモリ割り当てであるため、JavaScript はそれらが互いに等しいとは見なさず、標準の比較演算子を使用してそれらの値を比較することはできません。=
<