日記「芦」
君も若いときにはよくバナナフィッシュを見ただろう? - "A Perfect Day for Bananafish" (Salinger) hackjs - JavaScript 2010/11/07(Sun.)JavaScript入門の為の文章 1. プログラミング言語とJavaScriptについて 1.1 プログラミングをするとは、プログラミング言語に定められた文法に沿 った記述をすることである。 1.11 プログラミング言語にはインタプリタ言語とコンパイル言語がある。 1.12 JavaScriptはインタプリタ言語である。 1.13 JavaScriptを記述する、とはJavaScriptの文法に沿って記述をテキスト エディタ(メモ帳など)で行うことである。 1.131 JavaScriptの記述はhtmlの内部に直接書き込むか、一旦jsファイル として作成したものをhtml内部に埋め込むか、である。 (1.132 htmlの勉強はぶっちゃけ、JavaScriptと同時にやってもそんなに問題ない。) 1.133 JavaScriptをhtmlの内部に直接書き込む方法。 最も単純で、必要最小限のソースを以下に示す。<html> <head> <script> </script> </head> </html>
<script>と</script>の間にJavaScriptの記述を行う。 実際には必要に応じてhtmlタグ「<何々>」を追加・削除する。 これを、任意のテキストエディタで記述し、htmlファイルとして保存する。 1.134 htmlファイルとして保存する、とはファイル名の最後に拡張子「.html」 を付加して保存することである(念の為)。 2. JavaScriptの文法について 2.1 JavaScriptの一つのプログラムは一つのコードで表す。 2.2 コードとはステートメントの集まりである。 2.21 JavaScriptを組む、とはステートメントを筆者、即ちプログラマが自由に選び並べて記述するものである。 2.22 記述したステートメントは上の行から下の行へ、一行の中では左から右へ、読み込まれ、実行される。 2.23 ステートメント同士は改行、または;(半角セミコロン)で区切る。 2.21 注釈をコードの中に書くことが出来る。 2.211 注釈は、筆者が混乱を防ぐ為の自由なコメントである。 2.212 コメントであることを示す為に、コメントを/*と*/で挟む。 2.213 あるいは//と記述すると、//から直後の改行までの一行をコメントとされる。/*コメント*/ //コメント /* コメ ント */
2.3 ステートメントは変数の宣言、関数の定義、変数の演算、変数の実行など。 2.4 変数とは値を格納するものである。 2.41 変数を扱う初めに変数の宣言を行う必要がある。 2.42 var x; 2.421 varは変数宣言を示す演算子。半角スペースを開けて変数名を書く。 2.432 変数名は変数を扱う為の名前であり、これは筆者が自由に定める。 2.433 複数のステートメントは;で区切る。;の代わりに,を使えば一つのステートメントになる。 2.434 コードを後から見やすくする為に、ステートメントとステートメントの間、あるいは ステートメントの間(但しこれは自由な箇所ではない)に半角スペースや改行を自由に入れてよい。 2.4341 入れてよい、というより入れるべきだ。 2.435 半角スペースのようにTabを入れてもよい。 2.4351 ステートメントの前にスペースを開けて見やすくするのをインデントと言う(丁度この文章のように)。 2.43 変数は複数個同時にも行える。 2.44 var x,y,z; 2.441 変数名同士を,(半角カンマ)で区切る。 2.442 var x, y, z; 2.4421 ,とyの間に特別なつながりは無いから、半角スペースを挿入し、見やすくしても構わない。 2.45 半角は半角。全角を基本的に使わない。混合すると一見して気付かないので注意。 2.451 プログラムが動かない、と思ったら全角スペースが一つ入っていただけ、という事がある。 2.5 変数の型 2.51 数値 2.511 2 2.512 十進法で半角の数字で書く。 2.513 コンピュータが用いることの出来る数字には上限と下限がある。 2.514 3.14 2.515 小数を記述するには.(半角ピリオド、ドット)を小数点として用いる。 2.52 文字列 2.521 "string" 2.522 文字列(半角・全角を問わない文字、\を除く全ての記号の並び)は"または'(半角クオーテンション)で括る。 2.53 相互変換 2.531 Number("32.4") 2.532 Numberは関数である。関数についてはいつかきっと話す。関数の後に半角括弧を書き、 その中に関数に渡す値を挟む。文字列"32.4"をNumberに渡すと数値32.4が返ってくる。 2.5321 関数に値を渡す、とは関数がその値を扱うよう促すことである。 2.5322 関数が値を返す、とはその関数を返す値に置き換えるということである。 2.53221 これより、結局「Number("32.4")」という記述は「32.4」という記述と同値である。 2.533var a=1; a.toString();
2.5331 二行目がそれである。 2.54 関数、オブジェクト 2.541 後述するので略 2.55 真偽値(フラグ、ブーリアン) 2.551 真をtrueまたは数値の0以外(慣例では1)、偽をfalseまたは数値の0で表す。 2.552 数学的に正しいステートが真を表す。 2.5521 >(半角大なり)、6lt;(半角小なり)、==(同値)、===(等価)、!=(not equal)、 !==(不等価)の両端に変数を置くことでtrue,false(1,0)を表せる。 2.5522 3>2;はtrueを示す。 2.5523 5<-2;はfalseを示す。 2.5524 4==2;はfalse。 2.5525 3=="3";は以外にもtrue。左は数値だから、右も数値として評価すべき、と解釈される。 2.5526 3==="3";はfalse。===は==を厳密にしたものである。 2.55261 厳密、とは値と変数の型まで加味することである。 2.5525 3!=="3";はtrue。 2.5526 "a"!="b";はtrue 2.56 Boolean(expression)はexpressionが真の時true,偽の時falseを返す。 2.6 変数の代入 2.61 x=3; 2.611 =(半角イコール)の左に変数名を書く。 2.612 =の右に記述したステートメントを記述する。 2.613 代入が実行される、とは=左の変数に=右のステートメントを評価したものを格納するという ことである。 2.6131 ステートメントを評価、とはステートメント内の計算があれば計算して、関数があれば 関数を実行するということである。 2.6132 格納とは、変数に値をコピーし、変数でその値を取り出せる状態である。 2.6133 x=5;y=x; 2.6134 xはx。5は数値の5。xに5を格納するとxとは5である。;yはy。xは5。yにxを格納するとyと は5である。 2.614 変数の宣言と代入とは同時に行える。 2.6141 var x=1; 2.6142 複数同時にも行える。 2.6143 var x=1,y=2; 2.6144 代入する値が同じなら、こんなこともできる。 2.6145 var A=B=1; 2.6146 変数の宣言を行う。AはA。B=1は、「BはB。1は数値1。Bに1を格納するとBとは1である。」 は1である。Aに1を格納するとAとは1である。、という二段階の構造によってAとBに代入 が行われる。 2.62 s="moji"; 2.621 代入される値が文字列だろうが何も変わらない。 2.7 数値の演算 2.71 演算は数値又は数値を格納する変数と数値又は数値を格納する変数の間に演算子を置くことで 記述する。 2.72 2+3;は2と3の加算である。 2.73 x=2+3; 2.74 同様に+,-,*,/は加算、減算、乗算、除算である。 2.75 %は剰余である。整数の割り算を行い、余りを計算結果として表す。 2.76 a=8%3;//aは2。 2.77 演算の順序は算数と同様に乗算と除算が優先される。 2.771 ()(半角括弧)を用いる。 2.78 変数x、値vについて演算・を用いたステートメントx = x・v;
は次のように省略することができる。x・=v;
2.781 vが1であり且つ演算・が+又は-の時、x = x・v; x・=v;
という2つはどちらも次のように省略することができる。x・・;
または・・x;
2.782 x++;はインクリメント、x--;はデクリメントと呼ぶ。 2.783 ここで2.22が適用されるので以下通り。 2.784 「x・・」はxを返してからx=x・1を行う。x=3;y=x++;
を実行した後、(x,y)=(4,3)である。 2.785 「・・x」はx=x・1を行ってからxを返す。x=3;y=++x;
を実行した後、x=y=4である。 2.79 文字列の演算 2.791 演算子は+しかない。 2.792 var str="cat"+"and"+"dog";//strは"catanddog" 2.8 関数 2.81 関数の定義 2.82 function f(x){return x} 2.83 functionは関数の定義(宣言)を示す演算子 2.84 その後に半角スペースを挟んで関数の名前を書く。 2.85 関数の名前は変数名と同様に筆者が自由に書く。 2.86 関数名の次には()を書く。()の中には必要に応じて引数名を書く。(引数については2.89) 2.87 引数は複数取ることもできる。 2.871 function f(x,y){return x+y;} 2.88 その次に{}(半角ブレース)を書き、その間に関数が行うコードを書く。 2.89 引数とは{}内コードで扱うことのできる変数のことである。 2.8A return x; 2.8A1 returnは関数の中で用いることのできる演算子である。 2.8A2 returnの後に半角スペースを挟んでステートメントを書く。 2.8A3 ステートメントを評価した値を関数は返す。("関数が値を返す"については2.5322) 2.8A4 returnを実行すると、関数を抜ける。 2.8A5 抜ける、とはコードの実行を終了するということである。 2.8A51 関数を抜ける、とは関数内のコードの実行を終了することである。 2.8B 値を返す必要のない関数にreturn文は不要。 2.82 関数の呼び出し。 2.821function f(x){ return x*2; } f(1);
fはxを引数として、returnによってx*2を返す。x*2はxと2を掛け合わせた者である。 即ちfは引数xを二倍にして返す。 んで四行目が関数の呼び出しである。 関数名を書き、その後に()を書く。 fはxを引数とするので、呼び出す時に、()の中に値を書くことでxとしてfに渡す。 ここでは1を記述したので、x=1として、fを呼び出した。 2.8211 「f(1);」は「2;」という記述と同じである。 2.83 関数とはルーチンの役割と数学的関数の役割との2つがある。 2.831 ルーチンは、引数を取らない、または値を返さない関数である。 2.832 必要の無い者はソレだけを記述しなければよい。 2.833function f1(){ return 3; } f1();
このf1という関数は定義の時に()内に引数名を書かなかったので、引数を取らない。 ただし、()は省略できない。呼び出しの時にも省略ができない。 2.834var a="nil"; function f2(str){ a=str+";"; } f2("test");
変数aを宣言、"nil"文字列を代入する。f2では変数に代入した。何も値を返さない。 2.832 数学的関数は、値を渡して、それに対応する値を返すことである。2.821の例がそれ。 2.84 関数の定義は関数の呼び出しの後に記述しても構わない。 2.841var 文字列変数A=""; 文字列変数Aの変更("てすと文字列"); function 文字列変数Aの変更(str){ a=str; }
2.85 実は、変数名、関数名、には2バイト文字(漢字、カタカナ、ひらがな)を用いてもよい。 2.851 ただし、2バイト文字を正しく扱えないような機器で実行すると正しく動かないかもしれない。 2.852 もちろん、変換ミスするかもしれない。 2.853 というか全角入力してると、スペースとして全角スペースを使ってしまう可能性がある。危険。 2.86 実は関数も変数の型の一つである。 2.861 function(x){return x*x;}; 2.862 この変数の定義の変数名を抜いたような形は無名関数と呼ばれる。 2.863 無名関数とは、関数の値のことである。 2.864 var f=function(x){return x*x}; 2.865 変数fを宣言して関数を代入した。fは関数である。 2.866 ただし、関数の代入は実行して初めて行われる。関数の定義とは違う。 2.861 よって、関数の呼び出しは、関数の代入の後に行う。(2.841のようなことはできない。) 2.862 以下はエラー・コードである。var f; f(2); f=function(x){return x*x;};
2.867 無名関数はその場で呼ぶことができる。(function(x){alert(x*x);})(2);
2.9 オブジェクト (配列変数を含む) 2.91 オブジェクトとは変数を集める一つの変数のことである。 2.92 次のようにオブジェクトxを定義する。var x={ value : 3, string : "test", func : function(x){return x.value}, y : {} };
つまり、{}(半角ブルース)で囲んでその中に「変数名 :(半角コロン) 値」を,(半角コンマ)で区切 ったステートメントを続けて書く。変数はオブジェクトに対して『要素』と呼ぶ。 2.93 参照・代入 2.931 x.valueによって数値「3」、x.funcによって関数「function(x){return x.value}」を参照できる。 またx.func()によって先の関数を実際に呼び出す。x.func(x)とすればx.value即ち数値「3」を返す。 2.9311 2.92においてfunction(x){}内の「x.value」の"x."は引数(x)を受ける。var xは関係ない。 2.932 代入もできるし、新たに要素を作ることもできる。x.value=5;//代入 x.value2 = 3.14;//新しい
2.9321 従って2.92のコードは次のコードに書き改めても良い。var x={}; x.value=3; x.string="test"; x.func=function(x){return x.value}; x.y={};
2.94 少し古い書き方もあり、今でも一応使える。矢張り2.92を書き改める。var x={ "value" : 3, "string" : "test", "func" : function(x){return x.value}, "y" : {} };
つまり、変数名を全て文字列にしたものである。 2.95 配列変数 2.951 配列変数aを次のように定義する。a=[0,3,"test",2];
つまり、[](半角大括弧)で囲み中に、値を,(半角コンマ)で区切ったステートメントを続けて書く。 変数は配列変数の『要素』と呼ぶ。 2.952 参照・代入 2.9521 a[0]で0、a[1]で3、a[2]で文字列"test"、a[3]で2を参照する。 2.9522 a[4]やa[10]でundefined(未定義を表す定数(代入できない変数))を返す。 2.9523 代入もできる(2.951のコードを改める)。var a=[]; a[0]=0; a[1]=3; a[2]="test"; a[3]=2;
2.9524 新たに要素も作ることもできる。var b=[0,1,1,2,3,5];//b[0]~b[5]を定義 b[6]=b[4]+b[5]; //b[6]を定義 b[10]=100; //いきなり(b[7]~b[9]を飛ばして)b[10]を定義
2.953 配列変数とはオブジェクトである(書き方が違うけど)。 JavaScriptでは配列のことをしばしば仮想配列と呼ぶ。 2.954 従って扱い方を相互に変えても構わない(次のコード)。var a=[1,2,3]; var x={v:3};
a["1"]で2が参照、x["v"]で3が参照される。 2.955 lengthはオブジェクトの持つ要素である。 2.956 オブジェクトに定義された要素の個数を返す。a=[1,2,3];b={c1:3,c2:10};
a.lengthは3、b.lengthは2である。 3. ビルトイン 3.1 基本的な関数やオブジェクトは初めから用意されている。 3.2 それはJavaScriptを実行する場、プラットフォームに依存する。 3.3 ここではインターネット・ブラウザで実行する場合。 3.4 関数として引数の文字列を警告文として表示するalert()や 引数の文字列を説明文として[はい]or[いいえ]の選択を促すconfirm() など。全てをここに載せると大変なのでwebで検索すべし(オススメはJavaScriptist)。 3.5 windowオブジェクト。 3.51 windowは一つのウィンドウに関する変数を集めるオブジェクトである。 3.52 例えばwindow.open()は新たにページを開く関数。 3.53 windowとはブラウザで表示した1ページ全体のことである。 3.531 ブラウザで扱うすべてはwindowオブジェクトの要素である。 3.532 var x;はwindow.xまたはwindow["x"]と同じ。 3.533 だから実はもうやっていたがwindow.xのwindow.は省略できる。 3.6 documentオブジェクト。 3.61 documentはドキュメント(文書)に関する変数を集めるオブジェクト 3.62 例えばdocument.URLはページのURLの文字列。document.write()は文書を書く関数。 3.7 locationオブジェクト。 3.71 locationはロケーション(URL)に関するオブジェクト 3.72 location.hrefはページのURLの文字列であり、しかも特殊なことはlocation.href="http://www.google.co.jp/";
とURL文字列の「代入」によってロケーションに反映される。つまりページを移動する。 4. メソッド 4.1 メソッドは基本的な関数のオブジェクトである。 4.2 JavaScriptの仕様で定められ、実行の場に依存しない。 4.3 Mathメソッド 4.31 Mathは数学に関する変数、関数を集めるオブジェクトである。 4.32 例えばMath.PIは3.1415・・・という定数(代入のできない変数)であり、 Math.sin()は正弦関数。必要に応じてMDCなどで検索すべし。 5. 構文 5.1 構文「●」とは●(){}
のことである。 ()内には●に応じた引数を書く。{}はブロックと呼びこの間に 実行したいステートメントを複数書く。 5.2 {}ブロックの中に{}ブロックを作ることもできる(この関係性をネスト、二重のネストと言ったりする)。 5.21 break;ステートメントは{}ブロックの中で用いることができ、{}から抜け出す。 5.22 この時、breakによって抜け出すのはbreakが書かれている{}で もっとも内側のもの一つだけである。●(){ ○(){ break;//内側である○(){}から抜ける。 } }
5.3if(expression){ }else{ }
5.31 上のコードではBoolean(expression)がtrueの時、初めの{}ブロック内の ステートメントを実行し、falseである時、else{}ブロック内のステートメント を実行する。 5.32 falseの時、何もしないのならばelse{}は丸々削除しても構わない。 5.33 {}ブロック内に書くステートメントが一つであるならば、{と}で囲まず直接 書くことができる。 5.331 ただし、else{}を省略せず、{と}を書かないならば、elseとステートメント は任意数の半角スペースによって区別する必要がある。var a=prompt("半角数字を入力","0"); if(a==1){alert("aは1です。");} //elseの省略 if(a>5)a=5; else a=1; //{と}は省略できる。 if(a%3==0)a=0,alert("aは3の倍数"); //2.433を実践してもよい。
5.4switch(variable){ case value1: case value2: case default: }
variableに引数を書き、ラベルを任意数書く。 switch構文に於けるラベルとは、「case (任意の名前):」である。 任意の名前とは引数の候補となる値である。 値がvalue1である時value1:に飛び、そこから書いてある ステートメントを最後まで実行する。いずれの候補に当たらない場合は default:に飛ぶ。default:は省略でき、いずれも実行されない。 5.41 最後まで実行されないことに注意。var a=1; switch(a){ case 1:alert(1); case 2:alert(2); }
というコードではalert(1);alert(2)が実行される。var a=1; switch(a){ case 1:alert(1);break; case 2:alert(2);break; }
とするとまた違う挙動をする。大抵の場合、こちらの挙動が望ましい。 5.42 ラベルの順序はdefault:も含めて任意であり、挙動は変化しない。 5.5 for構文(3ステートメント型)for(state1;state2;state3){ }
引数の代わりに3つのステートメントを書く。いずれも省略はできず、 書くことがないならば、具体的にはただ「;」と書けばよい。 5.51 実行においてはstate1;Boolean(state2)がtrueなら{}内。 次からは「state3;Boolean(state2)がtrueなら{}内。」を繰り返す。 Boolean(state2)がfalseになった時点で終了する。 5.52 ラベルを用いることができる。 5.53 ラベルは任意の半角英数からなる名前で変数の名前と規則は同じ。 5.54 例として「label」を選ぶと次のように書く。label:for(;;){ }
5.55 {}内でbreak label;と書くとlabel:for(;;){}から抜けることができる。 これは5.2のようなfor(;;){}がネストしてる場合に5.22の法則を打ち消すことができる。 5.6 for構文(走査型)for(variable in Object){ }
variableに変数、Ojbectにオブジェクトの変数を書いて、間に" in "で挟む。 5.61 これは次のように実行される。Objectとして変数objがobj={v1:c1,v2:c2,v3:c3}
である時、for(i in obj){・・・}
『i=v1;・・・を実行。 i=v2;・・・を実行。 i=v3;・・・を実行。』 5.62 上の例では・・・でobj[i]とすれば、c1、c2、c3が順に得られる。 5.63 サンプルコード(次のコードをコピペして『sample5.63.html』で保存)<html> <head> <script> document.open(); for(i in document){document.write("document."+i+" = "+document[i]);} document.close(); </script> </head> </html>
5.7 while構文while(expression){ }
引数にexpressionを取りBoolean(expression)がtrueにあるならば{}内、を 繰り返す。 5.71 よって{}中でexpressionが変化するような使用方法が理想である。 5.72 説明をズボラすればfor(;expression;); while(expression);
という2つは等価である。 5.8 do-while構文do{ }while(expression);
{}内をしてBoolean(expression)がtrueならもう一度繰り返す。 5.81 expressionに関わらず一度{}内を実行する処理である。 (5.82 C言語のif(){goto;}に相当し、{}があることから読解しやすい) 5.83 forのstate2や、whileのexpressionには数値iを用いることが多い。for(var i=0;i<10;i++){・・・;} var i=0;while(i<10){・・・;i++;}
iはイテレータの頭文字。 5.84 ネストする場合、イテレータは変えなければいけないことが多い。 iの次のjを使うことが多い。for(i=0;i<10;i++)for(i=0;i<10;i++){・・・1;} for(i=0;i<10;i++)for(j=0;j<10;j++){・・・2;}
1行目は・・・1を十回行う。 2行目は・・・2を百回行う。 5.85 for構文ブロックから呼ぶ関数の中でfor構文が起きた時イテレータが 同じ時、先の1行目のようなことが起きることがある。 6.変数(関数を含む)の範囲。 6.1 {}内でvar付きで宣言した変数はその中でしか扱えない。 6.2 この変数は{}のローカル変数と呼ばれる。 6.3 {}がネストしてる場合、宣言を含む{}の一番内側がその範囲である。 6.4 {}の外で宣言した変数または{}の中でvarを省略し宣言した変数はそれよりも内側の{}内で扱える。 6.41 varを省略する、とはx=0;
のように、「var x;」が事前にあったと仮定して変数に値を代入するステートメントである。 6.42 これは単なる省略ではなく、多少性質が異なるものである。 6.5 この変数をグローバル変数と呼ぶ。 6.6 同じ名前のローカル変数とグローバル変数がある時、ローカル変数であるとなされ、 またそれぞれ別の変数として値は保存される。 6.61 よってfor構文のイテレータの宣言ではvarを省略しないのが安全なコードである。 6.7 ローカル変数は{}を抜ける時に破壊される。 6.71 破壊とは変数の値にundefinedを代入し、後に使えなくすることである。 6.72 undefinedとは未定義(宣言されてないか、代入されてない)を示す値である。 7.new演算子とそれに関して 7.1 newとはプロトタイプをコピーする演算子である。var X = new F();
7.11 プロトタイプとは関数に設定される初期値を集めたオブジェクトである。 (7.12 コピーとはObject.cloneである。) 7.112 関数F()がある時、Fのプロトタイプは次のように代入する。F.prototype={ x1:3,x2:100,str:"moji" };
即ち、F.prototypeという変数に2.92のオブジェクトを代入すればよい。 よって次のように代入しても等価である。F.prototype.x1=3; F.prototype.x2=100; F.prototype.str="moji";
7.113 F.prototype.x1はF(){}内からthis.x1で参照できる。 7.13 コピーされた変数Xは、F.prototype.x1に、X.x1で参照、代入できる。 7.13 サンプルコードfunction Cat(name){ this.name=name; //Cat.prototype.nameに代入した } Cat.prototype={ name:"no_name",age:0, weight:2, miaow:function(){alert("にゃあ");} } myCat = new Cat("クロ"); alert(myCat.name+"の年齢は"+myCat.age+"才"); myCat.miaow();
8.他の演算子 8.1 delete演算子 8.11 delete、半角スペース、変数と続けて書くdelete演算子は変数を破壊する。 (8.12 破壊できる変数はvar付きで宣言した変数とオブジェクトの要素である。 8.121 オブジェクトの要素についてはprototypeが存在する場合、破壊とは prototypeの値に戻ることを意味する。) 8.12 最新のJavaScriptではvar付きで宣言した変数だろうが何だろうが破壊ができるようである。 8.13 破壊に成功したらtrue,失敗したらfalseを返す。var x=1;y=3; if(delete x){alert("xの破壊に成功");}else{alert("xの破壊に失敗");} if(delete y){alert("yの破壊に成功");}else{alert("yの破壊に失敗");}
8.2 typeof演算子 8.21 typeof、半角スペース、変数で変数の型、を文字列で返す。 8.22typeof 1 == "number"; typeof "abc" == "string"; typeof function(){} == "function"; typeof {} == "object"; typeof [] == "object"; //JavaScriptでは配列変数はオブジェクトだから typeof undefined == "undefined"; typeof true == "boolean"
8.3 二項演算子(?:演算子)expression?state1:state2
8.31 expressionが真ならstate1,偽ならstate2を評価して返す。 8.32 これは次と同義ではない。if(expression)state1; else state2;
ステートメントの中に含むことができる。var flg=true; var y=6*(flg?1:-1);
これはflgがtrueならy=6,falseならy=-6を実行する。 8.4 void演算子 8.41 void、半角スペース、ステートメントで、ステートメントを評価する。 評価した後何も返さない。これは「falseを返す」と見なされることがある。 実際そのように振舞う。 8.42 eval関数(演算子ではなく)と反対の者と考えられる。 8.421 eval()は引数にステートメントを取り、ステートメントを評価した後、 その値を返す関数。 9.特殊な 9.1特殊な数値 9.11 Infinityとは無限を示す数値である。 9.12 JavaScriptの計算では0による除算はエラーではない 9.121 正の数を0で割ると、(正の数)÷(+0)を意味してInfinityと同義である。 9.122 従って1/0==Infinityはtrueである。 9.2特殊なオブジェクト 9.21 nullは何も無いことを示すオブジェクトである。 9.22 引数に何も渡さない時に便宜上使ったりする。 9.23 Boolean(null)はfalse。 A.ビット演算 A.1 コンピュートとは2進法の処理である。 A.11 従って10進法での処理は不自然である。 A.12 2進法を2進法として扱うことをbit処理、bit演算と言う。 A.13 シフト演算 A.131 <<は左シフトである A.1311 n<<mはnを2^m(2のm乗)倍する。 A.1312 n>>mはnを2^mで割り小数点以下を切り捨てる。 A.1313 nを2進法にしてただ数値を移動(shift)しているだけである。 A.13131 演算子<<,>>は矢印、その右の数値は移動の個数。 A.13132 移動によって出来た空白は0で埋め、消えたところは消える。5=101b//数値の後のbはそれが2進法であることを示す。 5<<2=10100b=20 5>>1=10b=2
A.14 and,or,xor演算 A.141 a&b,a|b,a^bはそれぞれaとbのand,or,xorを返す。 A.1411 andは各ビットが1の時1を返す。a=10=1010b b=12=1100b a&b==1000b=8
A.1412 orは各ビットがどちらかが1なら1を返す。a=10=1010b b=12=1100b a|b==1110b=14
A.1413 xorは各ビットが片方のみが1なら1を返す。a=10=1010b b=12=1100b a&b==0110b=6
B.エラーの処理 B.1 文法のミス、未定義の変数の処理などでエラーが生じる。 B.2 try-catch構文try{ ・・・ }catch(e){ ・・・ }
try{}内のステートメントを実行し、内部でエラーが生じた時、そのエラーを 引数として続くcatch(){}内のステートメントが実行される。 B.3 エラー B.31 エラーとは次のオブジェクトである。{ message:"", fileName:"" }
B.32 messageはエラーの説明、fileNameはエラーの原因となった場所(URL等)を 文字列で保存する要素。 B.33 new Error("message","fileName");で作れる。第二引数は省略可。 B.4 throwはエラーを生じさせるステートメント。 throw、半角スペース、エラーオブジェクトを続けて書く。var err=new Error("こういうエラーが発生した。"); throw err;
2行目を実行した即エラーが生じ、ブラウザは各々の役割を果たす(エラーを 表示したり、など)。 B.5 B.2とB4は組み合わせることができる。 B.51 サンプルコード//入力してもらう数値xの逆数(1/x)をalertで表示する。 var x=prompt("xの逆数(1/x)を計算。xを入力せよ","1"); try{ if(x==0) throw new Error("devided by zero"); //エラーが生じた時点でtry{}を抜けcatch(e)を実行 alert("xの逆数は"+1/x+"。") }catch(e){ alert(e); }
C.JavaScriptにおける変数の自由性 C.1 javascriptでは一部のステートメントでは変数の型は一時的に変化する。 C.2 文字列が期待される場合(文字列を引数にとる関数、文字列との+演算による結合など) 文字列以外の変数は文字列になる。var x=1;//数値 var str="str:"+x; function f(x){alert(x);}//関数 alert(f); var x={ fizz:1 }; alert(x);
C.3 数値のみが期待されるステートメントでは数字からなる文字列は数字になる。var str="3";//文字列 alert(str*2);//数値「6」 alert(str+2);//文字列"32"
C.4 2.5521辺りと被ったが、==ではC.1が適用され、===では適用されない。 終り. 以上で一通りの文法を示した。 具体的にこうしたい時にどんな関数を使えばよいのか、といったことは一 つ一つwebで検索すればよい。 例えば、『1秒ごとに自動的に関数f()を呼びたい』時には、Googleで 『javascript 秒毎』と検索をしてみると、一番上に"window.setInterval" とある。(3.533によりwindow.は省略できるけど。)それを開いてみるか、 『setInterval』で再び検索してみるとよい。 以下の3つで検索すれば大体見つかる(上から順に試すと良い)。 逆に見つからないということは、JavaScriptでは出来ないのかもしれない。 #http://www.google.co.jp/ #http://javascriptist.net/ #https://developer.mozilla.org/ja/javascript 一般にJavaScriptで出来ないもの、というのはシステムに近いものである。 インターネットブラウザの上で動かすものであるので、例えばファイルを 保存する、とか逆に「これができたら危険」というのは出来ないと考えて 構わない。 JScriptはJavaScriptと同じ構文で書くMicrosoftの開発した言語である。 ブラウザ以外で動かすことができ、ファイル保存とか出来る(WSHのこと)。 ActiveXObjectとはJavaScriptにMicrosoftが付加した機能で、ブラウザ 上であってもJScriptみたいなことが結構できる。割と危険。Microsoft製 のInternetExploereでのみ動く。 一通りの文法と用語を覚えてしまえば、自在にjavascriptのコードを読む ことができ、新しい知識も簡単に身につけられる。 本で勉強するよりもインターネットで勉強するほうが情報量が多い。 先にも示した#http://javascriptist.net/の『Ajax/JavaScript関連ニュース』 が役立つと思う。 このページを最後までご覧になったということは、初心者、ということになる。 覚えなければいけないことはまだまだ沢山あるが、それにつれて JavaScriptって物凄く不安定で崩れやすいものな気がする。実際はそんなこと はない。必読として#http://d.hatena.ne.jp/mindcat/20100228/1267354768を 挙げよう。
2009-10-16 書初 2010-02-08 完成 (c)REM
コメ(0) | トラ(0)
(c)Kero's World