5

私は通常、このパターンを使用してオブジェクト プロパティを反復処理します。

for(var property in object) {
   if(object.hasOwnProperty(property)) {
      ...
   }
}

私はこの過度のインデントが好きではなく、最近、これを行うことでそれを取り除くことができると指摘されました:

for(var property in object) {
   if(!object.hasOwnProperty(property)) {
      continue;
   }

   ...
}

余分なレベルのインデントが導入されないため、これが気に入っています。このパターンは大丈夫ですか、それとももっと良い方法がありますか?

4

4 に答える 4

4

私は個人的に好きです:

for(var property in object) if(object.hasOwnProperty(property)) {
     ...
}

中括弧を省略した場合、 、 などは次のステートメントを取るためfor、余分なレベルのインデントはありません。ifすべてのコードをブロック内に配置したため、ステートメントif hasOwnPropertyのブレースは不要になります。for

基本的には次と同等です。

for(var property in object) {
   if(object.hasOwnProperty(property)) {
     ...
   } else {
      continue;
   }
}
于 2010-09-22T01:34:11.903 に答える
2

構文的にはこのようなものが好きです

function own(obj) {
  var ownprops = {};
  for (var prop in obj) 
    if (obj.hasOwnProperty(prop)) ownprops[prop] = 1;

  return ownprops;
}

for (var property in own(object)) {
 //code
}

見た目は良いですが、同じオブジェクト上で2つのループが必要であり、パフォーマンスの面ではかなり優れていません。

それを行う他の方法は機能的です

function foreach(obj, func, thisp) {
  for (var prop in obj)
    if (obj.hasOwnProperty(prop)) func.call(thisp, obj[prop], prop);
}

foreach(object, function(val, key) {
  //code
});

ループは1つだけですが、反復ごとに関数が呼び出されます。これは、パフォーマンスの面では優れていませんが、最後のソリューションよりも優れています。の値も上書きされることに注意してください。ただしthis、オプションの3番目の引数としてその値を明示的に渡すことができます。

いくつかの選択肢。あなたがそれをしている方法、そしてダニエルによって説明された方法はうまく、そしてパフォーマンスの妥協はありません。

また、中括弧ごとにコードをインデントする必要がないことを指摘したいと思います...

于 2010-09-22T03:32:07.317 に答える
1

1 つの要因は、ダグラス クロックフォードを聞くかどうかによって異なります。彼の著書 JavaScript: The Good Parts の中で、彼は悪いcontinue部分をひとまとめにしています。

「continue ステートメントを削除するためにリファクタリングすることによって改善されなかったコードを見たことがありません。」- Douglas Crockford、JavaScript: 良い部分

ティム・ダウンが彼のコメントで述べたように、クロックフォードは本の中でなぜcontinue避けるべきかを説明する理由を述べていません. しかし、彼の Web サイトでは、「関数の制御フローがわかりにくくなる傾向がある」と述べています。多くの人が彼を権威と見なしているので、私はクロックフォードの意見だけに言及します.

個人的には、ループのコーディング方法に問題はないと思います。特に、continue簡単に見落とされない上部に表示されるためです。開発者チームと協力していますか? 彼らは何をするのかをよく理解してcontinueいますか?ステートメントの深いネストを処理する方法について説明しているコード規則のドキュメントはありますか?

于 2010-09-22T04:24:55.373 に答える
0

マコーネル:

多くのブレークがあるループは、ループの構造または周囲のコードでのその役割について不明確な考えを示している可能性があります。過度のブレーク レイズは、多くの場合、ループが一連のループとしてより明確に表現できることを示しています。ブレークを使用すると、ループがブラック ボックスとして扱われる可能性がなくなります。ループの終了条件を 1 つのステートメントで制御して、ループを簡素化します。'break' は、コードを読んでいる人に、ループの制御を理解するために内部を調べさせ、ループを理解することをより困難にします。

ダイクストラ:

break のような機能は、構造化プログラミングの利点を妨害する傾向があり、プログラマーがプログラムを独立したユニットの構成として理解するのを妨げます。

継続を伴うループはこの形式に分解できるため、ループはブラック ボックスとして扱われる場合があります。クロフォードは間違っています。においが壊れますが、継続は良いです。

詳細な分析: http://sites.google.com/site/dustingetz/dev/break-and-continue

于 2010-10-27T16:45:54.023 に答える