いちおう、先に Firefox でしか試してないと白状しておきます。
JavaScript は数値もオブジェクトのように扱える
(1).toString() // 文字列 "1" が復帰される
しかし、以下のコードを試すと
var a = 1; n.a = 1; alert(n.a); // undefined と表示される
ここで二つ仮説を立てた
- 数値へのプロパティ追加はスルーされる。
- 数値はドット演算によって一時的にオブジェクト化されてその後戻る。だから、オブジェクト化されたときに代入されても、再びオブジェクト化されたときとは別のオブジェクトになっている。
どうすれば、それを確かめられるだろうか
さんざん悩んだ(深夜4時)。。。。うーん。うーん。
思いついた!
こうすればいいんじゃね?
alert(typeof 1); // 'numer' (function(){alert(typeof this)}).apply(1); // 'object'
成功!これで証明できた!
ある関数を「1」のメソッドとして呼んだとき「1」はオブジェクトになっていたのだ。しかも、前の結果から推測すると一時的にオブジェクトになり、数値に戻り、さらにまた必要なときは別の新しいオブジェクトになる。
ということは
var n = 1; n.toString();
これの等価式は
var n = 1; (new Number(n)).toString();
ということになる。
ちなみに
文字列と真偽値にも同じことが言えます。
以下も等価式になるということか
var a = "1234"; a.charAt(1); a.charAt(2); a.charAt(3);
var a = "1234"; (new String(a)).charAt(1); (new String(a)).charAt(2); (new String(a)).charAt(3);
各行で new かぁ。。。気を付けよう
この辺も意識すると
さらなる高速化のアイデアが生まれそうだなあ。