読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

valueOfとtoString

var o = {
  valueOf: function () {
    return "valueOf";
  },
  toString: function () {
    return "toString";
  }
};
alert("" + o);
};

のようなコードは、"valueOf"になる。toStringよりもvalueOfのほうが優先される。
サイ本を読み返したら、きちんと書いてあったので、バグではないらしい。
上とは関係ないが、ちょっとしたベンチマークをした。Mac版のGoogle ChromeよりSafari4が速かったのが意外。
Benchmark

function Rational(numer, denom) {
  function gcd(a, b) {
    return b ? gcd(b, a % b) : a;
  }
  var divisor = gcd(numer, denom);
  this.numer = numer / divisor;
  this.denom = denom / divisor;
}

Rational.prototype.toString = function () {
  return this.numer + "/" + this.denom;
};

Rational.prototype.valueOf = function () {
  return this.numer / this.denom;
};

Rational.prototype.add = function (rat) {
  return new Rational(
    this.numer * rat.denom + rat.numer * this.denom,
    this.denom * rat.denom
  );
};

Rational.prototype.substract = function (rat) {
  return new Rational(
    this.numer * rat.denom - rat.numer * this.denom,
    this.denom * rat.denom
  );
};

Rational.prototype.multiply = function (rat) {
  return new Rational(this.numer * rat.numer, this.denom * rat.denom);
};

Rational.prototype.divide = function (rat) {
  return new Rational(this.numer * rat.denom, this.denom * rat.numer);
};

Rational.prototype.compareTo = function (rat) {
  var a = this.numer * rat.denom;
  var b = rat.numer * this.denom;
  return a == b ? 0 : a < b ? -1 : 1;
};

Rational.prototype.equals = function (rat) {
  return this.compareTo(rat) == 0;
};

var Benchmark = {
  initialize: function () {
    window.onload = Benchmark.onload;
  },

  onload: function () {
    var start = document.getElementById("start");
    start.onclick = Benchmark.onclick;
  },

  onclick: function () {
    var limit = parseInt(document.getElementById("limit").value);
    var view = document.getElementById("view");
    if (!isFinite(limit))
      return;
    view.appendChild(document.createTextNode(Benchmark.benchmark(limit)));
  },
  
  benchmark: function (limit) {
    var time = new Date().getTime();
    var i, acc = new Rational(0, 1), result;

    for (i = 1; i < limit; i += 4) {
      acc = acc.add(new Rational(1, i).substract(new Rational(1, i + 2)));
    }
    result = acc.multiply(new Rational(4, 1));
    return result.valueOf() + ":\n  " + (new Date().getTime() - time) + "\n";
  }
};

Benchmark.initialize();