関数定義に仮引数を書かなくても,arguments という配列に格納される。引数の数が不定の場合に便利。
function hello() { for (var i=0; i<arguments.length; i++) { document.write("hello,=", arguments[i], "<br>"); } return i; } hello("Andy", "Bill", "Charlie");
takatoh's blog – Learning programming languages.
関数定義に仮引数を書かなくても,arguments という配列に格納される。引数の数が不定の場合に便利。
function hello() { for (var i=0; i<arguments.length; i++) { document.write("hello,=", arguments[i], "<br>"); } return i; } hello("Andy", "Bill", "Charlie");
変数を定義するときには,とにかく var をつけておくのが良さそうだ。
関数の中で var を使った場合:
var v1 = "global v1"; function foo() { var v1 = "local v1"; document.write("in function: ", v1, "<br>"); // => "local v1" return "function called."; } document.write("before function call: ", v1, "<br>"); // => "global v1" foo(); document.write("avter function call: ", v1, "<br>"); // => "global v1"
before function call: global v1 in function: local v1 avter function call: global v1
関数の中で var を使わなかった場合:
var v2 = "global v2"; function bar() { v2 = "local v2"; document.write("in function: ", v2, "<br>"); return "function called."; } document.write("before function call: ", v2, "<br>"); bar(); document.write("avter function call: ", v2, "<br>");
before function call: global v2 in function: local v2 avter function call: local v2
function add (arg1, arg2) { var result = arg1 + arg2; return result; } add(2, 5); // => 7
Array の添字に整数(インデックス)じゃなくて文字列(キー)を使うと連想配列になる。
var pets = new Array(); pets["Andy"] = "dog"; pets["Bill"] = "cat"; pets["Charlie"] = "elephant"; for (name i pets) { document.write(name, ": ", pets[name], "<br>"); }
こりゃ気持ち悪い。整数の添字と混ぜるとどうなるんだ?
var pets = new Array(); pets["Andy"] = "dog"; pets[1] = "cat"; for (name in pets) { document.write(name, ": ", pets[name], "<br>"); }
なんでもないかのように動く。
というか,pets[1](添字が整数)と pets[“1”](添字が文字列)を区別していないような感じ。
var pets3 = new Array(); pets3[1] = "dog"; // 整数で代入 document.write(pets3[1], "<br>"); // 整数で参照 => "dog" pets3["1"] = "cat"; // 文字列で代入 document.write(pets3[1], "<br>"); // 整数で参照 => "cat"
やっぱり。
Array コンストラクタを利用する方法。引数に配列のサイズを指定できるけど,必要なら勝手に大きくなってくれる。
var a1 = new Array(); a1[0] = "dog"; a1[1] = "cat"; a1[2] = "elephant";
コンストラクタに値を直接渡す方法。
var a2 = new Array("dog", "cat", "elephant");
リテラル。
var a3 = ["dog", "cat", "elephant"];
要素の型は何でも良い。
var a4 = ["Andy", 16, new Date()];
長さを得るには length プロパティ。必要なら自動的に長くなる。
var a = new Array("andy", "bill", "charlie"); document.write(a.length, "<br>"); // => 3 a[4] = "eddy"; document.write(a.length, "<br>"); // => 5 document.write(a[3], "<br>"); // => undefined
↑a[3] は代入されてないので,undefind になる。
sort() メソッドに引数には,比較関数を渡す。単純に大小関係で比較するなら省略していい。
var a = [4,2,1,5,6,3]; a.sort(); for (i=0; i<a.length; i++) { document.write(a[i], ","); // => 1,2,3,4,5,6, }
比較関数は,2引数 a,b をとって 正の値/0/負の値 のいずれかを返すように作る。
a > b | 正の値 |
a == b | 0 |
a < b | 負の値 |
例外処理。
try { var today = Date(); today.set_month(3); // no such method. } catch (e) { document.write(e); // => [object Error] }
例外を発生させるには throw かな。
var i = 0; while (i < 10) { document.write(i++, "<br>"); }
ループの停止は break,中断(スキップ)は continue。
var i = 0; while (true) { i++; if (i % 2 == 0) continue; if (i <= 10) break; document.write(i++, "<br>"); }
var animals = Array("dog", "cat", "elephant"); // 配列 for (x in animals) { document.write(x, "<br>"); }
var sum = 0; var i; for (i=1; i<=10; i++) { sum += 1; } document.write(sum, "<br>");
var val1 = 5; var val2 = 4; if (val1 < val2) result = val2; else result = val1; document.write(result);
実行するステートメントが複数なら { } で囲む。
条件演算子もある。
val1 < val2 ? val2 : val1;