web-dev-qa-db-ja.com

whileループ条件でarray.pop()割り当てを使用することは良い習慣ですか?

While条件で配列pop割り当てを使用するコードスニペットを見ただけです。これが許容できる/良い習慣かどうか疑問に思っていましたか?

var arr = [0,1,2,3,4,5];
var current;
while (current = arr.pop())
{
  // do stuff to each element stored in current
}
7
flewk

コードが想定されていることを実行する場合、必ずしも間違っているわけではありませんが、そのような決定これは個人的に書かれたコードの好みや意見の問題になる可能性があるためです。逆に、このロジックの特定の配置を回避することは、雇用主の要件である場合があります。

考慮すべき事項は次のとおりです。

  1. コードが何をしているか理解していますか?
  2. 他の誰かがコードを読んでそれが何をしているのかを理解することを期待されていますか?そしてコードを読んで理解しているのは比較的簡単ですか?
  3. このコードは、 Programming Style ガイドラインを実装するグループまたは組織のプロジェクトの開発コードの一部として使用されますか?

編集する

具体的には、例のコードを使用する長所と短所をいくつか示します。

長所

  • オブジェクトやその他の「真の」値を含むことが保証されている配列などの特定の使用例では、この方法は簡潔で、条件ステートメントと割り当てステートメントを兼ねています。

短所

  • 配列にundefinednull0falseNaN""が含まれているか、「穴」がある場合、この方法は失敗します。

「穴」とは、配列の長さが0より大きく、配列の要素の一部(またはすべて)に値が割り当てられていない場合を意味します。

「真実」とは、偽と評価されない値を意味します(短所を参照)。 NaNまたは""をお忘れなく。

あなたの例のコードはすでにバグを含んでいます。配列の最初の要素は失われます。どうして?最初の要素はゼロであり、割り当てステートメントで使用されると、値0を返します。これは、whileループによってfalseとして扱われます。つまり、whileループは、「スタック」の最後の項目を処理する前に停止するか、または最初の要素です。配列内。

6
Nolo

キューまたはスタックのように配列を処理することが目的である場合、アイテムは処理されるときに削除されますyes。これはかなり標準的なアプローチです。

実際、スタックオーバーフロー、または一時停止と再開の必要性が再帰的解決策の潜在的な問題であるツリートラバーサルのこの種のループがときどき見られます。

3
svidgen