Javascriptコア読解文章_JavaScriptスキル

WBOY
リリース: 2016-05-16 16:14:37
オリジナル
1091 人が閲覧しました

JavaScript では、式はフレーズであり、ステートメントは文全体またはコマンドです。英語のステートメントがピリオドで終わるのと同じように、JavaScript もセミコロンで終わります。

式は値に評価されますが、ステートメントは何かを実行します。

「何かを実現する」方法の 1 つは、副作用を伴う式を評価することです。代入や関数呼び出しなどの副作用のある式は、別のステートメントとして扱うことができます。この式をステートメントとして使用することは、式ステートメントとも呼ばれます。同様のステートメントには、新しい変数を宣言したり、新しい関数を定義したりするために使用される宣言ステートメントが含まれます。

JavaScript プログラムは、実行可能なステートメントのコレクションです。デフォルトでは、JavaScript インタープリターはそれらを順番に実行します。 「何かを実現する」もう 1 つの方法は、ステートメントのデフォルトの実行順序を変更することです:

1. 条件文: JavaScript インタプリタは、式の値に基づいて、if 文や switch 文などの文を実行するかスキップするかを判断できます。

2. ループ文: while 文や for 文など、繰り返し実行できる文

3. Jump ステートメント: インタプリタがプログラムの他の部分にジャンプして、break、return、throw ステートメントなどを実行できるようにします

次の記事では、JavaScript のさまざまなステートメントとその構文を紹介します。この章はこれらの声明の要約で終わります。 JavaScript プログラムは区切りで区切られたステートメントの集合にすぎないため、JavaScript ステートメントをマスターすれば、JavaScript プログラムを作成することができます。

1. 式ステートメント

代入ステートメントは比較的重要な式ステートメントであり、その機能は、代入ステートメントを実行するのと同じように、変数の値を変更することです。たとえば、

コードをコピーします コードは次のとおりです:

挨拶 = "こんにちは" 名前;
i *= 3;

インクリメント演算子 ( ) とデクリメント演算子 (--) は代入ステートメントに関連しています。その目的は、代入ステートメントを実行するのと同じように、変数の値を変更することです。

コードをコピーします コードは次のとおりです:

カウンター ;

delete 演算子の重要な役割は、オブジェクトの属性 (または配列の要素) を削除することであるため、通常は複雑な式の一部としてではなく、ステートメントとして使用されます。

コードをコピーします コードは次のとおりです:

o.x を削除;

関数呼び出しは、

などの式ステートメントのもう 1 つの主要なカテゴリです。

コードをコピーします コードは次のとおりです:

アラート(挨拶);
window.close();

これらのクライアント側関数は式ですが、Web ブラウザーに一定の影響を与えます。したがって、ステートメントについても考えます。たとえば、複雑な式や代入ステートメントの一部でない限り、副作用のない関数を呼び出すことは意味がありません。コサイン値を気軽に捨てることはできません。

Math.cos(x);

対照的に、コサイン値を取得するには、その値を将来使用できるように変数に代入する必要があります。

var cx = Math.cos(x);

コードの各行はセミコロンで終わることをもう一度皆さんに思い出してください。

2. 複合ステートメントと空のステートメント

カンマ演算子を使用して、複数の式を結合して 1 つの式を形成できます。同様に、JavaScript では複数のステートメントを組み合わせて複合ステートメントを形成することもできます。複数のステートメントを中括弧で囲むだけです。したがって、次のコード行は 1 つのステートメントとして扱うことができ、ステートメントが必要な JavaScript 内のどこでも使用できます。

コードをコピー コードは次のとおりです:

{
x = Math.PI;
cx = Math.cos(x);
console.log("cos(π)=" cx);
}

ステートメント ブロックについては、いくつか注意すべき点があります。 まず、ステートメント ブロックにはセミコロンが必要ありません。ブロック内の要素ステートメントはセミコロンで終わる必要がありますが、ステートメント ブロックはセミコロンで終わりません。

2 番目に、ステートメント ブロック内の行はインデントされます。これは必須ではありませんが、きちんとインデントするとコードが読みやすくなり、理解しやすくなります。

第三に、JavaScript にはブロックレベルのスコープがなく、ステートメント ブロックで宣言された変数はステートメント ブロックに対してプライベートではありません。 (第 3 章の最初のセクション、セクション 10 を参照)

多くのステートメントを大きなステートメント ブロックにマージする手法は、JavaScript プログラミングでは非常に一般的です。同様の式にはサブ式が含まれることが多く、多くの JavaScript には他のサブステートメントが含まれます。正式に言えば、JavaScript では通常、ステートメント ブロックに 1 つのサブステートメントを含めることができます。たとえば、while ループのループ本体にはステートメントを 1 つだけ含めることができます。ステートメント ブロックを使用すると、このブロックに任意の数のステートメントを含めることができ、このステートメント ブロックを 1 つのステートメントとして使用できます。

JavaScript で、複数のステートメントを 1 つのステートメントとして使用する場合は、代わりに一致するステートメントを使用します。空のステートメントはその逆で、ステートメントを 0 個許可します。空のステートメントは次のようになります:

