CoffeeScriptでのゴルフのヒント


8

CoffeeScriptコードを短くするために知っているトリックは何ですか。

CoffeeScriptは、JavaScriptにコンパイルする言語です(正確には、ES3に「トランスパイル」します)。黄金律は「それは単なるJavaScriptです」であり、実行時のオーバーヘッドはありません。ほとんどのJavaScriptのヒントとテクニックも適用されます。

副次的効果としては、次のことも意味します。JavaScriptを使用している開発者(自分自身を含む)は、より短いCoffeeScriptの代わりにJavaScript構成を使用する傾向があります。

このスレッドは、CoffeeScriptに固有のヒントに焦点を当てています。

関連トピックへのリンク:

JavaScriptでのゴルフのヒント

ECMAScript 6以降でのゴルフのヒント


coffeescriptはES6にコンパイルできますか?互換性はありますか?
誇り高いハスケラー、2015

@proudhaskeller ES3にコンパイルしますがyield、1つ例外があります。それ以外の場合は、可能な限りブラウザに準拠しようとします。
メタリム

回答:


3

構造化要素が頻繁に使用される場合は、分解割り当てを使用します

例えば。最初の引数配列の要素を取得する

func = ([x,y,z])->
    [i,j] = doSomething x, y, x+y
    doSomethingElse i, j

# instead of

func = (a)->
    b = doSomething a[0], a[1], a[0]+a[1]
    doSomethingElse b[0], b[1]

これはスプラットと組み合わせることができます

[first, rest..., last] = doSmth()

1
各ヒントを個別の回答に分けた方がいいかもしれません:)
Beta Decay

@BetaDecayディール。
メタリム

2

三項演算子の代わりの短絡評価

CoffeeScriptにはJavaScriptの三項演算子 はありませんが?、代わりに短絡評価の機能を使用できる場合があります。

foo = a && b || c

# Long form:
foo = if a then b else c

JavaScriptの場合と同等です。

foo = a ? b : c

bがなどの偽の値である(または評価できる)場合は機能しません0


2

整数除算演算子 //

分割時に数をフロアする必要をなくすことにより、最大10バイトを節約します。

//演算子を使用する:

foo = 61/3                 # foo = 20.333333333333332
foo = Math.floor 61/3      # foo = 20 (15 bytes)
foo = 61/3|0               # foo = 20 (6 bytes)
foo = 61//3                # foo = 20 (5 bytes)

JavaScriptと比較:

foo = 61/3                // foo = 20.333333333333332
foo = Math.floor(61/3)    // foo = 20 (16 bytes)
foo = 61/3|0              // foo = 20 (6 bytes)

(61/3|0)バニラJSでも同様に機能します。
ETHproductions 2015

@ETHproductionsバイトサイズの違いを示すために投稿に追加しました
rink.attendant.6

//実際にa .floor()、それは負の数では異なる動作しますfoo = -61//3 # -21、一方でfoo = -61/3|0 # -20
metalim

//1無地の床にもお使いいただけます。
Cyoce 16

1

可能な場合は括弧を省略します

func1 func2 func3(a),func3 b

#instead of

func1(func2(func3(a),func3(b))

1

ではないnullが、おそらくfalsy( 、0NaN""falseなど)

変数が定義されているかどうかを確認する必要がある場合はnull、末尾の疑問符を使用します。

alert 'Hello world!'if foo?

コンパイルして:

if (typeof foo !== 'undefined' && foo !== null) {
    alert('Hello world!')
}

これはおそらく多くのコードゴルフエントリには当てはまりませんが、ゼロ、偽、空の文字列、または他の偽の値と区別する必要がある場合に役立ちます。


1

べき乗演算子 **

9バイト節約:

foo = 2**6
# foo = 64

JavaScriptと比較:

foo = Math.pow(2,6)
// foo = 64

2の累乗の場合、これは次1<<xと等しいので関係ありません2**x
Stan Strum

1

配列の検索

要素が配列にあるかどうかを確認するだけであれば、約8バイトを節約できますin。この演算子を使用できます。

y = x in['foo', 'bar', 'baz']

JavaScriptの代替と比較して:

y = ~['foo', 'bar', 'baz'].indexOf(x)   // ES5, returns Number
y = ['foo', 'bar', 'baz'].includes(x)   // ES7, returns boolean
y = ~$.inArray(x,['foo', 'bar', 'baz']) // jQuery, returns Number

ただし、まれに要素のインデックスが必要になる場合、このトリックは機能しません。


文字が特定のセット内にある場合と同じ文字列を検索、または検出するために適用されます:b = c in'|-+'
metalim

1

スペースは楽しいです。スペースは関数を呼び出すために重要です

a=b[i]  # get i-th element of array b
a=b [i] # a = b( [i] ) # pass [i] to function b

m=n+k   # simple math
m=n +k  # m = n( +k ) # convert k to number and pass to function n
m=n -k  # m = n( -k ) # pass -k to function n
m=n + k # simple math again


a(b c)+d   # a( b( c ) ) + d
a (b c)+d  # a( b( c ) + d )
a (b c) +d # a( b( c )( +d ) )

0

スプラットを使用する

obj.method a, params...

# instead of

obj.method.apply obj, [a].concat params

# especially useful with new objects

obj = new Obj a, params...

# alternative is complicated, unreadable and not shown here.

0

安全なアクセサー:?.およびfunc? args...

存在演算子に?は多くの形式と用途があります。変数が設定されているかどうかを確認するだけでなく、オブジェクトがnullかどうかを事前に確認することなく、オブジェクトのメソッドとプロパティにアクセスできます。

obj.property?.method? args...

およびが定義されていてnullでないobj.property.method args...場合にのみ実行されます。obj.propertyobj.property.method

同時に複数のスパース配列を反復処理する場合に役立ちます。

arr1[i]?.prop = arr2[i]?.method? args... for i in[0..99]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.