ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript for ループの入り口からサイドまで (効率の最適化、奇妙な使い方)_JavaScript スキル

JavaScript for ループの入り口からサイドまで (効率の最適化、奇妙な使い方)_JavaScript スキル

WBOY
WBOYオリジナル
2016-05-16 17:51:291088ブラウズ
1. for ループの基本的な書き方
コードは次のとおりです。
コードをコピーします コードは次のとおりです。

//例 1 for(var i=1;ialert(i);

このコード 取り出すのが恥ずかしいくらい簡単です。コードの実行結果は、1 から 10 までが順番に表示されます。追記: IE6 などの初期の IE では、10 を 10000 に変更すると、ユーザーは何もできないことを確認するためにクリックし続けます。それは私のアイデアだったと言う。
これは基本的なコースなので、トピックに戻ってこのコードを詳しく分析してみましょう。
for ループの構造は似ています。どの for ループも次のようになります。
for (開始前; ループ実行の条件; ループ終了後の処理) {
// 本体コード
} for ループを詳しく見てみると、何千年も変わっていない特徴の 1 つがわかります。for! の後の () には常に 2 つだけ (英語のセミコロン) があります。上記の構造 コードでは、for ループの実行条件を区切るためにセミコロンが使用されることを説明しました。これらの条件は必須であり、空であってもかまいませんが、ポジションは予約されている必要があるため、2 つ存在する必要があります。
開始する前に: これは通常、例 1 の var i=0 など、いくつかの変数を宣言するために使用されます。これは、とりあえず何も入っていないバスケットを準備するようなものです。ツールの数に制限はなく、for ループが開始される前に 100 個の変数を宣言できます。見た目が良くないことを除けば、何も問題はありません。
ループが進行する条件: たとえば、最初の例の i1 回ループした後に行うこと: 例 1 では、単にバスケットに何かを追加するだけです。結局のところ、1 回ループするのは簡単ではありません。
特記事項: for ループの「開始前」のコードは 1 回のみ実行され、for ループ全体の効率には影響しません。ただし、「進行状況」と「終了後の処理」は影響を受けません。ループの実行回数によって決まるため、ループのパフォーマンスのボトルネックになることがよくあります。
for ループの最初の; が開始前に行われたものである場合、開始前の内容を for ループの先頭に持ってきてもよいでしょうか?開始する前に定義するだけです。答えは「はい」です:


//例 2
var i=0;
for(;ialert(i);


ただし、「開始」 「before」の後の括弧内の「」には内容がありませんが、; (セミコロン) はまだ存在します。そしてそれは必ずそこにあるはずです!
同様に、2回目以降のコードも1回実行されるので、forループの後に実行するコードを置くこともできます。次のように:



コードをコピー コードは次のとおりです: //例 3
var i= 0;
for(;ialert(i);
i
}


それでも、この 2 つは悪です。はまだ存在するはずです。
上記は基本的な「副用法」の 2 つです。 。 。不正行為だとは言わないでください
しかし、ご覧のとおり、ループを実行するための条件を個別に記述することはできず、条件は 2 つのセミコロンの間に置く必要があります。前からも後ろからも攻撃!

2. for ループの部分的な書き方

1. 例 1 のコードを次のように変更します。 ;alert (i )) ;どうやって?これは詐欺です。{} は消えました。しかし、それは絶対に正しいです! しかし、この書き方はあまりにも法外です。その 2。あまりにも多くのコードを含めないほうがよいでしょう。あまりにも多くなりすぎると、i の値を把握できなくなります。コードが複雑なため、人為的な文法エラーが発生する可能性があります。
適用環境:
要素が 1 から 1000 までの配列を作成するなど、単純な for ループ操作の場合は、このトリックを使用します。一言で言えばクールです。
2. 詳細な分析
前の例から、実際には、for ループの実行条件は次のようにブール値を判断することであることがわかります。 🎜>
コードをコピーします


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

var t = true; if(t == true) { alert('Ah!') } この if ステートメントは誰も理解できません。実際には、次のように書くことができます:



コードをコピーします

コードは次のとおりです。

var t = true; if(t) { alert('Ah! ') }
for ループの条件がブール値を判定することであれば、次のような書き方も難しくありません。
Copy code コードは次のとおりです:

var i = 10;
for(;i;i--){
alert(i) ;
}

このコードの効果は、10 から 1 を順番にポップアップすることです (例 1 とは逆)。 for ループの条件は i と同じくらい単純ですが、前の説明によれば、条件は実際には次のようになります:
Copy code コードは次のとおりです:

if(i) {
//do
}

