変数のスコープ

変数を定義するときには,とにかく var をつけておくのが良さそうだ。

  • 関数の外で定義した変数はグローバル
  • 関数の中で var を使って定義した変数はその関数内のローカル
  • 関数の中で 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

連想配列

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

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 == b0
a < b負の値

’===’ と ’==’

  • ‘===’ は型も含めて同一でなければ true にならない。
  • ‘==’ は型が違っても構わない。たとえば,数値の 10 と文字列の “10” が true になる。
var n = 10;
var s = "10";

with(document) {
    write("n = ", n, " ; type: ", typeof n, "<br>");
    write("s = ", s, " ; type: ", typeof s, "<br>");
    write("n === s : ", n === s, "<br>");      // false
    write("n == s : ", n == s, "<br>");        // true
}