;//セミコロン

JavaScript インタプリタは、空のステートメントを実行するときに明らかにアクションを実行しませんが、次の for ループなど、空のループ本体を持つループを作成する場合には、空のステートメントが役立つ場合があることが実践的に証明されています

コードをコピーします コードは次のとおりです:

//配列 a
を初期化します for (i = 0; i

このループでは、すべての演算は式 a[i]=0 で完了し、ここではループ本体は必要ありません。ただし、JavaScript ではループ本体に少なくとも 1 つのステートメントが含まれている必要があるため、ここでは空のステートメントを表すために 1 つのセミコロンが使用されています。

for ループ、while ループ、または if ステートメントの右括弧内のセミコロンは非常に目立たないため、いくつかの致命的なバグを引き起こす可能性があり、これらのバグは見つけるのが難しいことに注意してください。たとえば、次のコードの実行結果は、作成者が意図しない結果である可能性があります:

コードをコピーします コードは次のとおりです:

If((a==0)||(b==0)); //このコード行は何も行いません....
o = null; // このコード行は常に実行されます

特別な目的で空のステートメントを使用する場合は、コードにコメントを追加して、この空のステートメントが役立つことを明確にすることをお勧めします

コードをコピーします コードは次のとおりです:

for (i = 0; i

3. 宣言文

Var と function は、変数または関数を宣言または定義する宣言ステートメントです。これらのステートメントは、プログラム内のどこでも使用できる識別子 (変数名と関数名) を定義し、値を割り当てます。宣言ステートメント自体は何も行いませんが、変数と関数を作成することによって、コードのセマンティクスをより適切に整理できるという重要な意味があります。

次のいくつかのセクションでは、var ステートメントと function ステートメントについて説明しますが、変数と関数の内容をすべて網羅しているわけではありません。

i.var

var ステートメントは、1 つ以上の変数を宣言するために使用されます。その構文は次のとおりです。

var name_1[ = value_1][, ..., name_n[ = value_n]]

キーワード var の後には、宣言する変数のリストが続きます。リスト内の各変数には、初期値を指定するために使用できる初期化式を含めることができます。例:

コードをコピー コードは次のとおりです:

var i; // 単純な変数
var j = 0 //初期値を持つ変数
var p, q; // 2 つの変数
vargreet = "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}, // 各変数は行
に排他的です y = f(x)

var ステートメントが関数本体にある場合、ローカル変数が定義されており、そのスコープはこの関数です。トップレベルのコードで var ステートメントを使用すると、JavaScript 全体で参照できるグローバル変数が宣言されます。これについては、第 3 章のセクション 10: グローバル変数はグローバル オブジェクトの属性であると説明されていますが、他のグローバル オブジェクト属性とは異なり、var で宣言された変数は delete によって削除できません。

var ステートメント内の変数で初期化式が指定されていない場合、この変数の値は最初は未定義です。したがって、宣言文より前の変数の値は不定となります。

var ステートメントは、for ループまたは for/in ループのコンポーネントとしても使用できることに注意してください。 (ループの前に宣言された変数宣言と同じように、ここで宣言された変数も「アドバンスト」になります)、例:

コードをコピーします コードは次のとおりです:

for (var i = 0; i for (var i = 0, j = 10; i for (var i in o)console.log(i);

同じ変数を複数回宣言しても問題ないことに注意してください。

ii.関数

キーワード function は関数を宣言するために使用されます。関数定義はステートメントの形式で記述できることをすでに学習しました。例: 以下のサンプルコードの 2 つの定義記述メソッド:

コードをコピーします コードは次のとおりです:

var f = function f(x) {return x 1;} //式を変数に代入
function f(x){return x 1;} //変数名を含むステートメント

関数宣言の構文は次のとおりです:

コードをコピーします コードは次のとおりです:

function funcname([arg1[, arg2[..., argn]]]) {
ステートメント
}

funcname は、宣言される関数の名前識別子です。関数名の後には、カンマで区切られたパラメータのリストが続きます。関数が呼び出されるとき、これらの識別子は関数に渡される実際のパラメータを参照します。

関数本体は JavaScript ステートメントで構成され、ステートメントの数に制限はなく、中括弧で囲まれます。関数が定義されると、関数本体内のステートメントは実行されませんが、関数が呼び出されたときに実行される新しい関数オブジェクトに関連付けられます。関数ステートメントでは中括弧が必要であることに注意してください。これは、while ループや他のステートメント ロックで使用されるステートメント ブロックとは異なります。関数本体にステートメントが 1 つしかない場合でも、それを囲むために中括弧が必要です。

コードをコピー コードは次のとおりです:

関数 hyteus(x, y) {
return Math.sqrt(x * x y * y);
}
hyteus(1, 2) //=>2.23606797749979
function face(n) { //再帰関数
(n n * フェイシャル(n - 1);
を返します。 }
顔(11) //=>39916800

関数の宣言は通常、JavaScript コードの先頭に表示され、他の関数の本体内にネストすることもできます。ただし、ネストされている場合、関数宣言はネストされた関数の先頭にのみ表示されます。つまり、関数定義は if、while、またはその他のステートメントに含めることはできません。

var ステートメントと同様、関数宣言ステートメントで作成された変数は削除できません。ただし、これらの変数は読み取り専用ではなく、変数値は上書きできます。

4. 条件文

条件ステートメントは、指定された式の値が正しいかどうかを判断して、特定のステートメントを実行またはスキップするために使用されます。これらのステートメントはコードの「決定点」であり、「分岐」と呼ばれることもあります。 JavaScript インタプリタがコードの「パス」に従って実行される場合。条件文が分かれ道です。プログラムはこの時点に到達し、実行を続行するためのパスを選択する必要があります。

i.if ステートメント

if ステートメントは、基本的な制御ステートメントです。正確に言うと、このステートメントには 2 つの形式があります。1 つ目は

です。

コードをコピーします コードは次のとおりです:

If (式)
ステートメント

この形式では、式の値が true の場合、ステートメントが実行されます。 false の場合、ステートメントは実行されません。たとえば、

コードをコピーします コードは次のとおりです:

If (username == null) //ユーザー名が null または未定義の場合
username = "jack wong" // 定義します
;

if ステートメント内の式を囲む括弧が必要であることに注意してください。

JavaScript 構文では、if キーワードと括弧付きの式の後にステートメントを続ける必要があると規定されています。ただし、ステートメント ブロックを使用すると、複数のステートメントを 1 つに結合できます。したがって、if ステートメントは次のようになります:

コードをコピーします コードは次のとおりです:

if (!address) {
アドレス = "";
message = "メールアドレスをお願いします"
}

if ステートメントの 2 番目の形式では、expression の値が false の場合に else ロジックが実行されます。

コードをコピーします コードは次のとおりです:

If (式)
ステートメント1
その他
ステートメント2

たとえば、次のコード

コードをコピー コードは次のとおりです:

if (n == 1)
console.log("1 件の新しいメッセージ");
その他
console.log("新しいメッセージがあります");

if/else ステートメント内に if ステートメントをネストする場合は、else ステートメントが正しい if ステートメントと一致するように注意する必要があります。次のコードを考えてみましょう:

コードをコピーします コードは次のとおりです:

i = j = 1;
k = 2;
if (i == j)
If (j == k)
console.log("i equs k");
その他
console.log("i dosent = j"); //エラー! !

この例では、内側の if ステートメントは、外側の if ステートメントに必要な句を形成します。ただし、if と else の一致関係は明確ではありません (インデントだけがヒントを与えます)。この場合、インデントは間違ったヒントを与えます。これは、JavaScript インタプリタがそれを理解する方法であるためです。

コードをコピーします コードは次のとおりです:

If (i == j) {
If (j == k)
console.log("i equs k");
それ以外の場合 console.log("i は j に等しい");
}

ほとんどのプログラミング言語と同様、JavaScript の if および else の一致ルールは、else が常に最も近い if ステートメントと一致するというもので、例を読みやすく、理解しやすく、保守とデバッグを容易にするために、中括弧 使用する必要があります

コードをコピーします コードは次のとおりです:
If (i == j) {
If (j == k) {
console.log("i equs k");
。 console.log("i は j に等しい");
}
}



多くのプログラマーは、if ステートメントと else ステートメントの本体を中括弧で囲む習慣があります (while ループなどのマッチングステートメントと同様)。たとえブランチごとにステートメントが 1 つしかない場合でも、そうすることで上記の問題を回避できます。プログラムの曖昧さの問題。

ii.else if

if/else ステートメントは、式の評価結果を判断して 2 つの分岐のうちの 1 つを選択します。コードに多くの分岐がある場合はどうすればよいでしょうか?解決策の 1 つは、else if ステートメントを使用することです。 else if は実際の JavaScript ステートメントではなく、複数の if/else ステートメントを接続して記述する単なる方法です。

コードをコピー コードは次のとおりです:

if (n == 1) {
// コードブロック 1 を実行
} else if (n == 2) {
// コードブロック 2 を実行
} else if (n == 3) {
//コードブロック 3 を実行
} else {
//前の条件がすべて false の場合、コード ブロック 4 を実行します
}

このコードには特別な点はありません。複数の if ステートメントで構成されており、各 if ステートメントの else 節には別の if ステートメントが含まれています。構文的に同等のコードは、ネストされた形式の if ステートメントを使用して完成させることができますが、これと比較すると、else if の書き方の方が明らかに明確で、より好ましいものです。

iii.スイッチ

if ステートメントはプログラムの実行中に分岐を作成し、else if を使用して複数の分岐を処理できます。ただし、すべての分岐が同じ式の値に依存する場合、else if は最適な解決策ではありません。この場合、複数の if ステートメントで式を繰り返し評価するのは無駄です。

switch ステートメントは、この状況の処理に適しています。キーワード switch の後にかっこで囲まれた式が続きます。この後に、中括弧で囲まれたコードのブロックが続きます。

コードをコピーします コードは次のとおりです:

switch (式) {
ステートメント
}

ただし、switch ステートメントの完全な構文はこれよりも複雑です。 case の後には式とコロンが続きます。Case はタグと非常によく似ていますが、タグには名前がありません。

これに続く式にのみ関連付けられます。この switch ステートメントが実行されると、まず、expression の値が計算され、次に、case 句の式がexpression の値と同じかどうかがチェックされます。 (ここでの類似性は「===」演算子に従って比較されます)、大文字と小文字が一致した場合、対応するコードが実行されます。一致するケースが見つからない場合は、「default:」タグ内のコード ブロックが実行されます。 「default:」タグがないと、switch はすべてのコード ブロックをスキップします。

switch ステートメントは非常に混同しやすいので、例を見てみるとわかりやすくなります。

コードをコピーします コードは次のとおりです:

スイッチ (n) {
ケース 1: // n ===1 の場合、ここから開始
// コードブロック 1 を実行
休憩;
ケース 2:
// コードブロック 2 を実行
休憩;
ケース 3:
//コードブロック 3 を実行
休憩;
デフォルト:
//コードブロック 4 を実行
休憩;
}

各 case ステートメントの最後にキーワード Break が使用されていることに注意してください。 Break ステートメントについては後で紹介します。break ステートメントにより、インタープリタが switch ステートメントまたはループ ステートメントから飛び出す可能性があります。 switch では、case は実行されるコードの開始点のみを指定し、終了点は指定しません。 Break ステートメントがない場合、switch ステートメントは、expression の値の一致する case ラベルのコードから実行を開始し、switch コード ブロック全体の終わりまで後続のステートメントを順番に実行します。もちろん、関数で switch ステートメントを使用する場合は、return を使用して Break を置き換えることができます。return と Break は両方とも switch ステートメントを終了するために使用され、1 つの case ステートメントが終了した後に次の case ステートメントのブロックが実行を継続するのを防ぎます。実行されました。

次のステートメントは実践に近く、型に応じて値を文字列に変換します。

コードをコピーします コードは次のとおりです:

関数 Convert(x) {
スイッチ (x のタイプ) {
case 'number': //数値を 16 進数に変換します
x.toString(16);
を返す ケース '文字列':
return '"' x '"' //二重引用符で囲まれた 2 つの文字列を返します。
デフォルト: //通常のメソッドを使用して他の型を変換します
return String(x); }
}
console.log(convert(100255114)) //=>5f9c58a

上記の 2 つの例では、case キーワードの後に​​数値と文字列リテラルが続いていることに注意してください。実際には、これが switch の最も一般的な使用方法ですが、ECMAScript 標準では、各キーワードの後に​​任意の式を続けることができます。

switch ステートメントは、最初に switch キーワードの後の式を計算し、次に、case 式の値が switch 式の値と等しくなるまで、各 case の後の式を上から下の順に計算します。各ケースのマッチング操作は、実際には「==」ではなく「===」の恒等演算子の比較であるため、式とケースのマッチングでは型変換は実行されません。

switch ステートメントを実行するたびに、すべての case 式が実行できるわけではないため、関数呼び出し式や代入式などの副作用のある case 式は避けてください。最も安全な方法は、case 式で定数式を使用することです。

前述したように、switch 式がどの case 式にも一致しない場合、「default:」でマークされたステートメント ブロックが実行されます。「default:」ラベルがない場合は、switch ステートメント全体がスキップされます。前の例では、すべての case タグの後に「default:」タグがスイッチの最後に表示されています。これは、最も合理的で一般的に使用される記述方法です。実際、「default:」タグは switch ステートメント内のどこにでも配置できます。

5.

条件文を理解するには、JavaScript のコードを分岐パスとして考えることができます。ループ ステートメントは、コードの一部を繰り返し実行できるプログラム パス内のループです。 JavaScript のループ文には while、do/while、for、for/in の 4 種類があります。以降のセクションで一度に説明します。最も一般的に使用されるループは、配列要素の走査です (7.6 では、このループと、配列クラスを使用して定義された特別なループ メソッドについて詳しく説明します)。

その間

if 文は基本的な制御文で、実行プログラムの分岐文を選択するために使用されます。 if と同様に、while ステートメントも基本的なループ ステートメントです。その構文は次のとおりです。

コードをコピーします コードは次のとおりです: while (式)
ステートメント

while ステートメントを実行する前に、JavaScript インタープリターはまずexpression の値を計算します。その値が false の場合、プログラムはループ本体内の論理ステートメントをスキップし、プログラム内の次のステートメントを実行します。値が true の場合、ループ本体のステートメントのロジックが実行され、expression の値が false になるまでループが継続されます。つまり、式が true の場合、ステートメントはループ内で実行されます。while(true) を使用すると無限ループが作成されることに注意してください。

一般的に言えば、JavaScript が同じ操作を何度も実行することは望ましくありません。ほぼすべてのループで、1 つ以上の変数がループ内で反復処理されます。これらの変数が変更されるため、ループ内で毎回実行されるステートメントの動作も異なります。また、変更された変数を式で使用すると、各ループでの式の値も異なります。これは非常に重要です。初期値が true である式は常に true となり、ループは終了しません。値 0 ~ 9 を出力します。

コードをコピーします コードは次のとおりです:

var count = 0;
while (カウント console.log(カウント);
カウント ;
}

この例では、変数 count の初期値は 0 であることがわかります。ループ中は、10 回ループするたびに値が 1 ずつ増加します。式の値が false にプログラムされると、while が終了し、JavaScript インタープリターがプログラムの次のステートメントを実行します。ほとんどのループには count などのカウンター変数があります。 i j k などの変数名はカウンターによく使用されますが、コードを読みやすくしたい場合は、より具体的な構文名を使用する必要があります。

ii.do/while

do/while ループは while ループとよく似ていますが、ループの先頭ではなく末尾でループ式をテストする点が異なります。つまり、ループ本体が少なくとも 1 回実行されます。 do/while ループの構文は次のとおりです:

コードをコピーします コードは次のとおりです:


をしてください ステートメント
while(式);

do/while ループは while ループほど一般的には使用されません。これは、実際には、ループを少なくとも 1 回実行する必要があることはまれであるためです。以下は do/while ループの例です

コードをコピーします コードは次のとおりです:

function printArray(a) {
var len = a.length,
i = 0;
If (len == 0)
console.log("空の配列");
それ以外の場合 {
を実行します console.log(a[i]);
} while ( i }

printArray([1,5,2,6])

do/while ループと通常の while ループの間には 2 つの構文の違いがあります。まず、do ループでは、ループの開始をマークするキーワード do が必要であり、ループの終了をマークしてループ条件の判定に入るために while 変数が必要です。次に、while ループとは異なり、do ループは で終了します。セミコロン。 while ループの本体が中括弧で囲まれている場合、while ループはセミコロンで終了しません。

iii.for

for ステートメントは、while よりも便利なループ ステートメント制御構造を提供します。 for ステートメントは、一般的に使用されるループ パターンをいくつか簡略化します。ほとんどのループには特定のカウンタ変数があります。ループの開始前にこの変数を初期化し、各ループの前にその値を確認します。最後に、カウンタ変数がインクリメントされます。そうでない場合は、ループ終了後、次の判定の前に変更されます。このタイプのループでは、カウンターの 3 つの主要な操作は、初期化、検出、更新です。 for ステートメントは、これら 3 つの操作をループ構文の一部として明示的に宣言し、それぞれを表す式を使用します。 for ステートメントの構文は次のとおりです:

コードをコピーします コードは次のとおりです:

for (初期化; テスト; インクリメント)
ステートメント

initialize、test、increment の 3 つの式はセミコロンで区切られており、初期化操作、ループ条件の判定、カウンタ変数の更新を担当します。これらをループの最初の行に置くと、for ループが何を行っているかを理解しやすくなり、カウンタ変数の初期化やインクリメントを忘れるのを防ぐこともできます。

for ループがどのように機能するかを説明する最も簡単な方法は、同等の while ループをリストすることです

コードをコピーします コードは次のとおりです:

初期化
while (テスト) {
ステートメント
増分;
}

言い換えると、initialize 式はループが開始される前に 1 回だけ実行されます。初期化式には副作用 (通常は代入ステートメント) が必要です。 JavaScript では、var 変数宣言ステートメントを使用した初期化式も許可されているため、変数を宣言して初期化できます。テスト式は各ループの前に実行され、式の結果が判断されてループ本体を実行するかどうかが決定されます。各ループの前にテスト式が実行され、その結果が判定されてループ本体が実行されます。テスト結果が true の場合、ループ本体内のステートメントが実行されます。最後に、インクリメント式が実行されます。また、有用であるためには、ここでのインクリメント式には副作用も必要です。一般に、これは代入式、または「 」と「--」演算子で構成される式のいずれかです。

上記の while ループは for ループを使用して作成できます

コードをコピーします コードは次のとおりです:

for (var count = 0; count console.log(カウント)

もちろん、一部のループはより複雑で、複数の変数を一度に反復処理します。 JavaScript では、この状況では、初期化式と増分式を 1 つの式に結合して for ループで使用するカンマ演算子を使用する必要があります。

コードをコピーします コードは次のとおりです:

var i, j;
for (i = 0, j = 10; i console.log(i * j);

これまでのコード例のループ変数はすべて数値でした。もちろん数字が最も一般的に使用されますが、必須ではありません。次のコードは、for ループを使用してテーブル データの結果を走査し、リンク リストの最後のオブジェクト (つまり、次の属性を含まない最初のオブジェクト) を返します。

コードをコピーします コードは次のとおりです:

function tail(o) { //リンクリストの最後のノードオブジェクトを返します
for (; o.next; o = o.next) /*empty*/ //o.nextが真の値であるかどうかを判断してトラバーサルを実行
return o;
}

このコードには初期化式が含まれていないことに注意してください。for ループ内の 3 つの式のうちの 1 つは無視できますが、2 つのセミコロンは必須です。テスト式を省略した場合は無限ループとなります。 while(ture) 型と同様に、無限ループを作成する 1 つの方法は for(;;) です。

iiii.for/in

for/in ステートメントは for キーワードを使用しますが、通常の for ループとは異なるタイプのループです。 for/in ループの構文は次のとおりです

コードをコピーします コードは次のとおりです:

for (オブジェクト内の変数)
ステートメント

variable は通常、変数名、または左辺値を生成できる式、または var ステートメントで宣言された変数である場合もあります。つまり、代入式の左辺に適用される値です。 object は式であり、この式の結果はオブジェクトです。同様に、statement は、ループの本体を形成する 1 つのステートメントまたはステートメントのブロックです。

for ループを使用して配列要素を反復処理するのは非常に簡単です

コードをコピーします コードは次のとおりです:

var a = [1, 3, 5, "44"];
for (var i = 0; i console.log(a[i]) //各配列の要素を出力します

for/in ループは、オブジェクトのメンバー属性を簡単に走査するために使用されます

コードをコピーします コードは次のとおりです:

for (var p in o) //属性の名前を変数 p
に代入します console.log(o[p]); //各属性の値を出力します

for/in ステートメントの実行中、JavaScript インタープリターは最初にオブジェクト式を評価します。式が null または未定義の場合、JavaScript インタープリターはループをスキップし、後続のコードを実行します。式がプリミティブ値と等しい場合、プリミティブ値は対応する Waxer オブジェクトに変換されます (セクション 3.6)。それ以外の場合は、式自体がすでにオブジェクトです。 JavaScript はオブジェクトのプロパティを順番に列挙してループを実行します。ただし、各ループの前に、JavaScript は変数式を評価し、それにプロパティ名 (文字列) を割り当てます。

for/in ループ内であれば、varibale の値を代入式の左辺値として使用でき、どのような式でもよいことに注意してください。この式はループを通じて毎回評価されます。つまり、ループを通じて毎回異なる値に評価される可能性があります。たとえば、次のコードを使用して、すべてのオブジェクト プロパティを配列にコピーできます。

コードをコピー コードは次のとおりです:

var o = {x: 1,y: 2,z: 3};
var a = [],i = 0;
for (a[i ] in 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 (a[i ] in o) /*empty*/;
document.write(a)//=> for(i in a)
document.write(i) //=>列挙型データインデックス 0 1 2

実際には、for/in ループはオブジェクトのすべてのプロパティを走査するわけではなく、「列挙可能な」プロパティのみを走査します (6.7 を参照)。 JavaScript 言語のコアによって定義された組み込みメソッドは「列挙可能」ではないためです。たとえば、すべてのオブジェクトには toString() がありますが、for/in ループは toString() プロパティを列挙しません。組み込みメソッドに加えて、非数値 (nonenumberable) の組み込みオブジェクト プロパティが多数あります。コード内で定義されているすべてのプロパティとメソッドは列挙可能です (これについてはセクション 6.7 で説明しますが、ECMAScript5 にはプロパティを列挙不可能にする特別な手段があります)。

オブジェクトは他のオブジェクトのプロパティを継承でき、継承されたカスタム プロパティの行 (6.2.ii) も for/in を使用して列挙できます。

for/in ループ本体がまだ列挙されていない属性を削除すると、この属性は列挙されなくなります。ループ本体でオブジェクトの新しいプロパティを定義する場合、これらのプロパティは通常は列挙されません (ただし、JavaScript の一部の実装では、ループ本体に追加されたプロパティを列挙できます)。

属性列挙の順序

ECMAScript 仕様では、for/in ループがオブジェクトのプロパティを列挙する順序は指定されていません。しかし実際には、主流のブラウザ メーカーの JavaScript 実装では、単純なオブジェクトのプロパティが定義された順序で列挙され、最初に定義されたプロパティが最初に列挙されます。オブジェクト リテラルの形式を使用してオブジェクトを作成する場合、リテラル内のプロパティは出現順に列挙されます。 (一部の Web サイトと JavaScript ライブラリはこの列挙順序に依存しており、ほとんどのブラウザ メーカーはこの順序を変更しません) 次の場合、列挙順序は特定の実装に依存します (対話型ではありません)
。 1. オブジェクトは列挙可能なプロパティを継承します
2. オブジェクトには整数配列インデックスを持つプロパティ
があります 3. delete を使用してオブジェクトの既存の属性を削除します
4. Object.defineProperty() または同様のメソッドを使用して、オブジェクトのプロパティを変更します

6. ジャンプ

JavaScript の最初のタイプのステートメントは、jump ステートメントです。ステートメントを理解すると、JavaScript の実行をある位置から別の位置にジャンプさせることができます。

break ステートメントは、ループまたは他のステートメントの最後にジャンプします。 continue ステートメントは、このループの実行を終了し、次のループの実行を開始します。 JavaScript のステートメントには名前やラベルを付けることができ、break と continue によってターゲットのループや他のステートメントのラベルを識別できます。

return ステートメントを使用すると、インタープリタは関数本体の実行から抜け出すことができます。そして、この呼び出しの戻り値を提供します。 throw ステートメントは、例外をトリガーまたはスローします。これは、例外を処理するためのコード ロジックを指定する try/catch/finally ステートメントと一緒に使用されます。これは複雑なジャンプ ステートメントであり、例外がスローされると、プログラムは最も近い閉じられた例外スターにジャンプします。この例外プログラムは同じ関数内にある場合もあれば、より上位の呼び出しスタック内にある場合もあります。

次に、ジャンプステートメントの種類ごとに説明します

i. タグステートメント

ステートメントにはラベルを付けることができます。ラベルは、ステートメントの前の識別子とコロンで構成されます。

識別子:ステートメント

ステートメントのラベルを定義すると、プログラム内の任意の場所でラベル名を介してステートメントを参照できます。ラベルは複数のステートメントに対して定義できますが、ループや条件などのステートメントのブロックに対してラベルを定義する場合に便利です。ループのラベル名を定義すると、ループ本体内で Break と continue を使用してループを終了したり、次のループの開始に直接チャレンジしたりできます。 JavaScript でステートメント ラベルを使用できるステートメントは、break と continue だけです (この章で次に説明します)。次の例では、while ループでラベルを定義し、 continue ステートメントでこのラベルを使用します。

コードをコピーします コードは次のとおりです:
メインループ: while (トークン != null) {
// このコードを無視します...
続行 mapoop // 次のループにジャンプします
//ここのコードは無視してください...
}

ここでタグとして使用される識別子は、予約語ではなく、正当な JavaScript 識別子である必要があります。ラベルの名前空間は変数または関数の名前空間とは異なるため、ステートメントのラベルと変数または関数の名前として同じ識別子を使用できます。ステートメントラベルは、それが作用するステートメント内 (または、もちろんその節内) でのみ定義されます。ステートメント ラベルに内部ステートメント ラベルと同じ名前を付けることはできませんが、2 つのコードが互いにネストされていない場合は、同じ名前のステートメント ラベルが表示される可能性があります。ラベル付きステートメントにはラベルを付けることもできます。つまり、どのステートメントにも多くのラベルを付けることができます。

ii.ブレイク

break ステートメントを単独で使用する機能は、最も多くのメモリを使用してループまたは switch ステートメントを即座に終了することです。その構文は次のとおりです:

休憩;

ループや switch ステートメントが終了する可能性があるため、この形式の Break はそのようなステートメントでのみ有効です。
switch ステートメントの例で、break ステートメントをすでに見てきました。ループ内で、何らかの理由でループ全体の実行を継続したくない場合は、break を使用して早期に終了できます。ループ終了条件が非常に複雑な場合、複雑な終了条件をループ式に直接記述するよりも、関数本体で Break ステートメントを使用して条件判定を実装する方がはるかに簡単です。

次の例では、ループは配列要素全体を走査して特定の値を見つけます。配列全体の走査が完了すると、ループは正常に終了します。見つかった場合は、break ステートメントを使用して終了します。ループ:

コードをコピーします コードは次のとおりです:

for (var i = 0; i If (a[i] == ターゲット) Break;
}

JavaScript では、break キーワードの後に​​ステートメント ラベル (識別子のみ、コロンなし) を続けることもできます

ラベル名を破る;

break をラベルと一緒に使用すると、プログラムはラベルで識別されたステートメント ブロックの最後にジャンプするか、閉じられたステートメント ブロックの実行を直接終了します。ブレークのラベルを指定するステートメント ブロックを囲んでいない場合、構文エラーが発生します。この形式の Break ステートメントを使用する場合、break ステートメントはそれを囲んでいるステートメントのブロックから「飛び出す」可能性があるため、ラベル付きステートメントをループまたは switch ステートメントにすることはできません。ここでのステ​​ートメントは、同じラベルを使用してステートメントのグループを識別する、中かっこでグループ化されたステートメントのグループにすることができます。

break キーワードとラベル名の間に改行を入れることはできません。 JavaScript はステートメントの省略されたセミコロンを自動的に補完できるため、break キーワードとラベルの間に改行がある場合、JavaScript インタプリタはラベルのない最も単純な形式の Break を使用していると判断し、 Break の後にセミコロンを追加します。
近くにないループまたは switch ステートメントから抜け出したい場合は、ラベル付きの Break ステートメントを使用します。サンプルコードは次のとおりです:

コードをコピー コードは次のとおりです:

var math = getData() // どこかから 2 次元配列を取得します
//行列内のすべての要素を合計します
var sum = 0,
成功 = false;
//エラーが報告されたときにプログラムを起動するための署名から開始します。
Compure_sum: if (行列) {
for (var x = 0; x var row = 行列[x];
If (!row) Break compute_sum;
for (var y = 0; y var cell = row[y];
If (isNaN(cell)) Break compute_sum;
sum = cell;
}
}
成功 = true;
}
//break ステートメントはここにジャンプします
//success =false 条件がここに到達した場合、それは与えた行列にエラーがあることを意味します
//それ以外の場合は、行列内のすべての要素を合計します

最後に、break ステートメントにラベルが付いているかどうかに関係なく、その制御は関数の境界を越えることができないことに注意してください。例: ラベル付きの関数定義ステートメントの場合、このラベルを使用して関数の内部から関数の外部にジャンプすることはできません。

iii.Continue ステートメント

Continue ステートメントは Break ステートメントとよく似ていますが、ループを終了せず、代わりに次のループを実行します。 continue ステートメントの構文は、break ステートメントの構文と同じくらい単純です

続行;

Continue ステートメントにもタグが含まれます

lebname を続行します;

continue ステートメントにラベルがあるかどうかに関係なく、ループ本体でのみ使用できます。他の場所で使用すると、構文エラーが報告されます。
continue ステートメントが実行されると、現在のループ ロジックが終了し、次のループがすぐに実行されます。ループの種類によって、 continue の動作も異なります
。 1. while ループでは、ループの先頭に式を指定して繰り返しテストされ、テスト結果が true の場合、ループ本体が最初から実行されます。
2. do/while ループでは、プログラムの実行がループの最後にジャンプします。このとき、ループ条件が再判定されて次のループに進みます。
3. for ループでは、最初に自動インクリメント式が計算され、次にテスト式が検出されてループ本体を実行するかどうかが決定されます。
4. for/in ループでは、ループは、指定された変数に割り当てられる次の属性名のトラバースを開始します。

while ループと for ループの continue 文の違いに注意が必要です。while ループは直接次のループ条件判定に入りますが、for ループは最初にインクリメント式を計算してからループ条件を判定します。 。前の章では、for ループと while ループの「同等の」動作について説明しました。ただし、これら 2 つのループでは continue の動作が異なるため、while ループを使用して同等の for ループを完全にシミュレートすることは不可能です。

次のコードは、エラーが発生したときに現在のループの後続のロジックをスキップするラベルのない continue ステートメントを示しています

コードをコピー コードは次のとおりです:

for (i = 0; i If (!data[i]) continue //未定義のデータを処理できません
total = データ[i];
}

break ステートメントと同様に、ラベル付き continue ステートメントをネストされたループで使用して、階層的にネストされたループ本体ロジックから飛び出すことができます。また、break ステートメントと同様に、 continue ステートメントと labname の間に改行を入れることはできません。

iiii.return

関数呼び出しは式であり、すべての式には値があることを思い出してください。関数内の return ステートメントは、関数呼び出し後の戻り値を指します。 return ステートメントの構文は次のとおりです:

式を返す;

return ステートメントは関数本体内でのみ使用できます。そうでない場合は、構文エラーが報告されます。 return ステートメントが実行されると、関数は実行を終了し、expression の値を呼び出し側プログラムに返します。例:

コードをコピーします コードは次のとおりです:

function square(x) {return x * x} //return
を含むステートメント関数 square(4) //実行は 16

return ステートメントがない場合、関数呼び出しは関数本体内の各ステートメントを関数の終了まで順番に実行するだけで、最後に呼び出し元のプログラムに戻ります。この場合、式の呼び出し結果は未定義です。 return ステートメントは関数の最後のステートメントとして使用されることがよくありますが、return ステートメントの実行時に実行されていないコードが大量にある場合でも、必ずしも関数の最後に配置する必要があるというわけではありません。場合でも、関数は呼び出し元のプログラムに戻ります。
return ステートメントは式なしで単独で使用することもできます。この場合、関数はプログラムを呼び出して未定義を返すこともできます。例:

コードをコピーします コードは次のとおりです:

//パラメータがnullまたは未定義の場合、すぐに戻ります
If (!o) return;
//その他のロジック
JavaScript はセミコロンを自動的に挿入できるため、return キーワードとそれに続く式の間に改行を入れることはできません。

iiiiii.throw ステートメント

いわゆる例外 (例外) は、何らかの異常な状況やエラーが発生したときに生成される信号です。例外のスローは、エラーまたは異常な状態が発生したことを通知することを意味します。例外をキャッチするとは、シグナルを処理して例外をスローすることを意味します。これは、エラーまたは異常な状況が発生したことをシグナルを使用して通知することを意味します。例外のキャッチとは、この信号を処理すること、つまり、例外から回復するために必要な措置を講じることを指します。 JavaScript では、実行時エラーが発生したとき、またはプログラムが throw ステートメントを使用したときに例外が明示的にスローされます。例外は try/catch/finally ステートメントを使用してキャッチできます。これについては次のセクションで詳しく説明します。

throw ステートメントの構文は次のとおりです:

式をスロー

expression の値は任意の型にすることができます。エラー コードを表す配列、またはエラー メッセージを含む文字列をスローできます。 JavaScript インタプリタが例外をスローする場合、通常は Eeeor 型またはそのサブタイプを使用しますが、これらを使用することもできます。エラー オブジェクトには、エラー タイプのよく知られた表現と、文字列をコンストラクターに渡すために使用されるメッセージ属性があります (パート 3 の Error クラスを参照)。次の例では、関数がillegal で呼び出されたときにエラーがスローされます。パラメータ:

コードをコピーします コードは次のとおりです:
関数 fa(x) {
 
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート