JScript の要点を軽くまとめました。
var a = new Array();
var b;
b = a;
b[0] = 10;
b は、a の参照。b を変更すると、a の内容も変わる。
var a = new Array();
var b;
b = new Array(a); // a と同じ中身のものを生成
b は、a のコピー。b を変更しても、a の内容は変わらない。
function foo1()
{
var a = new Object(...);
var b;
...
b = a; // 参照を代入
return b;
}
function foo2()
{
var c = foo1();
var d = foo1();
}
ローカル変数の寿命は、関数の範囲。
よって、関数 foo1() の変数 a,b は関数内で完結。
ただし、関数 foo2() で戻り値を変数 c,d に代入し、参照数を +1 しているので、
関数 foo1 を抜けても Object オブジェクトは実体を保っていることになる。
ここでは、変数 c,d がスコープを外れた時、オブジェクトは破棄される。
また変数 c と d は別々の実体。
文字列は 値渡し なので、関数の引数にすると効率が悪い。
文字列も参照数をカウントしているが、
JScript において文字列の参照を扱うことは出来ない。
参照数が 0 になった瞬間、破棄されるのは VBScript。
JScript はスクリプトエンジンを終了するまで延滞される模様。
function HelloObject(str) // コンストラクタ
{
this.Hello = _HelloObject_Hello; // メソッドの定義 (実装をここに記述してもいい)
if (str != null) {
this.str = str;
} else {
this.str = "Hello, my world!"; // デフォルト引数
}
}
function _HelloObject_Hello() // メソッドの実装
{
puts(this.str);
}
関数が、自分のオブジェクトになる。
var hello = new HelloObject("Hello, your world!"); // インスタンスの生成
hello.Hello(); // メソッドの実行
メソッドの実行例
b = (a / 10) | 0;
ビット演算すると、整数になるのを利用。
こうした方が高速。
function foo(a, b)
{
if (!b) { // (b == null) とか (b === undefined) にする
...
}
}
foo(1);
foo(1, 0);
foo(1, false);
これだと、b の値が 0/false の時も真になってしまう。