2

私の Javascript コードでは、null の可能性があるプロパティを持つ多くの json オブジェクトを処理します。

if (store.departments != null) {
    for(var i = 0; i < store.departments.length; i++) {
        alert(department.name);
    }
}

アプリを coffeescript に移植する際に、存在演算子を使用して次のショートカットを作成しました。

for department in store.departments ? []
    alert department.name

これは受け入れられるコーヒースクリプトですか? これが意図したとおりに機能しないシナリオはありますか?

4

2 に答える 2

2

これはどうですか?

if store.departments  
  alert department.name for department in store.departments

または

alert department.name for department in store.departments if store.departments

どちらのステートメントも次のようにコンパイルされます。

var department, _i, _len, _ref;

if (store.departments) {
  _ref = store.departments;
  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
    department = _ref[_i];
    alert(department.name);
  }
}
于 2012-12-05T20:03:13.433 に答える
1

あなたが何を求めているのか理解できれば、このコードはあなたが考えていることを実行しません。

for department in store.departments ? []

?三項演算子と同様の存在演算子を使用しているようですa?b:c。coffeescript.org から:

JavaScript で変数の存在を確認するのは少し難しいです。if (variable) ... 近いですが、ゼロ、空の文字列、および false の場合は失敗します。CoffeeScript の存在演算子 ? 変数が null または未定義でない限り true を返します。これは、Ruby の nil? に似ています。

後で名前を使用したい場合は、次のように記述します。

if store.departments?
    names = (department.name for department in store.departments)

すべてを 1 行にまとめることもできますが、リスト内包表記ではかなり読みにくくなります。存在演算子は null && undef をテストし、実際に存在する場合にのみ true を返します。

coffeescript で三項演算子を使用する場合は、簡潔ではありません。

for department in if store.departments? then store.departments else []

ここでは非常に冗長なので、あなたが望むものではないかもしれません。

于 2012-12-15T23:28:23.097 に答える