新JavaScript入門  JavaScript,Neo-Generation  DOM  WSH  掲示板  表紙
1.はじめのいっぽ  3.GUI部品 
新JavaScript入門
2. 値と変数
変数には表面的には型はありませんが、 内部的には以下のような型があります。
    数値型
    文字列型
    ブーリアン型
    オブジェクト型
 
ブーリアン型は true または false を取るものです。 オブジェクト型は、ページ上のボタン、ウィンドウ、といったようなものや、 日付、配列などの型やユーザ定義型オブジェクトの総称的なものです。 オブジェクト型はこれらの型のスーパークラスになっています。
数値型は JScript では内部的には64ビットの浮動小数点数だそうですが、 どこかで32ビット整数を使っているようです (JavaScript重箱の隅)。
リテラル
数値型には以下の表現方法があります。
    10      //10  10進数
    010     //8    8進数
    0x10    //16  16進数
    10.0    //10  小数表示
    1.0E+1  //10  指数表示
 
符合を除いて頭に0がついた整数は8進数ですが、 8か9があると10進数になります。
    018     //18  10進数
 
小数表示と指数表示には様々なバリエーションがあります。
    10.
    1E1
    1e+01
 
文字列はシングルクォートかダブルクォートで括ります。 違いはほとんどありませんが、 シングルクォートで括ればダブルクォートをエスケープする必要はなく、 逆も言えます。
特殊な値
undefined はまだ変数に値が代入されていないときなどに 取られる値です。この値を変数に代入することはできません(JScript5.0では)。
null は空といったような意味で使われます。 こちらは代入できます。
NaN は Not a Number という意味で、 数値に変換しようとしてできなかった場合に取られる値です。これは数値型です。
型の変換
JavaScript は他のスクリプトと同様に 値はそのとき要求される型に変換されます。例えば、
    a = 1;          //数値型
    b = "" + a;     //文字列と結合するため文字列型に
                    //( 演算子 + は文字列の結合 )
 
a は文字列と結合する前に文字列に変換されます。
このように演算子 + を使うと簡単に変わりますが、 その規則はだいたい次のようなものです。
    文字列型とその他とでは文字列型になる。
    ブーリアン型が文字列になるときは "true" or "false" になる。
    数値型とブーリアン型とでは数値型になる。
    ブーリアン型が数値型になるときは、 true → 1 false → 0 。
 
この辺のことを調べた JavaScript が
ここにあります。 試してみてください。 Netscape Navigator と Internet Explorer では若干動作が異なります。
上と逆に文字列を数値にするには、
    a = "1";    //文字列型
    a = a - 0;  //引き算をするため文字列型を数値型に
    a = a * 1;  //掛け算でもいいが遅い、たぶん
 
で、 a = 1 と文字列型から数値型になります。
例を挙げてみましょう。
    a = "1E+2" - 0;     //100
    a = "0xFF" - 0;     //255
    a = "11 11" - 0;    //NaN
    a = "11a" - 0;      //NaN
    a = "true" - 0;     //NaN
 
実は、文字列を数値型にするには、parseIntparseFloat という関数が用意されています。 こちらの方がもう少し柔軟に数値に変換してくれます。 少し遅いですが。
    a = parseInt("11 11");      //11
    a = parseInt("11a");        //11
    a = parseInt("true");       //NaN
    a = parseInt("v11a");       //NaN
 
if や三項演算子などのブール値が要求される場面では、 ブーリアン型に変換されるものと思われます。
    var a, b;
    a = 1 ? true : false;       //true
    a = 0 ? true : false;       //false
    a = 0.1 ? true : false;     //0以外ならtrue
    a = "" ? true : false;      //長さ0の文字列はfalse
    a = "0" ? true : false;     //長さ1の文字列はtrue
    a = b ? true : false;       //undefinedはfalseに変換
    a = null ? true : false;    //nullも同じ
    a = NaN ? true : false;     //NaNも
    //text1が定義されていればtrue、されていなければfalse
    a = document.form1.text1 ? true : false;
宣言
変数は、 var というキーワードを付けて宣言します。
    var i;      //宣言
    var j, n;   //まとめて宣言
    var a = 1;  //ついでに代入
 
変数は宣言しただけでは値はなく undefined となってしまいます。 変数は値を代入してから使わなければなりません。
記憶域
変数は宣言する場所によって、記憶域が決まります。 すなわち、関数オブジェクトの内側で宣言すればローカル、 外側で宣言すればグローバルとなります。
ブロックの中で宣言してもその関数オブジェクトの中で使えます。
    function test() {
        var i;
        for(i = 0; i < 2; i++) {
            var a;
            a = i;
        }
        
        if(!a)      //undefinedなら
            alert("a は未定義です");
        else        //でも本当はこちら
            alert("a = " + a);
    }
 
for の初期化部分でも宣言できますが、ブロックの外側でも使えてしまいます。
    for(var i = 0; i < 4; i++)
        ...
    alert(i);       //4
 
関数オブジェクトの内側の関数オブジェクトで変数が宣言されていれば、 内側の関数オブジェクト内が記憶域です。
    function kappa() {
        this.cry = function() {
            var a = "いたいケロ";
            alert(a);
        }
        this.cry2 = function() {
            alert(a);   //aは宣言されていない
        }
    }
    
    var c = new kappa();    //カッパオブジェクト
    c.cry();                //いたいケロ
    c.cry2();               //エラー
 
実は、宣言しなくても変数は使えて、その場合グローバルになるのですが、 なるべくならきちっと宣言するようにしましょう。
他のウィンドウとのやりとり
他のウィンドウの変数はそのウィンドウが参照できれば参照できます。
    window.variable
 
例は次のようです。
    var w;
    function test5() {
        if(!w)          //ウィンドウが開いていない場合
            w = window.open("js202_1.htm");
        else            //ウィンドウが開いている場合
            alert(w.a);
    }
 
ボタンを押すとウィンドウが開きます。 次にボタンを押すとそのウィンドウの a という変数の値が表示されます。 その開かれるウィンドウのコードは次のようです。
    var a = 0;
    
    function increment() {
        a++;
    }
 
このウィンドウにはボタンがついており、 そのボタンを押すと押すと変数 a の値が1増します。
これを何回か押した後、元のウィンドウのボタンを押してみましょう。
ウィンドウを参照できない場合は Cookie を使いましょう。
    var isopen = false;
    function test6() {
        if(!isopen) {    //ウィンドウが開いていない場合
            window.open("js202_2.htm");
            isopen = true;
        }
        else             //ウィンドウが開いている場合
            alert(getCookie("a"));
    }
    
    function getCookie(item) {
        //以下略
 
開かれるウィンドウのコードは次のようです。
    var a = 0;
    document.cookie = "a=" + a;
    
    function increment() {
        a++;
        document.cookie = "a=" + a;
    }
 
first, back, next, exit
Written 9/19/97
Modified 5/24/99
Modified 3/23/03