348Blog Alpha
Amebaでブログを始めよう!

Objectを継承しないオブジェクト

オブジェクト関連の話題を数点。

JavaScriptのオブジェクトは全てObjectを継承していると思ったら、そうでないものがありました。
ActiveXObjectオブジェクトが該当します。
ActiveXObjectというとどうも初期のIEのAJAXが最初に出てくる人が多いかもしれませんが、
VBSやWSHのCreateObjectに相当するオブジェクトで、JavaScriptでWSHを書くときに重宝します。
ぶっちゃけた話「ActiveXObjectがあればなんでもできる!(もちろんウイルス作成も!)」といえます。
ただ、これがObjectを継承しない。継承しないから拡張できない。
(というより私は拡張する気はありませんが)
他のMS独自実装のEnumeratorとかVBArrayは継承しているのに。

で、ActiveXObjectのインスタンスにtypeofを適用すると例外を返します。
もちろん、Object.prototype.toString.apply(~);も通用しないわけで。

あと、VBScriptと連携している場合に、VBScriptのプロシージャ
(JavaScriptの関数に相当する)にtypeofを適用すると「unknown」が返ります。
連携はJavaScriptの変数の型(数値だとLong型かDouble型)を
判別する貴重な方法なのにぃ…。

JavaScriptのDateオブジェクト

JavaScriptのライブラリを作っているとき思った事。

Dateの範囲が半端なく長すぎる。
どのくらいかというと、「1970年1月1日から前後1億日」。
つまり「前後26万年強」である。
未来側がどんな事になっているか分からないことは想像できるが、
過去側は「人類が出てきたかどうか?」というような時間である。
その時をミリ秒単位で指定されても困るw

他の言語系でよく見かけるのは1年~9999年。
個人的にはこれで十分だと思うのだが。

自分がプログラミングしている時は、特に理由がない限り、
1800~2200年の範囲を想定して
プログラミングをしているんですけどね。

素数の話

ブログをリニューアルしました!
とりあえずはプログラミングの裏話がメインになると思います。

---- 8< ----

第1回は素数探索の話。
教科書通りの書き方だと、次の書き方になるでしょう。

var primes = []; // primes : int32[]

//isPrime(n : int32) : bool
function isPrime(n){
  for(var i = 2;; i++){ // i : int32
    if(n % i === 0){ 
    if(i * i =< n){ 
  }
}

for(var i = 2;; i++){ // i : int32
  if(isPrime(i)){ primes.push(i); }
}

しかし、素数の性質を知ると、ある程度は早くなります。素数は「nが2以上の整数の時、1とn以外の約数を持たない」というのが定義です。2未満の整数で2の倍数でないのは1だけ。
というわけで、

primes = [2];

//以下省略

for(var i = 3;; i += 2){ // i : int32
  if(isPrime(i)){ primes.push(i); }
}

さらに、6(=2*3)未満の整数で2の倍数でないのは1と5。
というわけで、
primes = [2,3];

//以下省略

for(var i = 0;; i += 6){ // i : int32
  if(isPrime(i + 5)){ primes.push(i + 5); }
  if(isPrime(i + 7)){ primes.push(i + 7); }
}

と書けます。
ただし、欲は「30未満の1,7,11,13,17,19,23,29」までにしておいた方がよいでしょう。