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のオブジェクトは全て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年の範囲を想定して
プログラミングをしているんですけどね。
Dateの範囲が半端なく長すぎる。
どのくらいかというと、「1970年1月1日から前後1億日」。
つまり「前後26万年強」である。
未来側がどんな事になっているか分からないことは想像できるが、
過去側は「人類が出てきたかどうか?」というような時間である。
その時をミリ秒単位で指定されても困るw
他の言語系でよく見かけるのは1年~9999年。
個人的にはこれで十分だと思うのだが。
自分がプログラミングしている時は、特に理由がない限り、
1800~2200年の範囲を想定して
プログラミングをしているんですけどね。
素数の話
ブログをリニューアルしました!
とりあえずはプログラミングの裏話がメインになると思います。
---- 8< ----
第1回は素数探索の話。
---- 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」までにしておいた方がよいでしょう。
