2

このコーヒースクリプト:

if  typeof(groups) is undefined or groups.length == 0

次の JavaScript にコンパイルされます。

if (typeof groups === void 0 || groups.length === 0)

基本的に、グループ配列がnullまたは空であるかどうかを確認し、最初の条件が真の場合、2番目の条件がチェックされないことを望んでいます(短絡)。ただし、Chrome は次のエラーをスローします。

キャッチされない型エラー: 未定義のプロパティの長さを読み取ることができません

なぜ短絡しないのかについての洞察はありますか?

4

3 に答える 3

5

最初の条件が真になることは決してないからです。void 0undefined(文字列 "undefined"ではない)に評価されtypeofますが、文字列"undefined"を返します。

JavaScriptは次のようになります。

if (typeof groups === "undefined" || groups.length === 0)

または:

if (groups === void 0 || groups.length === 0)

CoffeeScriptを修正するには、文字列「undefined」を確認する必要があります。

if typeof groups is "undefined" or groups.length == 0
于 2012-09-28T11:33:20.493 に答える
3

CoffeeScript には、このケースを処理するオペレーターがあります。使用する場合:

unless groups?.length > 0

未定義/nullのケースを処理し、が定義されているgroups.length場合にのみ試行し、探しているものを形成します。groupsこれには、簡単に連鎖できるという利点があります。

if foo?.bar?.length > 0
于 2012-09-28T14:43:30.407 に答える
0

groupsがローカル変数の場合、次のように尋ねることができます。

if not groups or groups.length is 0
  ...

定義されていない可能性のあるグローバル変数の場合(つまり、アクセスするgroupsと「未定義」エラーがスローされます)、存在演算子を使用できます?

if not groups? or groups.length is 0
  ...

最後にlength、2番目の条件でプロパティを要求しているときに、0が偽であるという事実を利用できます。

if not groups?.length
  ...

groupsそして、この最後の式は、変数が定義されているかどうかを気にしません。どちらの場合でも機能します=D

于 2012-09-28T16:42:30.400 に答える