型の判別
加算は、引数に数値と多項式が取れるようにしている。
this.add = function(p) {
var r = new poly(); // 返り値の準備
if(typeof p == "number") {
// 引数が数値だったときの処理
}
else if(p instanceof poly) {
// 多項式だったときの処理
}
else {
// その他のときの処理
}
return r;
}
型を判別するための演算子が2つある。
typeof p
とすると、pの基底のクラス名の文字列、
"number", "string", "boolean", "object", "function"、
あるいは、"undefined"が返るようだ。
p instanceof poly
とすると、
pがpolyかどうかがtrue, falseで返る。
これがtrueなら、
上のpolyのところはその基底クラスでもtrueが返る。
p instanceof Object
この演算子はどれくらい時間がかかるかというと、
100万回(いつもより1桁多い)繰り返すと、
// 708ms
var p = new poly();
for(var i = 0; i < n; i++) {
p instanceof Object;
}
// 713ms
var p = new poly();
for(var i = 0; i < n; i++) {
p instanceof Array;
}
// 645ms
var p = new poly();
for(var i = 0; i < n; i++) {
typeof p == "object";
}
instanceofは、
どうも基底クラスを使ったほうが若干速いようだが、
変わらないと言っていいだろう。
それよりtypeofのほうを使ったほうが速いようだが、
そんなに気にするようなレベルではない。
typeofを使うと文字列の比較に時間がかかる。
こうすると速くなる。
// 469ms
var o = "object";
var p = new poly();
for(var i = 0; i < n; i++) {
typeof p == o;
}
といってもそうたいしたことはないし、
この部分は特に変更しない。