JavaScriptでは、式はフレーズであり、ステートメントは文またはコマンド全体です。英語の声明が期間で終わるように、JavaScriptはセミコロンで終わります。
式は値を計算しますが、声明は何かを起こします。
「何かを実現する」方法の1つは、副作用で式を計算することです。割り当てや関数呼び出しなどの副作用を持つ式は、個別のステートメントとして使用できます。ステートメントとしてのこの式の使用法は、式ステートメントとも呼ばれます。同様のステートメントには、新しい変数を宣言したり、新しい関数を定義したりするために使用される宣言声明が含まれます。
JavaScriptプログラムは、一連の実行可能なステートメントのコレクションです。デフォルトでは、JavaScriptインタープリターは、書き込み順に順番に実行されます。 「何かを実現する」別の方法は、ステートメントのデフォルトの実行順序を変更することです。
1。条件ステートメント:JavaScriptインタープリターは、ステートメントや切り替えなど、これらのステートメントを実行またはスキップするかどうかを決定できます。
2。ループステートメント:声明のように、繰り返し実行できるステートメント
3。ジャンプステートメント:通訳者にプログラムの他の部分にジャンプして、壊れ、返品、スローステートメントなどの実行を継続することができます
次に、この記事では、JavaScriptにさまざまなステートメントとその構文を紹介します。この章では、最後にこれらの文章をまとめます。 JavaScriptプログラムは、分離によって分離されたステートメントのコレクションにすぎないため、JavaScriptステートメントをマスターすると、JavaScriptプログラムを作成できます。
1。式ステートメント
割り当てステートメントは、比較的重要な表現ステートメントです。それらの機能は、割り当てステートメントを実行するのと同じように、変数の値を変更することです。
コードコピーは次のとおりです。
Greet = "Hello" + name;
I *= 3;
増分演算子(++)と減少演算子( - )は、割り当てステートメントに関連しています。それらの機能は、割り当てステートメントを実行するのと同じように、変数の値を変更することです。
コードコピーは次のとおりです。
カウンター++;
削除演算子の重要な機能は、オブジェクトのプロパティ(または配列の要素)を削除することであり、一般的には複雑な式の一部としてではなく、ステートメントとして一般的に使用されます。
コードコピーは次のとおりです。
OXを削除します。
機能呼び出しは、式ステートメントのもう1つの主要なカテゴリーです。たとえば
コードコピーは次のとおりです。
アラート(挨拶);
window.close();
これらのクライアント機能は表現ですが、Webブラウザーに特定の影響を与えます。したがって、それは声明でもあると思います。たとえば、複雑な式や割り当て声明の一部でない限り、副作用なしに関数を呼び出すことは意味がありません。コサイン値をランダムに廃棄することは不可能です。
math.cos(x);
代わりに、COSINE値を取得するには、この値を将来使用できるように、変数に割り当てる必要があります。
var cx = math.cos(x);
繰り返しますが、コードの各行はセミコロンで終わります。
2。複合ステートメントと空のステートメント
いくつかの式をコンマオペレーターと連結して、式を形成できます。同様に、JavaScriptは、複数のステートメントが一緒になって複合ステートメントを形成することも伝えることができます。巻き毛の装具に複数のステートメントを包むだけです。したがって、次のコード行は、ステートメントを使用するJavaScriptのどこでも、別のステートメントとして使用できます。
コードコピーは次のとおりです。
{
x = math.pi;
cx = math.cos(x);
console.log( "cos(π)=" + cx);
}
ステートメントブロックには注意すべき点がいくつかあります。まず、ステートメントブロックはセミコロンを必要としません。ブロック内の要素ステートメントは、セミコロンで終了する必要がありますが、ステートメントブロックは終了しません。
第二に、ステートメントブロックの行はインデントされていますが、これは必要ありませんが、きちんとしたインデンテーションは、コードをより読みやすく理解しやすくすることができます。
第三に、JavaScriptにはブロックレベルの範囲がなく、ステートメントブロックで宣言された変数はステートメントブロックによって個人的に所有されていません。 (第3章の最初のセクション、10を参照)
JavaScriptプログラミングでは、多くのステートメントを大規模なステートメントブロックに組み合わせる実践が非常に一般的です。同様の式には通常、サブ発現が含まれています。多くのJavaScriptには他の置換が含まれています。形式に関しては、JavaScriptは通常、ステートメントブロックを置換に封じ込めることを許可します。例:whileループ本体には、1つのステートメントのみを含めることができます。ステートメントブロックを使用して、任意の数のステートメントをこのブロックに入れることができ、このステートメントブロックはステートメントとして使用できます。
JavaScriptでは、複数のステートメントを1つのステートメントとして使用する場合は、代わりに適合ステートメントを使用します。空のステートメント(空のステートメント)はまったく逆で、0のステートメントを含めることができます。空の声明は次のようになります:
;//セミコロン
JavaScriptインタープリターは、空のステートメントを実行するときに明らかにアクションを実行しませんが、練習は、空のループ本体を使用してループを作成する場合、ループ用の以下のような空のループを作成するときに空のステートメントが有用であることが証明されています。
コードコピーは次のとおりです。
//配列aを初期化します
for(i = 0; i <a.length; a [i ++] = 0);
このループでは、すべての操作は式A [i ++] = 0で完了し、ここではループ本体は必要ありません。ただし、JavaScriptでは、ループ本体に少なくとも1つのステートメントが含まれる必要があるため、ここでは空のステートメントを表すために別のセミコロンのみが使用されます。
ループの右側にあるセミコロンは、ループまたはIFステートメントが目立たないものであり、致命的なバグを引き起こす可能性があり、それらを見つけるのが困難であることに注意してください。たとえば、次のコードの実行結果は、著者が望んでいない効果である可能性があります。
コードコピーは次のとおりです。
if((a == 0)||(b == 0)); //このコード行は何もしません...
o = null; //このコード行は常に実行されます
特別な目的のために空のステートメントを使用する場合、コードにコメントを追加することをお勧めします。これは、この空のステートメントが有用であることを明確に示すことができます。
コードコピーは次のとおりです。
for(i = 0; i <a.length; a [i ++] = 0) /*empty* /;
3。宣言声明
VARと機能は、変数または関数を宣言または定義する宣言ステートメントです。これらのステートメントは、識別子(変数名と関数名)を定義および割り当て、プログラム内のどこでも使用できます。宣言ステートメントはそれ自体では何もしませんが、それは重要な意味を持っています。変数と関数を作成することにより、コードのセマンティクスをよりよく整理できます。
次のセクションでは、VARステートメントと関数ステートメントについて説明しますが、変数と関数のすべての内容を含むことはありません。
i.var
VARステートメントは、1つ以上の変数を宣言するために使用されます。その構文は次のとおりです。
var name_1 [= value_1] [、...、name_n [= value_n]]
キーワードVARの後に、宣言される変数のリストが続きます。リスト内の各変数には、初期化式を使用して初期値を指定できます。例えば:
コードコピーは次のとおりです。
var i; //単純な変数
var j = 0; //初期値の変数
var p、q; // 2つの変数
var greet = "hello" + name; //より複雑な初期化式
var x = 2.34、y = math.cos(0.75)、r、theta; //多くの変数
var x = 2、y = x * x; // 2番目の変数は最初の変数を使用します
var x = 2、
f = function(x){return x * x}、//各変数には1つの行排他的
y = f(x)
VARステートメントが関数本文に表示される場合、ローカル変数を定義し、その範囲はこの関数です。トップレベルのコードでVARステートメントを使用する場合、JavaScript全体に表示されるグローバル変数を宣言します。第3章、セクション10では、グローバル変数はグローバルオブジェクトのプロパティであると言及されています。次に、他のグローバルオブジェクトプロパティとは異なり、varによって宣言された変数を削除して削除することはできません。
VARステートメントの変数が初期化式を指定していない場合、この変数の値は最初は未定義です。したがって、宣言声明の前の変数の値は未定義です。
VARステートメントは、forループのコンポーネントまたはforループのコンポーネントとしても使用できることに注意する必要があります。 (ループの前に宣言された変数宣言と同じ、ここで宣言された変数も「高度」になります)。
コードコピーは次のとおりです。
for(var i = 0; i <10; i ++)console.log(i);
for(var i = 0、j = 10; i <10; i ++、j-)console.log(i * j);
for(var i in o)console.log(i);
同じ変数を複数回宣言するかどうかは関係ないことに注意してください。
II.機能
キーワード関数は、関数を宣言するために使用されます。関数式(4.3)を学びました。関数定義は、ステートメントの形式に書き込むことができます。例:2つの定義は、次の例コードに記載されています。
コードコピーは次のとおりです。
var f = function f(x){return x + 1;} //式を変数に割り当てます
関数f(x){return x + 1;} //変数名を含む文
関数宣言の構文は次のとおりです。
コードコピーは次のとおりです。
関数funcname([arg1 [、arg2 [...、argn]]]){
ステートメント
}
funcnameは、宣言される関数の名前識別子です。関数名の後には、コンマで区切られたパラメーターリストが続きます。関数を呼び出すとき、これらの識別子は関数に渡された実際のパラメーターを参照します。
関数本体はJavaScriptステートメントで構成されており、ステートメントの数に制限がなく、巻き毛装具に囲まれています。関数を定義する場合、関数本文のステートメントは実行されませんが、関数を呼び出すときに実行される新しい関数オブジェクトに関連付けられます。関数関数ステートメントのカーリーブレースが必要であり、これはループやその他のステートメントロックによって使用されるステートメントブロックとは異なることに注意してください。機能本文に1つのステートメントしかない場合でも、巻き毛のブレースはまだ締めくくります。
コードコピーは次のとおりです。
function hyteus(x、y){
return math.sqrt(x * x + y * y);
}
Hyteus(1、2)//=>2.23606797749979
関数facial(n){//再帰関数
if(n <= 1)1を返します。
n * facial(n -1)を返します。
}
フェイシャル(11)// => 39916800
関数宣言は通常、JavaScriptコードの上部に表示され、他の機能内にネストすることもできます。しかし、ネストされた場合、機能宣言はネストされた関数の上部にのみ表示されます。つまり、関数定義は、if、while、またはその他のステートメントに表示されません。
VARステートメントと同様に、関数宣言ステートメントによって作成された変数を削除することはできません。ただし、これらの変数は読み取り専用ではなく、変数値を書き直すことができます。
4。条件付きステートメント
条件付きステートメントは、指定された式の値が評価されるかどうかを判断することにより、特定のステートメントを実行またはスキップすることです。これらのステートメントは、「ブランチ」と呼ばれることもあるコードの「決定ポイント」です。 JavaScriptインタープリターがコードの「パス」に従って実行された場合。条件付きステートメントは、このパスのフォークポイントです。プログラムがこのポイントに到達したら、実行を継続するパスを選択する必要があります。
i.ifステートメント
ステートメントが基本的な制御ステートメントである場合。正確には、プログラムが条件付きで実行できるようになります。このステートメントには2つの形式があります。最初は
コードコピーは次のとおりです。
if(式)
声明
この形式では、式の値がtrueの場合、ステートメントステートメントを実行し、それが虚偽の場合はステートメントを実行しないでください。例えば、
コードコピーは次のとおりです。
if(username == null)// usernameがnullまたは未定義の場合
username = "Jack Wong"; //それを定義します
声明の声明の庭の括弧を囲む必要があることに注意する必要があります。
JavaScriptの構文は、キーワードと庭のブラケットを使用した式の場合、声明が続く必要があることを規定しています。ただし、ステートメントブロックを使用して複数のステートメントを1つに組み合わせることができます。したがって、IFステートメントの形式は次のようになります。
コードコピーは次のとおりです。
if(!address){
address = "";
メッセージ=「住所を郵送してください」
}
IFステートメントの2番目の形式は、Else句を導入し、式の値が偽の場合にelseロジックを実行します。
コードコピーは次のとおりです。
if(式)
ステートメント1
それ以外
ステートメント2
たとえば、次のコード
コードコピーは次のとおりです。
if(n == 1)
console.log( "1 new message");
それ以外
console.log( "you have" + n + "new Message");
IF/elseステートメントを使用する場合は、IFステートメントのネストされた使用でstatementsを使用する場合、elseステートメントが正しいifステートメントと一致するように注意する必要があります。次のコードを検討してください。
コードコピーは次のとおりです。
i = j = 1;
k = 2;
if(i == j)
if(j == k)
console.log( "i equals k");
それ以外
console.log( "I Dosent Equal J"); //エラー! !
この例では、内側のIFステートメントは、外側のIFステートメントで必要な条項を構成します。ただし、ifとelseの間の一致する関係は明確ではありません(インデンテーションのみが少しヒントを与えます)。この例では、JavaScriptインタープリターがそれを理解しているため、インデントによって与えられるヒントは間違っています。
コードコピーは次のとおりです。
if(i == j){
if(j == k)
console.log( "i equals k");
それ以外
console.log( "I Dosent Equal J");
}
ほとんどのプログラミング言語と同様に、JavaScriptのIFおよびその他のルールは、他のものが常に近くのIFステートメントと一致することです。この例を読みやすく、理解しやすく、メンテナンスとデバッグに便利にするには、巻き毛を使用する必要があります。
コードコピーは次のとおりです。
if(i == j){
if(j == k){
console.log( "i equals k");
} else {// crapeブレースコードの結果をより明確にします
console.log( "I Dosent Equal J");
}
}
多くのプログラマーには、巻き装置のIFおよびその他の声明の本体を囲む習慣があります(wordループのような一致する声明のように)。ブランチごとに1つのステートメントしかない場合でも、そうすることで、今すぐプログラムの曖昧な問題を回避できます。
ii.else if
if/elseステートメントは、式の計算結果を審査することにより、2つの分岐のいずれかを選択します。コードに多くのブランチがある場合、どうすればよいですか? 1つの解決策は、elseのIFステートメントを使用することです。それ以外の場合、実際のJavaScriptステートメントではない場合、それは単なるIF/他のステートメントを一緒に記述する方法です。
コードコピーは次のとおりです。
if(n == 1){
//コードブロックを実行します1
} else if(n == 2){
//コードブロック2を実行します
} else if(n == 3){
//コードブロック3を実行します
} それ以外 {
//前の条件がfalseで、コードブロック4が実行されます
}
この種のコードについて特別なものはありません。それは複数のIFステートメントで構成されており、各IFステートメントのElse句には別のIFステートメントが含まれています。構文等価コードは、IFステートメントのネストされた形式を使用して完了することができますが、これと比較して、Elseの執筆がより明確かつ好ましいことは明らかです。
iii.switch
プログラムの実行中、IFステートメントがブランチを作成し、複数のブランチを処理する場合は他のものを使用できます。次に、すべての分岐が同じ式の値に依存している場合、そうでない場合は最良の解決策ではない場合。この場合、複数のIFステートメントで式を繰り返し計算することは非常に無駄な慣行です。
スイッチステートメントは、この状況を処理するのに適しています。キーワードスイッチの後に、ガーデンブラケットに囲まれた式が続きます。次に、巻き毛のブレースに囲まれたコードブロックがあります。
コードコピーは次のとおりです。
switch(expression){
ステートメント
}
ただし、スイッチステートメントの完全な構文はこれよりも複雑です。ケースの後には、式とコロンが続きます。このマークアップ言語には名前がないことを除いて、ケースはマークアップ言語に非常に似ています。
それに続く式にのみ関連しています。このSwitchステートメントを実行すると、最初に式の値を計算し、次にCase句の式が式の値と同じかどうかを見つけます。 (同じことが「===」演算子と比較されます)。ケースが一致する場合、対応するコードが実行されます。一致するケースが見つからない場合、「デフォルト:」タグでコードブロックを実行します。 「デフォルト:」タグがない場合、スイッチはすべてのコードブロックをスキップします。
Switchステートメントは非常に簡単に混乱しており、例を使用した導入はより明確になります。次のスイッチステートメントは、今すぐIF/ELSEステートメントに相当します。
コードコピーは次のとおりです。
switch(n){
ケース1:// n === 1がここから始まる場合
//コードブロックを実行します1
壊す;
ケース2:
//コードブロック2を実行します
壊す;
ケース3:
//コードブロック3を実行します
壊す;
デフォルト:
//コードブロック4を実行します
壊す;
}
各ケースステートメントの最後にキーワードブレークが使用されることに注意する必要があります。後でブレークステートメントを紹介します。ブレークステートメントにより、通訳者がスイッチステートメントまたはループステートメントからジャンプすることができます。スイッチでは、ケースは実行されるコードの開始点のみを示しますが、エンドポイントは指定されません。ブレークステートメントがない場合、Switchステートメントは、式値の一致するケースタグでコードから実行を開始し、スイッチコードブロック全体の終了まで後続のステートメントを順番に実行します。もちろん、関数でスイッチステートメントを使用する場合は、returnを使用してBreakを置き換えることができます。戻りと破損は両方ともスイッチステートメントを終了するために使用されます。これにより、ケースステートメントが次のケースステートメントブロックの実行を継続しないようにします。
次のステートメントは実際の戦闘に近く、値のタイプに従って値を文字列に変換します。
コードコピーは次のとおりです。
関数変換(x){
switch(typeof x){
ケース「番号」://番号を16進変換します
x.toStringを返す(16);
ケース「文字列」:
return '"' + x + '"'; //二重引用符で2本の文字列を返します。
デフォルト://通常の方法を使用して他のタイプを変換します
return string(x);
}
}
console.log(convert(100255114))// => 5F9C58A
上記の2つの例では、ケースキーワードの後に直接番号と文字列が続きます。これは実際にはスイッチの最も一般的な使用法ですが、ECMaScript標準では、各キーワードは任意の式に従うことができます。
スイッチステートメントは、最初にスイッチキーワードの後に式を計算し、次に各ケースの後に上から下に順番に式を計算し、ケースに実行された式の値とスイッチの式の値が等しいことを知っています。各ケースのマッチング操作は、実際には「===」アイデンティティオペレーターの比較であり、「==」ではなく、式とケースのマッチングはタイプ変換を行いません。
スイッチステートメントが実行されるたびに、すべてのケース式を実行できるわけではありません。したがって、関数呼び出し式や割り当て式など、副作用を伴うケース式を避ける必要があります。最も安全な方法は、ケース式で定数式を使用することです。
前述のように、スイッチ式がすべてのケース式と一致しない場合、「デフォルト:」とマークされたステートメントブロックが実行されます。 「デフォルト:」タグがない場合、スイッチステートメント全体がスキップされます。前の例では、「デフォルト:」タグがスイッチの最後に表示され、すべてのケースタグの背後にあります。もちろん、これは最も合理的で最も一般的に使用される書き方です。実際、「デフォルト:」タグは、スイッチステートメント内にどこにでも配置できます。
5。ループ。
条件付きステートメントを理解するために、JavaScriptのコードをブランチパスと考えることができます。ループステートメントは、一部のコードを繰り返し実行できるようにするループステートメントです。 JavaScriptには4つのループステートメントがあります。次のセクションでは、すぐに説明します。最も一般的に使用されるループは、配列要素のトラバーサルです。 (7.6では、このループとアレイクラスで定義された特別なループメソッドについて詳しく説明します。)
I.
ステートメントが、プログラムを実行するブランチステートメントを選択するために使用される基本的な制御ステートメントである場合。 IFのように、whileステートメントも基本的なループステートメントであり、その構文は次のとおりです。
コードコピーは次のとおりです。
while(式)
声明
しばらくのステートメントを実行する前に、JavaScriptインタープリターは最初に式の値を計算します。その値が虚偽の値である場合、プログラムはループ本体の論理ステートメントをスキップし、プログラムの次のステートメントを実行します。その値が真である場合、ループボディステートメントのロジックが実行され、式式の値が計算されます。ループは、式の値が偽になるまで続きます。言い換えれば、式が真である場合、ステートメントはループで実行されます。 while(true)を使用すると、デッドループが作成されることに注意してください。
一般的に言えば、JavaScriptが同じ操作を繰り返し実行したくありません。ほぼすべてのループで、1つ以上の変数がループとともに繰り返し変化します。これらの変数が変更されているため、各ループで実行されるステートメント操作が異なるためです。さらに、変数を式で使用する場合、各ループの式の値も異なります。これは非常に重要です。真の値の初期値の原因となる表現は常に真の値であり、ループは終わりません。以下の例は、ループが値0-9を出力する一方であることを示しています。
コードコピーは次のとおりです。
var count = 0;
while(count <10){
console.log(count);
count ++;
}
この例では、変数カウントの初期値は0であり、ループ中にループが10回実行されると、その値が毎回1ずつ増加することがわかります。式の値はfalseプログラムされ、その後終了する間、JavaScriptインタープリターはプログラムの次のステートメントを実行します。ほとんどのループには、カウントのようなカウンター変数があります。カウンターは多くの場合、IJKのような変動名を使用しますが、コードをより読みやすくする場合は、より具体的な構文名を使用する必要があります。
ii.do/while
do/while loopは、上部ではなくループのテールでループ式を検出することを除いて、whileループと非常に似ています。つまり、ループ本体は少なくとも1回実行されることを意味します。 do/while loopの構文は次のとおりです。
コードコピーは次のとおりです。
する
声明
while(式);
do/ループは、ループ中ほど一般的に使用されていません。これは、少なくとも1回はループを実行したいのは実際には一般的ではないためです。以下は、do/while loopの例です
コードコピーは次のとおりです。
関数printArray(a){
var len = a.length、
i = 0;
if(len == 0)
console.log( "空の配列");
それ以外
する {
console.log(a [i]);
} while(++ i <len);
}
PrintArray([1,5,2,6])
do/while loopsとremormwhire loopsの間には2つの構文の違いがあります。まず、doループでは、キーワードを使用してループの開始を識別し、変数を使用してループの終了を識別し、ループ条件を入力して判断する必要があります。第二に、whileループとは異なり、doループはセミコロンエンディングを使用します。 whileループ本体が巻き毛の装具に囲まれている場合、whileループはセミコロンで終わりません。
iii.for
forステートメントは、より便利なループステートメント制御構造を提供します。 forステートメントは、一般的に使用されるループモードを簡素化します。ほとんどのループには、特定のカウンター変数があります。この変数は、ループが開始される前に初期化され、各ループの前にその値を確認します。最後に、カウンター変数は自己注入されています。そうしないと、サイクルが終了した後、次の判断の前に変更されます。このタイプのループでは、カウンターの3つの重要な操作は、初期化、検出、および更新です。 forステートメントは、これらの3つの操作をループ構文の一部として明示的に宣言し、それぞれがそれを表すために式を使用しています。ステートメントの構文は次のとおりです。
コードコピーは次のとおりです。
for(initialize; test; increment)
声明
初期化、テスト、および増分の3つの式は、セミコロンによって分離されます。彼らは、操作の初期化、環状状態の判断、およびカウンター変数の更新を担当しています。ループの最初の行にそれらを置くと、For Loopが何をしているのかを理解しやすくなり、カウンター変数の初期化または増分を忘れてしまいます。
ループがどのように機能するかを説明する最も簡単な方法は、ループ中に同等のものをリストすることです
コードコピーは次のとおりです。
初期化
while(test){
声明
インクリメント;
}
つまり、初期化式は、ループが開始される前に1回だけ実行されます。初期化式には副作用(通常は割り当てステートメント)が必要です。 JavaScriptは、変数を宣言して初期化できるように、VAR変数宣言ステートメントを使用した初期化式も許可します。各ループの前に、テスト式が実行され、式の結果が審査され、ループ本体を実行するかどうかが判断されます。各ループの前に、テスト式が実行され、結果がループ本体が実行されるかどうかを決定します。テスト結果が真の値である場合、ループ本体のステートメントが実行されます。最後に、増分式を実行します。また、有用性のために、ここでの増分式にも副作用が必要です。一般的に言えば、それは割り当て式または「++」と「 - 」で構成される式のいずれかです。
上記のループは、forループを使用して記述できます
コードコピーは次のとおりです。
for(var count = 0; count <10; count ++)
console.log(count)
もちろん、一部のループはより複雑で、複数の変数がループ内で一度に反復されます。 JavaScriptでは、このケースはコンマオペレーターで使用する必要があります。この場合は、初期化式と自動挿入式を1つの式に組み合わせて、forループで使用するために1つの式になります。
コードコピーは次のとおりです。
var i、j;
for(i = 0、j = 10; i <10; i ++、j-)
console.log(i * j);
これまでのところ、サンプルコードのループ変数はすべて数字です。もちろん、数字は最も一般的に使用されていますが、必要ではありません。次のコードは、forループを使用してテーブルデータの結果をトラバースし、リンクリストの最後のオブジェクトを返します(つまり、次の属性を含まない最初のオブジェクト)
コードコピーは次のとおりです。
関数テール(o){//リンクリストの最後のノードオブジェクトを返します
for(; o.next; o = o.next) /*empty* /// o.nextが真の値であるかどうかに基づいてトラバーサルを実行します
oを返します。
}
このコードには初期化式が含まれておらず、人とforループの3つの式のうちの1つは無視できますが、2つのセミコロンは不可欠です。テスト式が省略されている場合、それは死んだループになります。また、while(ture)タイプでは、死んだループを書く1つの方法は(;;)です。
iiii.for/in
for/inステートメントはforキーワードを使用しますが、ループの通常のループとは異なるタイプのループです。 for/inループの構文は次のとおりです
コードコピーは次のとおりです。
for(オブジェクトの変数)
声明
変数は通常、変数名、またはvarステートメントを介して宣言されたlvaluesまたは変数を生成できる式です。とにかく、それは割り当て式の左側に適用される値です。オブジェクトは式であり、この式の結果はオブジェクトです。同様に、ステートメントは、ループの本体を形成するステートメントまたは声明のブロックです。
forループを使用して配列要素を介して反復するのは非常に簡単です
コードコピーは次のとおりです。
var a = [1、3、5、 "44"];
for(var i = 0; i <a.length; i ++)//配列要素のインデックスを表します
console.log(a [i])//各配列の出力要素
for/inループは、オブジェクトメンバープロパティを便利に通過するために使用されます
コードコピーは次のとおりです。
for(o in o)//属性の名前を変数pに割り当てる
console.log(o [p]); //各属性の値を出力します
for/inステートメントを実行する過程で、JavaScriptインタープリターは最初にオブジェクト式を計算します。式がnullまたは未定義の場合、JavaScriptインタープリターはループをスキップし、後続のコードを実行します。式がプリミティブ値に等しい場合、このプリミティブ値はラッパーオブジェクトに変換されます(セクション3.6)。それ以外の場合、式自体はすでにオブジェクトです。 JavaScriptは、オブジェクトのプロパティを順番に列挙してループを実行します。ただし、各ループの前に、JavaScriptは変数式の値を計算し、属性名(文字列)を割り当てます。
for/inループである限り、バリバレの値は割り当て式のlvalueと見なすことができ、それはあらゆる表現である可能性があることに注意する必要があります。この式はすべてのループが計算されます。つまり、計算する値はループするたびに異なる場合があります。たとえば、次のコードを使用して、すべてのオブジェクトプロパティを配列にコピーできます。
コードコピーは次のとおりです。
var o = {x:1、y:2、z:3};
var a = []、i = 0;
for(o) /*empty* /;
document.write(a)// => x、y、z
JavaScriptアレイは単なる特別なオブジェクトであるため、for/inループはオブジェクトプロパティを列挙するなどのデータインデックスを列挙できます。たとえば、上記のコードの後にこのコードを追加すると、データインデックス0、1、2を列挙できます。
コードコピーは次のとおりです。
var o = {x:1、y:2、z:3};
var a = []、i = 0;
for(o) /*empty* /;
document.write(a)// => x、y、zオブジェクトプロパティを配列にコピーします
(私はa)
document.write(i)// => enumデータインデックス0 1 2
実際、for/inループは、オブジェクトのすべてのプロパティを通過しません。 「列挙可能な」属性のみが通過します(6.7を参照)。 JavaScript言語コアによって定義された組み込みのメソッドは「列挙可能」ではないためです。たとえば、すべてのオブジェクトにはtoString()がありますが、for/inループはプロパティtoString()を列挙しません。組み込みの方法に加えて、列挙できない多くの組み込みオブジェクトがあります。コードで定義されているすべての属性とメソッドは列挙可能です(セクション6.7が言及されますが、ecMascript5には列挙されない属性を作成できる特別な手段があります)。
オブジェクトは他のオブジェクトのプロパティを継承でき、ラインはカスタムプロパティ(6.2.II)を継承します。
for/inループ本体が未成年のプロパティを削除する場合、このプロパティは再び列挙されません。ループ本体がオブジェクトの新しいプロパティを定義する場合、これらのプロパティは通常列挙されません(ただし、JavaScriptのいくつかの実装は、ループ本体に追加されたプロパティを列挙できます)。
属性列挙の順序
ECMAScriptの仕様では、for forループがオブジェクトのプロパティをどの順序で列挙するかを指定しません。しかし、実際、主流のブラウザメーカーJavaScriptの実装は、属性定義の順序で単純なオブジェクトのプロパティを列挙し、最初に定義されたプロパティが最初に列挙されます。オブジェクトが直接数量の形で作成されている場合、直接数量のプロパティが表示される順序で列挙されます。 (一部のネットワークとJavaScriptライブラリはこの列挙順に依存していますが、ブラウザーメーカーはほとんどこの注文を変更しません)。以下の場合、列挙順序は特定の実装に依存します(相互作用ではありません)
1。オブジェクトは列挙可能な属性を継承します
2。オブジェクトには、整数アレイインデックスのプロパティがあります
3.削除を使用して、オブジェクトの既存のプロパティを削除します
4。Object.DefineProperty()または同様のメソッドを使用して、オブジェクトプロパティを変更します
6。ジャンプ
JavaScriptでは、ステートメントの一種がジャンプステートメントです。声明の理解から、JavaScriptの実行を1つの位置から1つの位置にジャンプさせることができます。
ブレークステートメントは、ループまたは他のステートメントの最後にジャンプすることです。継続ステートメントは、このループの実行を終了し、次のループの実行を開始します。 JavaScriptのステートメントには、ターゲットループまたはその他のステートメントタグを識別できます。
returnステートメントにより、通訳者は関数本体の実行から飛び出すことができます。この呼び出しの返品値を提供します。 Throwステートメントは、Try/Catch/最終的なステートメントで使用される例外をトリガーまたはスローします。これは、例外処理コードロジックを指定します。これは複雑なジャンプステートメントです。例外がスローされると、プログラムは最も近いクローズド例外スターにジャンプします。この例外プログラムは、同じ関数またはより高いレベルのコールスタックにあることができます。
次に、各ジャンプステートメントを説明します
私。タグステートメント
ステートメントにラベルを付けることができ、ラベルは声明の前に識別子とコロンで構成されています。
識別子:ステートメント
ステートメントのタグを定義することにより、このステートメントをプログラム内の任意のタグ名で参照できます。複数のステートメントのラベルを定義できますが、ループステートメントや条件付き判断ステートメントなど、ステートメントブロックのラベルを定義する場合にのみ便利です。ループのタグ名を定義することにより、ループボディの内側にブレークを使用して続行してループを終了するか、次のループの開始まで直接挑戦できます。 break and continue are the only statements in JavaScript that can use statement tags (this chapter will be discussed next). The following example, where the while loop defines a tag, and the continue statement uses this tag:
コードコピーは次のとおりです。
mainloop: while (token != null) {
//忽略这里代码...
continue mainloop; //跳转到下一次循环
//忽略这里的代码...
}
这里做标签的indentifier必须是一个合法的javascript标识符,而不能是一个保留字。标签的命名空间和变量或函数的命名空间是不同的,因此可以使用同一个标识符作为语句标签和作为变量名或函数名。语句标签只在它所起作用的语句(当然可以在它的子句)内是有定义的。一个语句标签不能和它内部的语句标签重名,但在两个代码不相互嵌套的情况下是可以出现同名语句标签的。带有标签的语句还可以带有标签,也就是说,任何语句可以有很多个标签。
ii.break
单独使用break语句的作用是立即退出最内存的循环或switch语句。它的语法如下:
壊す;
由于它能够使循环和switch语句退出,因此这种形式的break只能出现在这类语句中才是合法的。
我们在switch语句的例子中已经见到果break语句。在循环中,无论出于什么原因,只要不想继续执行整个循环,就可以用break提前退出。当循环终止条件非常复杂时,要函数体内使用break语句实现这样些条件判断的做法要比直接在循环表达式中写出这个复杂的终止条件做法简单的多。
下面的例子中循环遍历整个数组元素来查找某个特定的值,当整个数组遍历完成后正常退出循环,如果找到了需要查找的数组元素,则使用break语句退出循环:
コードコピーは次のとおりです。
for (var i = 0; i < a.length; i++) {
if (a[i] == target) break;
}
javascript中同样允许break关键字后跟随一个语句标签,(只有标识符,没有冒号)
break labelname;
当break和标签一块使用时,程序将跳转到这个标签所识别的语句块的结束,或者直接终止这个闭合语句块的执行。当没有任何闭合语句块指定break所用的标签,这时会产生一个语法错误。当使用这种形式的break语句时,带标签的语句不应该是循环或者switch语句,因为break语句可以“跳出”任何闭合的语句块。这里的语句可以是由花括号组起来的一组语句,使用同一个标签来识别一组语句。
break关键字和labelname之间不能换行。因为javascript可以给语句自动补全省略掉的分号,如果break关键字和标签之间有换行,javascript解释器会认为你在使用break不带标签的最简形式,因此会在break后补充分号.
当你希望通过break来跳出非就近的循环体或者switch语句时,就会用到带标签的break语句。下面是示例代码:
コードコピーは次のとおりです。
var matrix = getData(); //从某处获得一个二维数组
//将矩阵中所有元素进行求和
var sum = 0,
success = false;
//从签名处开始,以便在报错时推出程序。
compure_sum: if (matrix) {
for (var x = 0; x < matrix.length; x++) {
var row = matrix[x];
if (!row) break compure_sum;
for (var y = 0; y < row.length; y++) {
var cell = row[y];
if (isNaN(cell)) break compure_sum;
sum += cell;
}
}
success = true;
}
//break语句跳转至此
//如果success =false条件到达这里,说明我们给出的矩阵中有错误
//否则对矩阵中所有的元素进行求和
最后,需要注意的是,不管break语句带不带标签,它的控制权都无法越过函数的边界。比如:对于一条带标签的函数定义语句来说,不能通过函数内部通过这个标签来跳转到函数外部.
iii.continue语句
continue语句和break语句非常类似,但它不退出循环,而是转而执行下一次循环。continue语句的语法和break的语句语法一样简单
続く;
continue语句会也会带有标签
continue lebname;
不管continue语句带不带标签,它只能在循环体使用,在其它地方使用将会报语法错误。
当执行到continue语句的时候,当前的循环逻辑就终止了,随即执行下一次循环,在不同类型的循环中,continue的行为也有区别
1.在while循环中,在循环开始处指定expression会重复检测,如果检测结果为true,循环体会从头执行。
2.在do/while循环中,程序的执行至今跳转到循环的结尾处,这时会重新判断循环条件,之后才会继续下一次循环。
3.在for循环中,首先会计算自增表达式,然后再检测test表达式,用以判断是否执行循环体。
4.在for/in循环中,循环开始遍历下一个属性名,这个属性名赋给了指定的变量。
需要注意continue语句在while和for循环中的区别,while循环直接进入下一轮的循环条件判断,但for循环首先计算器increment表达式,然后判断循环条件。之前的章节讨论了和while循环“等价”的for循环行为。但由于continue在这两种循环中行为表现不同,因此使用while循环不可能完美的模拟等价的for循环。
下面这段代码展示了不带标签的continue语句,产生一个错误的时候跳过当前循环的后续逻辑
コードコピーは次のとおりです。
for (i = 0; i < data.length; i++) {
if (!data[i]) continue; //不能处理undefined数据
total += data[i];
}
和break语句类似,带标签的continue语句可以用在嵌套的循环中,用以跳出层次嵌套的循环体逻辑。同样和break语句类似,在continue语句和labname之间不能有换行。
iiii.return
回想一下,函数调用的一种表达式,而且所有的表达式都有值。函数中的return语句即是指函数调用后的返回值。这里是return语句的语法:
return expression;
return语句只能在函数体内出现,如果不是的话会报语法错误。当执行到return语句的时候,函数终止执行,并返回expression的值给调用程序。例如:
コードコピーは次のとおりです。
function square(x) {return x * x} //一个包含return的语句函数
square(4) //执行为16
如果没有return语句,则函数调用仅依次执行函数体内的每一条语句直到函数结束,最后返回调用程序。这种情况下,调用表达式的结果是undefined。return语句经常作为函数内最后的一条语句出现,但并不是说一定一定要放在函数的最后,即使在执行return语句的时候还有很多代码没有执行到,这时候函数也还返回调用程序。
return语句可以单独使用而不必带有expression,这样的话函数也会想调用程序返回undefined.例如:
コードコピーは次のとおりです。
//如果参数是null或者undefined则立即返回
if (!o) return;
//其它逻辑
由于javascript可以自动插入分号,因此,return关键字和它后面的表达式之间不能有换行。
iiiii.throw语句
所谓异常(excepion)是当发生了某种异常情况或错误时产生的一个信号。抛出异常,就是用信号通知发生了错误或异常状况。捕获异常是指处理这个信号,抛出异常,就是用信号通知发生了错误或异常状况。捕获异常是指处理这个信号,即采取必要的手段从异常中汇丰。在javascript中,当产生运行时错误或者程序使用throw语句时就会显式的抛出异常。使用try/catch/finally语句可以捕获异常,下一节会对它作详细介绍。
throw语句的语法如下:
throw expression
expression的值可以是任意类型的。可以抛出一个代表错误码的数组,或者包含可错误消息的字符串。当javascript解释器抛出异常的时候,通常采用Eeeor类型或其子类型,当然也可以使用它们。一个error对象有一个那么熟悉表示错误类型,一个message属性用来传递构造函数的字符串(参照第三部分的Error类),在下面的例子中,当使用非法参数调用函数时就抛出一个Error对象:
コードコピーは次のとおりです。
function fa(x) {
//如果输入的参数是非法的,则抛出一个异常
if (x < 0) throw new Error("x不能是负数。");
//否则计算出一个值,正常地返回它
for (var f = 1; x > 1; f *= x, x--) /*empty*/;
return f;
}
当抛出异常时,javascript解释器会立即停止当前正在执行的逻辑,并跳转至就近的异常处理程序。异常处理程序用try/catch/finally语句的catch从句编写的。如果抛出的异常没有一条关联catch从句,解释器会检测更高层的闭合代码块,看它是否关联相关的异常处理程序。以此类推,直到扎到一个异常处理的程序为止。
如果抛出的异常函数没有处理它的try/catch/finally语句,异常将向上传播到调用该函数的代码。这样的话,异常就会沿着javascript方法的词法结构和调用栈向上传播。如果没有找到任何异常处理的程序,javascript将吧异常当成程序错误来处理,并报告给用户。
iiiiii.try/catch/finally语句
try/catch/finally语句是javascript的异常处理机制。其中try从句定义了需要处理的异常所在代码块。catch语句跟随在try从句之后,当try块从某处发送了异常时,调用了catch内的代码逻辑。catch从句跟随finnlly块,后者防置了清理代码,不管try块中是否产生了异常,finnally块内的逻辑总会执行。尽管catch和finally都是可选的,但try从句只杀二者之一与组成完整的语句。try、catch和finally语句块都需要花括号括起来,这里的花括号是必须的。即使从句中只有一条语句也不能省略花括号。
下面的代码说明了try/catch/finlly的语法和使用目的:
コードコピーは次のとおりです。
試す{
//通常来讲,这里的代码会从头执行到尾而不会产生任何问题,
//但有时会抛出一个异常,要么是由throw语句直接抛出异常
//要么通过调用一个方法间接抛出异常
}
catch(e){
//当且仅当try抛出了异常,才会执行这里的代码
//这里可以通过局部变量e来获得对Error对象或者抛出的其它值的引用
//这里的代码可以基于某种原因处理这个异常,也可以忽略这个异常。
//还可以通过throw语句重新抛出异常
}
finally{
//不管try语句块是否抛出看异常,这里的逻辑总会执行,终止try的语句块方式有:
//1)正常终止,执行完语句块的最后一条语句
//2)通过break,continue或return语句终止
//3)抛出一个异常,异常被catch从句捕获
//4)抛出一个异常,异常未被捕获,继续向上传播
}
我们注意到,关键字catch后跟随了一对圆括号,圆括号内是一个标识符。这个标识符和函数参很像。当捕获一个异常时,把这个异常相关的值(比如Error对象)赋值给这个参数。和普通的变量不同,这条catch子句中的标识符具有块级作用域,它只在catch语句块内有定义。
这里有一个关于try/catch语句更实际的例子,这里使用了前面章节中提到factorial()方法,并使用客户端javascript方法prompt()和alert()来输入和输出
コードコピーは次のとおりです。
試す {
//要求用户输入一个数字
var n = Number(prompt("请输入一个正整数", ""));
//假设输入是合法的,计算这个阶乘
var f = factorial(n);
//显示结果
alert(n + "!=" + f);
} catch (ex) {
//如果输入不合法,将执行这里的逻辑
document.write(ex); //告诉用户发送了什么。
}
这里的try/catch语句并不包含finally从句。尽管finally不像catch那样经常使用,但有时候它还是非常有用。然而,我们需要更详尽的解释它的行为。不管try语句块中的代码执行完成了多少,只要try语句中有一部分代码执行了,finally从句就会执行。它通常在try从句的代码后用于清理工作。
关注下面这个例子
コードコピーは次のとおりです。
試す {
print("Outer try running..");
試す {
print("Nested try running...");
throw "an error";
} catch (e) {
print("Nested catch caught " + e);
throw e + " re-thrown";
} ついに {
print("Nested finally is running...");
}
} catch (e) {
print("Outer catch caught " + e);
} ついに {
print("Outer finally running");
}
// Windows Script Host 作出该修改从而得出WScript.Echo(s)
function print(s) {
document.write(s);
}
出力:
コードコピーは次のとおりです。
Outer try running..
Nested try running...
Nested catch caught an error
Nested finally is running...
Outer catch caught an error re-thrown
Outer finally running
7.其它语句类型。
本节讨论剩余的三种javascript语句:width,debugger和use strict
i.with语句
3.10讨论了作用域链(scope chain),一个可以按序检索的对象列表,通过它可以进行变量名的解析。width语句可以用来临时扩展作用域链:它具体有如下语法:
with (object)
statement
这条语句将object添加到作用域链头部,然后执行statement,最后把作用域链恢复到原始状态。
在严格模式下(5.7.iii)是禁止使用width的,在非严格模式下也是不推荐使用width语句的,尽可能的避免使用width语句。那些使用width语句的javascript非常难优化,而且比没有使用width的语句,它运行速度更慢。
在对象嵌套层次很深的时候,常会使用with语句来简化代码的编写。例如客户端javascript中,可能使用下面的这种表达式来访问表单的一个html元素
document.forms[0].address.value
如果这段代码多次出现,则可以使用with将form对象添加至作用域链的顶层。
コードコピーは次のとおりです。
with(document.forms[0]){
//直接访问表单元素
name.value="";
address.value="";
email.value ="";
}
这种方法简化了大量的输入,不用再为每个变量添加document.forms[0]前缀。这个临时对象挂载在作用域链上,当javascript需要解析诸如address标识符时,就会在这个对象中查找。当然,不使用with的语句代码可以写成这样。
コードコピーは次のとおりです。
var f = document.forms[0];
f.name.value = "";
f.adress.value = "";
f.email.value = "";
不要忘记,只有在查找标识符的时候才能用到作用域链,创建新的变量时候不使用它,看一下下面的代码:
コードコピーは次のとおりです。
with(o) x = 1;
如果对象o有一个属性x,那么这行代码给这个属性赋值1。如果o没有定义属性x,这段代码和不使用with的代码x=1是一模一样的。它给一个局部变量或者全局变量x赋值,或者创建全局对象的一个新属性。with语句提供了一种读取o属性的快捷方法,但并不会创建o的属性。
ii.debugger语句
debugger语句通常什么也不做。然而,在调试程序可用并运行的时候,javascript解释器将会(非必须)以调试模式运行。实际上,这条语句产生一个断点(breakpoint),javascript代码执行会停止在断点的位置,这时可用使用调速器输出变量的值,检查调用栈等。
例如加上调用函数f()的时候使用了未定义的参数,因此f()抛出一个异常,但无法定位到到底哪里出了异常。为了有助于调试这个问题,需要修改f():
コードコピーは次のとおりです。
function f(o){
if (o === undefined) debugger; //这段代码用来临时调试
console.log(1) //函数的其它部分
}
f();
这时候,当调用f()没有传入参数,程序将停止执行,这时候通过调用调速器检测调用栈并找出错误的原因。
在ECMAScirpt5中,debugger语句已经正式加入到专门语言里,但在很长的一段时间里,主浏览器的厂商已经将其实现了。注意,可用的调速器是远远不够的,debugger语句不会启动调试器。但如果调试器已经在运行,这条语句才会正在产生断点。例如,使用Firefox插件firebug,首先启动firebug,这样debugger语句才能工作。
iii.“use strict”
“use strict”是ECMASCript5引入的一条指令。指令不是语句(但非常接近于语句),“use strict”和普通语句之前有两个重要区别:
1.它不包含任何语言的关键字,指令仅仅是一个包含一个特殊字符串直接量的表达式(可以是使用单引号也可以是双引号)。
2.它只能出现在脚本代码的开始或者函数体的开始、任何实体语句之前。但它不必一定出现在脚本的首行或者函数体内的首行。因为“use strict”指令之前之后或之前都可能有其它字符串直接量的表达式语句,并且javascript的具体实现可能将它们解析为解释器自有的指令。在脚本或者函数体内第一条常规语句之后,字符串直接量表达式语句只当做普通的表达式语句对待,它们不做指令解析,它们也没有任何副作用。
使用“use strict”指令的目的是说明(脚本或函数中)后续代码解析为严格代码(strict code)。如果顶层(不在任何函数内)代码使用了“use strict”指令,那么它们就是严格代码。如果函数体定义处的代码是严格代码或者函数体使用了“use strict”指令,那么函数体的代码也是严格代码。如果eval()调用所处的代码是严格代码或者eval()要执行的字符串使用了“scrict code”指令,则eval()内的代码是严格代码。
严格代码以严格模式执行。ECMAScript5中的严格模式是该语言的一个受限的子集。它修正了语言的重要缺陷,并提供健壮的差错功能和增强安全机制。严格模式和非严格模式区别如下(前三条尤其重要)
•严格模式中禁止使用with语句
•严格模式中,所有的变量要先声明,如果给一个未声明的变量、函数、函数参数、catch从句参数或全局的对象的属性赋值。就会抛出一个引用错误异常(在非严格模式中,这种隐式声明全局变量的方法是给全局变量新添加一个新属性)
•严格模式中,调用的函数(不是方法)中的一个this值是undefined。(在非严格模式中,调用的函数中的this值总是全局变量)。可以利用这种特性来判断javascript实现是否支持严格模式。
コードコピーは次のとおりです。
var hasStrictMode = (function() {
"use strict";
return this === undefined
}());
•同样,在严格模式中,当通过call()和apply()来调用函数时,其中的this值就是通过call()或apply()传第一个参数(在非严格模式中,null和undefined值被全局对象转换为对象的非对象值锁代替)
•在严格模式中,给只读属性赋值和给不可扩展的对象创建成员都将抛出一个类型错误异常(在非严格模式中,这些操作只是简单的操作失败,不会报错)。
•在严格模式中,传入eval()代码不能再调用辰星所在的上下文中声明变量或定义函数,在非严格模式中是可以这样做的。相反,变量和函数的定义是在eval()创建的作用域中,这个作用域在eval()返回时就弃用了。
•在严格模式中,函数里的arguments对象拥有传入函数值的静态副本。在非严格模式中,agreements对象具有“魔术般”的行为,arguments里的数组元素和函数都指向同一个值的引用。
•在严格模式中,当delete运算符后面跟随非法的标识符(比如变量、函数、函数参数时)将会抛出一个语法错误,(在非严格模式下,这种delete什么也没做,并返回false)
•在严格模式中,在一对象直接量中定义两个或多个同名属性将产生一个语法错误(非严格模式下不会报错)
•在严格模式下,不允许八进制整数直接量。(以0为前缀,而不是0x为前缀)在非严格模式中是允许直接八进制直接量的
•在严格模式下,标识符eval和arguments当做关键字,他们的值是不能更改的。不能给这些标识符赋值,也不能把它们声望为变量,用做函数名,用做函数参数或用做catch块的标识符。
•在严格模式中限制了对调用栈的检测能力,在严格的模式的函数中,arguments,caller和arguments.callee都会抛出一个类型错误异常。严格模式的函数同样具有caller和arguments属性,当访问这两个属性时抛出类型错误异常。
8.javascript语句小结:
javascript语句语法:
| 声明 | 文法 | 使用 |
| 壊す | break[label]; | 退出最内侧循环或者退出switch语句,又或退出label指定的语句 |
| 場合 | case expression: | 在switch语句标记一条语句 |
| continue | continue [label]; | 重新开始最内层的循环或从新开始label指定的循环 |
| debugger | debugger; | 断点器调试 |
| default | default; | 在switch标记默认语句 |
| do/while | do statement while(expression); | while循环的一种替代形式 |
| empty | ; | 什么都不做 |
| のために | for(init;test;incr)statement | 一种简写的循环 |
| for/in | for(var in object)statement | 遍历一个对象属性 |
| function | function name([param[],...]){body} | 声明一个函数 |
| if/else | if (expr)statement1[else statement2] | 执行statement1或者statement2 |
| label | label:statement | 给statement指定一个名字:label |
| 戻る | return [expression]; | 从函数返回一个值 |
| switch | switch(expression){statements} | 用case或者“default:”语句标记多个分支语句 |
| 投げる | throw expression | 抛出异常 |
| 試す | try {statements} [catch {hander satements}] [finally {cleanup satements}] | 捕获异常 |
| use strict | "use strict" | 对脚本和函数使用严格模式 |
| var | avr name=[=expr][,...] | 声明并初始化一个或多个变量 |
| その間 | while (expression) statement | 基本的循环结构 |
| と | with(object) statement | 扩展作用域链(不赞成使用) |