2017-02-03 12 views
0

このソートアルゴリズムは私がここから抜け出したもので、私はそれがどのように動作するかを頭の中に入れようとしています。 alert(i)をこの位置に置くと、期待どおりに5回の警告が表示されます。この奇妙なシャッフルアルゴリズムの動作の原因は何ですか?

function shuffle(a) { 
    for (let i = a.length; i; i--) { 
     alert(i) 
     let j = Math.floor(Math.random() * i); 
     [a[i - 1], a[j]] = [a[j], a[i - 1]]; 
    } 
} 

しかし、私がこの位置に置くと、それは一度だけ警告します。

function shuffle(a) { 
    for (let i = a.length; i; i--) { 
     let j = Math.floor(Math.random() * i); 
     alert(i) 
     [a[i - 1], a[j]] = [a[j], a[i - 1]]; 
    } 
} 

この原因は何ですか。ループはまだ5回実行されていませんか?

+0

私はそれがセミコロンを注入すると思った。これは何をしているのですか? –

+0

自動セミコロンアサーションは幾分壊れた機能ですが、常にセミコロンを使用します。 F12を押して、コードを壊しているものを確認してください。 – Teemu

+0

コードを(セミコロンで)試しました。私は同じ量のアラートを取得します。 [IE - > F12ヒット] | [Chrome - > Ctrl + Shift + I] | [Firefox - > Ctrl + Shift + Q] – Marcus

答えて

2

単純な答えは、あなたのalert後の省略セミコロンが問題の原因となっているということです。

function shuffle(a) { 
 
    for (let i = a.length; i; i--) { 
 
     let j = Math.floor(Math.random() * i); 
 
     alert(i) 
 
     [a[i - 1], a[j]] = [a[j], a[i - 1]]; 
 
    } 
 
}

ラインを4 + 5が解析されているよう:

 alert(i)[a[i - 1], a[j]] = [a[j], a[i - 1]];

は、JSインタープリタがアラートの戻り値に配列としてアクセスしようとしていることを意味します(明らかにそうではありません)。このエラーは、ループが継続しないようにするため、最初のアラートのみを取得します。

JavaScriptのセミコロンについては、Ben Alman's blog post(風刺的な暴言)を読むことをお勧めします。

関連する問題