-2

私はややきれいなコードが好きです:

var currentVar = aBigObject['Key1']['Key2']['Key3'];
generalValues.push(((!currentVar) ? 0 : currentVar));

代替(私は思う)はこれです:

if (!aBigObject['Key1']['Key2][Key3']) generalValues.push(0);
else generalValues.push(aBigObject['Key1']['Key2']['Key3']);

私にとって、2 番目は不必要に長くて読みにくいです。私の質問は、変数を未定義の可能性があるものに設定することは本当に安全/良い習慣ですか?

4

3 に答える 3

1

考えましたか

var currentVar = aBigObject['Key1']['Key2']['Key3'] || 0;
generalValues.push(currentVar);
于 2012-12-06T22:08:52.970 に答える
1

私にとって前者は不必要に長く、読みにくいです。私の質問は、変数を潜在的に未定義になる可能性のあるものに設定することは本当に安全/良い習慣ですか?

エラーが発生しないという点で完全に安全です。また、これらすべてのルックアップを再度実行する必要がないことも意味します。

あなたの代替案もほとんど意味がないようです(そして確かに最初のコードスニペットと同じことをしていません)、それは間違っaBigObject['Key1']['Key2][Key3'] ていないとき(それをプッシュするのではなくそれ自体に割り当てる)の動作がまったく異なるためgeneralValuesです。 (質問を編集するとこれが修正されます。)

最初の例には確かに不要な括弧がたくさんあり、次のように書くことができます。

var currentVar = aBigObject['Key1']['Key2']['Key3'];
generalValues.push(!currentVar ? 0 : currentVar);

..そしておそらく次のように書く方が良いかもしれません

generalValues.push(aBigObject['Key1']['Key2']['Key3'] || 0);

あなたの一般的なポイントは、「なぜ最初のスニペットが使用されているのcurrentVarですか?」ということのようです。そして答えは、プロパティのルックアップは無料ではないということです。したがって、Key1on 、result、およびその結果ルックアップを実行すると、再度ルックアップするのではなく、覚えて再利用できます。JavaScriptオブジェクトはハッシュマップであり、ルックアップは安価ですが、無料ではありません。しかし、その特定のケースでは、別の方法でそれを行うことができます(上記を参照)。aBigObjectKey2Key3

于 2012-12-06T22:09:30.427 に答える
0
a = {};
var b = a.foo;

これによりエラーは発生せず、ローカル変数bが値に設定されますundefined。これには何の問題もありません。

ただし、ネストされたプロパティがあると、状況がおかしくなります。プロパティのレベルは未定義である可能性があります。

a = {};
var b = a.foo.bar;

この例では例外が発生します。ネスティングのレベルがない場合は、ドリルインする前に各レベルをテストする必要があります。

a = {};
var b = a.foo && a.foo.bar;

それを考慮して、このコードは、深くネストされた値が存在する場合はそれをプッシュする必要があります。そうでない場合は、0代わりにプッシュしてください。

generalValues.push(
  (
    aBigObject.Key1 &&
    aBigObject.Key1.Key2 &&
    aBigObject.Key1.Key2.Key3
  ) || 0
);

また...coffeescriptはかなりクールです

于 2012-12-06T22:10:10.993 に答える