Kiat bermain golf di CoffeeScript

8

Trik apa yang Anda ketahui untuk membuat kode CoffeeScript lebih pendek?

CoffeeScript adalah bahasa yang dikompilasi menjadi JavaScript ("transpiles" ke ES3, tepatnya). Aturan emas adalah "Ini hanya JavaScript", yang berarti tidak ada overhead runtime. Sebagian besar Tips & Trik JavaScript berlaku juga.

Sebagai efek samping yang juga berarti: pengembang yang berasal dari JavaScript (termasuk saya) cenderung menggunakan konstruksi JavaScript alih-alih alternatif CoffeeScript yang lebih pendek.

Utas ini berfokus pada kiat khusus untuk CoffeeScript.

Tautan ke topik terkait:

Kiat untuk bermain golf dalam JavaScript

Kiat Golf di ECMAScript 6 ke atas

metalim
sumber
Bisakah coffeescript dikompilasi ke ES6? Apakah ini kompatibel?
haskeller bangga
@proudhaskeller Mengkompilasi ke dalam ES3 secara umum, dengan satu pengecualian: jika Anda yield, ia mengkompilasi menjadi generator ES6. Kalau tidak, ia akan berusaha memenuhi persyaratan browser.
metalim

Jawaban:

3

Gunakan tugas penataan, jika elemen struktur sering digunakan

Misalnya. dapatkan elemen array argumen pertama

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]

Ini dapat dikombinasikan dengan percikan

[first, rest..., last] = doSmth()
metalim
sumber
1
Mungkin lebih baik jika Anda memisahkan setiap tip menjadi jawaban yang terpisah :)
Beta Decay
Kesepakatan @BetaDecay.
metalim
2

Evaluasi hubungan pendek sebagai pengganti operator ternary

CoffeeScript tidak memiliki operator ternary JavaScript ?, namun fungsi evaluasi hubung singkat kadang-kadang dapat digunakan sebagai gantinya:

foo = a && b || c

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

Agak setara dengan dalam JavaScript:

foo = a ? b : c

Ini tidak akan berfungsi jika b adalah (atau dapat mengevaluasi) nilai falsy seperti 0.

rink.attendant.6
sumber
2

Operator divisi integer //

Menghemat hingga 10 byte dengan menghindari kebutuhan nomor lantai saat membagi.

Menggunakan //operator:

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)

Dibandingkan dengan JavaScript:

foo = 61/3                // foo = 20.333333333333332
foo = Math.floor(61/3)    // foo = 20 (16 bytes)
foo = 61/3|0              // foo = 20 (6 bytes)
rink.attendant.6
sumber
(61/3|0)bekerja dengan baik untuk vanilla JS.
Produksi ETH
@ ETHproductions Saya telah menambahkannya ke pos untuk menunjukkan perbedaan dalam bytesize
rink.attendant.6
//sebenarnya a .floor(), jadi itu bekerja secara berbeda untuk angka negatif foo = -61//3 # -21foo = -61/3|0 # -20
:,
Anda juga bisa menggunakan //1lantai biasa.
Cyoce
1

Hilangkan tanda kurung jika memungkinkan

func1 func2 func3(a),func3 b

#instead of

func1(func2(func3(a),func3(b))
metalim
sumber
1

Tidak nulltapi mungkin falsy ( 0, NaN, "", false, dll)

Jika Anda perlu memeriksa apakah suatu variabel didefinisikan dan tidak null, gunakan tanda tanya tambahan:

alert 'Hello world!'if foo?

Kompilasi ke:

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

Ini mungkin tidak akan berlaku untuk banyak entri kode golf tetapi mungkin berguna jika Anda perlu membedakan dari nol, false, string kosong, atau nilai falsy lainnya.

rink.attendant.6
sumber
1

Operator eksponensial **

Menghemat 9 byte:

foo = 2**6
# foo = 64

Dibandingkan dengan JavaScript:

foo = Math.pow(2,6)
// foo = 64
rink.attendant.6
sumber
Untuk kekuatan dua orang, ini tidak relevan 1<<xsama dengan2**x
Stan Strum
1

Mencari array

Simpan sekitar 8 byte jika Anda hanya ingin memeriksa apakah suatu elemen ada dalam array, Anda dapat menggunakan inoperator.

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

Dibandingkan dengan alternatif dalam 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

Namun dalam kasus langka bahwa Anda memerlukan indeks elemen maka trik ini tidak akan berhasil untuk Anda.

rink.attendant.6
sumber
Hal yang sama berlaku untuk mencari string, atau mendeteksi jika karakter dalam set tertentu:b = c in'|-+'
metalim
1

Ruang itu menyenangkan. Ruang penting untuk fungsi panggilan

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 ) )
metalim
sumber
0

Gunakan percikan

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.
metalim
sumber
0

Aksesor aman: ?.danfunc? args...

Operator eksistensial ?memiliki banyak bentuk dan kegunaan. Selain hanya memeriksa apakah variabel disetel, Anda dapat mengakses metode dan properti objek tanpa terlebih dahulu memeriksa apakah objek tersebut nol:

obj.property?.method? args...

akan mengeksekusi obj.property.method args...hanya jika obj.propertydan obj.property.methoddidefinisikan dan bukan nol.

Berguna jika Anda mengulangi beberapa array jarang pada saat yang sama:

arr1[i]?.prop = arr2[i]?.method? args... for i in[0..99]
metalim
sumber