Dateオブジェクトの比較



0   名前: NullPo : 2007/05/22(火) 12:44  ID:05nvWK2y sub-.G
Dateオブジェクトを比較するとき、一体何の値を比較しているのでしょうか。
Date.prototype.toString = function(){
  return 0;
}

Date.prototype.getTime = function(){
  return 0;
}

  var a = new Date();
  var b = new Date();

  alert("a==b = " + (a == b) + "\n" // false
      + "a>=b = " + (a >= b) + "\n" // true
      + "a<=b = " + (a <= b));      // true

一番上がfalseになるのは当然ですよね。
その下の二つは何を比較してtrueを返しているのでしょうか。

1   名前: 匿名 : 2007/05/22(火) 12:44  ID:OF72WdCi sub-Cz
以下、関連規則。(§...)は ECMA 262-3 の当該箇所を参照。

・x == y
x と y が Object 型の場合、同じオブジェクトを参照しているか、互いに結合しているオブジェクトを参照していれば true を返し、そうでなければ false を返す(§11.9.3)。

・x < y
x と y をプリミティブ値(数値優先)に変換し、それらが文字列でなければ Number 型に変換し、その比較結果を返す(§11.8.5)。

・Date オブジェクト→プリミティブ値(数値優先)
valueOf()、toString() の順に呼び出し、プリミティブ値ならそれを返す(§9.1、§8.6.2.6)。

・Date.prototype.valueOf
この時間値である数値を返す(§15.9.5.8)。

以上を踏まえて:
// 両者はほぼ同時に作成されるため同じ時間値を持つ
var a = new Date;
var b = new Date;

// a と b は異なるオブジェクトなので false
a == b;

// a < b を評価すると、a と b は同じ数値に変換されるので false、反転して true
a >= b; 

// a > b を評価すると、a と b は同じ数値に変換されるので false、反転して true
a <= b;

2   名前: NullPo : 2007/05/22(火) 12:44  ID:Z0FHbpib sub-ii
>>1
なるほど、valueOfメソッドから取得していたのですね。
ありがとうございます。
すっきりしました。
  var a = new Date(2007, 1, 1);
  var b = new Date(2007, 2, 2);

  alert("a==b = " + (a == b) + "\n" // false
      + "a>=b = " + (a >= b) + "\n" // true
      + "a<=b = " + (a <= b));      // true

Date.prototype.valueOf = function() {
  return 0;
}

一覧へ戻る