2012年4月23日月曜日

JavaScript 文法まとめ

if-else文

if(i == 0)
  print("if clause");
else
  print("if clause");

switch-case文


var s = 'foo';

switch(s){

//s === 0が偽なので次へ
case 0:
 print('not here');
 break;

//s === s.lengthが偽なので次へ
case s.length:
 print('not here');
 break;

//s === (0).toStringが偽なので次へ
case(0).toString();
 print('not here');
 break;

//s === 'f' + 'o' + 'o';が真なので以下を実行
case 'f' + 'o' + 'o';
 print('here');
 break;

//もしすべてのcase式で同値演算が偽になれば、以下を実行
default:
 print('not here');
 break;
}
breakが無いと抜けないので注意。

while文


//紛らわしいインデント。2番目のprintは実際にはwhileループの外
while(flag)
 print("in loop");
 print("not in loop");

// ブロック文にすると構造が自明
while(flag){
 print("in loop");
 print("in loop");
 }

// ブロック文にすると構造が自明
while(flag){
 print("in loop");
 print("in loop");
 }

//文が一行でもブロック文にする
while(flag){
  print("in loop");
}
文中に他の文も書ける。

//入れ子のwhile
while(flag){
 while(flag2){
  print("in double loop");
  }
}

//while文の中のif文
while(flag){
 if(flag2){
  print("in loop");
  }
}
条件式が常に真の場合、無限ループになる。クライアントサイドJavaScriptではバグになる。 whileループを抜けるには、
  1. ループ内で、条件式が偽になる場合を保証する
  2. ループ内にbreak文を書く
  3. ループ内にreturn文を書く
  4. ループ内から例外を投げる

//10回ループが回るwhile文
var i = 0;
while (i < 10){
 print(i);
 i++;
}

do-while文

do-whileはwhileで十分事足りるのであまり使わないらしい。 do-whileを使うパターンは、事実上、次の2つ。
  1. 文を少なくとも1回実行しないと、条件式の評価に意味がでない場合
  2. 文を少なくとも1回実行することを保証したい場合

//do-whileを使う例
function printNumberFromRight(n){
 do {
  print(n % 10);
  n = ~~(n /10); //n /= 10と書くと結果が少数になる。~~演算は少数を整数にする(トリッキーな)技法
  } while (n > 0);
}

for文


//ループ変数iの宣言を初期化式で行う例
for (var i = 0; i < 10; i++){
 print(i);
}
※ここで変数iを参照できることに注意(スコープ内)
print("i =" + i);
//i = 10;

//有名なイディオム
for(var i = 0; i < 10; i++){
 print(i);
}

//ループ変数が1から始まり10回まわるループ。特別な理由が無い限り使わない。
for(var i = 1; i <= 10; i++){
 print(i);
}

//複数のループ変数の例
for(var i = 0, J = 0; i < 10 && j < 10; i++, j++){

for in文


//オブジェクトのプロパティ名の列挙
var obj = { x:1, y:2, z:3 };
for (var k in obj){
   print(k);
}
//実行結果
x
y
z

//オブジェクトのプロパティ値の列挙
var obj = { x:1, y:2, z:3 };

for (var k in obj){
  print(obj[k]); //obj.kではundefinedになる
}

//実行結果
1
2
3

for each in文

ECMAScriptにはないJavaScript独自拡張。 for inと異なり、変数にプロパティ名ではなくプロパティ値が代入される。

var obj = { x:1, y:2, z:3 };

for each (var v in obj){
  print(v);
}
//実行結果
1
2
3

break文


while(true){
 〜
 if(ループを抜ける条件){
    break;
    }
}

continue文

ループの中にcontinue文を書くと、それ以降のループ内の文をスキップしてループの条件式の評価に戻る。 forループであれば更新式と条件式の評価に戻る。

//ループ変数が偶数のときだけ処理をするforループ
for( var i = 0; i < 10; i++ ){
  if(i % 2 == 0){
  処理
  }
}

//continue書き換え版
for( var i = 0; i < 10; i++ ){
  if(i % 2 != 0){
    continue;
  }
  処理
}

ラベルを使ったジャンプ


入れ子になったループをbreakでぬけると、抜けるのは内部のループだけ。
while(条件式){
  print("outer loop");
  while(条件式){
   print("inner loop");
   if(ループを抜ける条件){
    break;
    }
   }
}
抜けるためにラベルを使える。

//ラベルを使い入れ子のループを同時に抜けるコード
outer_loop:
while(true){
 print("outer loop");
 while(true){
  print("inner loop");
  break outer_loop;
  }
}

return文

return文は関数の処理を中断し、指定した式の評価値を関数の返り値にする。 式が無い場合、関数の返り値はundefined値になる。
return 式

throw文

throw文で例外オブジェクト(例外値)を投げられる。
throw 式

try-catch-finally文

例外を補足する側はtry-catch-finally構文を使う。 catch節とfinally節の両方の省略はできない。 片方のみの省略は可能。

//try文の実行例
try{
  print('1');  
  null.x;    //ここで強制的にTypeError例外を発生
  print('not here');    //ここは実行されない
}catch (e){    //オブジェクトeはTypeErrorオブジェクトを参照
  print('2');
}finally{
  print('3');
}
//実行結果
1
2
3

with文

with文は一時的に名前(変数や関数名)の解決順序を変更するために使う。 with文に与える式の型はオブジェクト型。他の型の式を与えるとオブジェクト型に型変換する。 with文の中での変数名の解決は、式に与えたオブジェクトのプロパティから探し始める。 ECMAScript第5版のstrictモードはwith文を禁止している。

//with文の例
var x = 1;
var obj = { x:7, y:2 };
with (obj){
  print(x);
}
//実行結果
7

0 件のコメント:

コメントを投稿