つまり、i が true の場合、続行します。実行サイクル。この for ループで i が true になるのはどのような場合ですか? i が 0、空の文字列、未定義、null、または false に等しくない限り、それは true になります。
つまり、この for ループは i=0 まで実行され、その後終了します。ただし、コードには 0 は表示されません。これにより、初心者が混乱し、B が武器としてインストールされます。
3、別の
まずはコードを見てみましょう。庭の友人のスナンディから:
コードをコピー コードは次のとおりです。次のように:

var ary = ["ジャック","トム","リリー","アンディ"]
for(var i=0,a;a=ary[i ];){
console.log(a);
}

さらに、for ループの条件に注意してください: a=ary[i]。 == ではなく = に特に注意してください。== の場合、ループは続行されません。
この条件判断はおかしいし、私も困惑しています。以下に似ています:
if(a=b) {...} // =! であることに注意してください。
このとき b が false の場合は false を返します。
上記の例に戻ると、i がヘッダーを追加すると、ary[i] に false の値 (null と未定義のカウントの両方) が含まれるため、条件が false になり、ループが中断されます。
snandy も述べたように、この例には大きな制限があります。たとえば、配列に 0 がある場合、ループが終了する可能性もあります。
4、jQueryの書き方
コードをコピー コードは次のとおりです。

function sibling( elem ) {
var r = [],
n = elem.parentNode.firstChild;
for ( ; n; n = n.nextSibling ) {
if ( n.nodeType === 1 && n !== elem ) {
r.push( n )
}
}


これ兄弟ノードを抽出する方法は、独自の for ループです。ループの条件は、n が true かどうかを判断することです。 n は常に HTML ノードであるため、常に true になります。各ループが終了すると、n の次のノードが n に割り当てられ、n の次のノードが存在しない場合、n は false となり、ループは終了します。
概要:
上記のすべての例からわかるように、for ループがどれほど奇妙であっても、2 つの; がなければ実行できません。 for ループの原理を理解したい場合は、for ループを ; を境にして分割すれば一目瞭然です。

3. for ループの効率の最適化
1. キャッシュ変数
これも最も一般的に使用される効率の最適化方法です:


コードをコピーします コードは次のとおりです。
var arr =[1,2,23,...,1000]; (var i=0, l = arr.length;i//
}


ループするたびに実行条件を判定する必要があるため、ifループするたびに arr から決定されます。 長さを読み取ることは間違いなく非常に無駄であり、必然的に計算量が増加し、効率が無駄になります。
2、逆順メソッド
たとえば、配列に 1000 個の要素がある場合、抽出順序を考慮しない場合は、逆順でループできます:



コードをコピーします コードは次のとおりです: var arr =[1,2,23,...,1000];
var i = arr.length;
for(; i>0;i--){
//alert(i);


なぜ逆順の方が順順よりも速いのでしょうか?科学的根拠はありません!実際、これは変数が 1 つ少ないだけで、(前の例と比較してください) 逆の順序で使用できるためです。これ以外には、2 つの変数の間に速度の違いはありません。
3.
の飛び出しに注意し、不要な操作を行わない これが基本ロジックです。 1,000 個の li がある場合、1 つの li には特別な className があり、この li を見つける必要があります。そして、そのような li は 1 つだけであることが決定されているので、この li を見つけたらすぐに飛び出て、ブレイクする必要があり、次のループを続ける必要はありません。このようにして、li が最後にならない確率は 999/1000 であるため、多くの計算を確実に節約できます。
その他の状況については、推測してください。
4. 横向きの使用法を使用する
上で紹介した横向きの使用法は、記述が美しいだけでなく、変数や計算を保存する効果があります。可能であれば使用してください。クールで効果的です。なぜそうではないのでしょうか?
---------------------------------概要----------- ------ ----------------
私は Javascript の柔軟性が好きです。それは見た目がかっこ良く見えるからだけではありません。ブログパークでJSの知識をもっと学びたいと思っています。専門家の記事をよく読んでとても勉強になりました。以下は私が庭で見つけた素晴らしい人々の一部です。リストに挙げていないとしても、私を罵らないでください。
cloudgamer、Situ Zhengmei、Uncle Tom、snandy、その他の控えめなマスター。彼らのブログを見つけたい場合は、検索してください。
追伸: Blog Park のコード挿入機能がとても気に入っています。今後、大量のコードを含む記事は Blog Park に直接投稿される予定です。
次のコードは試さないでください:
コードをコピーします コードは次のとおりです:

var arr = [1,2,23,1000];
for(var i=0,l = arr.length;iif(arr[i]>10000) ) {
i ;
}
}
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:js_javascript スキルの Eval 関数について少し学習します。次の記事:js_javascript スキルの Eval 関数について少し学習します。

関連記事

続きを見る