Mẹo chơi gôn trong CoffeeScript


8

Những thủ thuật nào bạn biết để làm cho mã CoffeeScript ngắn hơn?

Chính xác thì CoffeeScript là ngôn ngữ biên dịch thành JavaScript ("transpiles" thành ES3). Nguyên tắc vàng là "Đó chỉ là JavaScript", nghĩa là không có chi phí thời gian chạy. Hầu hết các mẹo & thủ thuật JavaScript cũng được áp dụng.

Như một hiệu ứng phụ cũng có nghĩa là: các nhà phát triển đến từ JavaScript (bao gồm cả bản thân tôi) có xu hướng sử dụng các cấu trúc JavaScript thay vì các lựa chọn thay thế CoffeeScript ngắn hơn.

Chủ đề này tập trung vào các mẹo cụ thể cho CoffeeScript.

Liên kết đến các chủ đề liên quan:

Mẹo chơi gôn trong JavaScript

Mẹo chơi gôn trong ECMAScript 6 trở lên


Coffeescript có thể biên dịch thành ES6 không? Có tương thích không?
tự hào

@proudhaskeller Nó biên dịch thành ES3 nói chung, với một ngoại lệ: nếu bạn yield, nó biên dịch thành trình tạo ES6. Nếu không, nó cố gắng tuân thủ trình duyệt nhất có thể.
metalim

Câu trả lời:


3

Sử dụng các bài tập hủy, nếu các phần tử cấu trúc được sử dụng thường xuyên

Ví dụ. lấy các phần tử của mảng đối số đầu tiên

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]

Điều này có thể được kết hợp với splats

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

1
Có thể tốt hơn nếu bạn tách từng mẹo thành một câu trả lời riêng biệt :)
Beta Decay

@BetaDecay Thỏa thuận.
metalim

2

Đánh giá ngắn mạch thay cho người vận hành ternary

CoffeeScript không có toán tử tạm thời của JavaScript ?, tuy nhiên, đôi khi có thể sử dụng chức năng đánh giá ngắn mạch :

foo = a && b || c

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

Có phần tương đương với JavaScript:

foo = a ? b : c

Nó sẽ không hoạt động nếu b là (hoặc có thể đánh giá) một giá trị giả như 0.


2

Toán tử chia số nguyên //

Lưu tối đa 10 byte bằng cách tránh sự cần thiết số sàn khi chia.

Sử dụng //toán tử:

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)

So với 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)cũng hoạt động tốt cho vanilla JS.
Sản xuất ETH

@ETHproductions Tôi đã thêm nó vào bài viết để chỉ ra sự khác biệt về byteize
rink.attguard.6

//thực tế a .floor(), vì vậy nó hoạt động khác nhau đối với các số âm foo = -61//3 # -21foo = -61/3|0 # -20
:,

Bạn cũng có thể sử dụng //1cho một sàn phẳng.
Cyoce

1

Bỏ qua dấu ngoặc đơn khi có thể

func1 func2 func3(a),func3 b

#instead of

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

1

Không nullnhưng có thể falsy ( 0, NaN, "", false, vv)

Nếu bạn cần kiểm tra xem một biến có được xác định hay không null, hãy sử dụng dấu chấm hỏi:

alert 'Hello world!'if foo?

Biên dịch thành:

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

Điều này có thể sẽ không áp dụng cho nhiều mục nhập mã golf nhưng có thể hữu ích nếu bạn cần phân biệt với một chuỗi 0, sai, chuỗi rỗng hoặc giá trị giả khác.


1

Toán tử lũy thừa **

Lưu 9 byte:

foo = 2**6
# foo = 64

So với JavaScript:

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

Đối với sức mạnh của hai người, điều này không liên quan 1<<xbằng2**x
Stan Strum

1

Tìm kiếm mảng

Lưu khoảng 8 byte nếu bạn chỉ muốn kiểm tra xem một phần tử có trong một mảng không, bạn có thể sử dụng intoán tử.

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

So với các lựa chọn thay thế trong 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

Tuy nhiên trong trường hợp hiếm hoi là bạn cần chỉ số của phần tử thì thủ thuật này sẽ không hiệu quả với bạn.


Áp dụng tương tự cho tìm kiếm chuỗi hoặc phát hiện nếu ký tự có trong bộ cụ thể:b = c in'|-+'
metalim

1

Không gian thật vui. Không gian có ý nghĩa đối với các chức năng gọi

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

Sử dụng biểu tượng

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

Người truy cập an toàn: ?.func? args...

Toán tử tồn tại ?có nhiều hình thức và cách sử dụng. Ngoài việc chỉ kiểm tra nếu biến được đặt, bạn có thể truy cập các phương thức và thuộc tính của đối tượng mà không cần kiểm tra trước nếu đối tượng là null:

obj.property?.method? args...

sẽ obj.property.method args...chỉ thực hiện nếu obj.propertyobj.property.methodđược xác định và không null.

Hữu ích nếu bạn lặp đi lặp lại trên một số mảng thưa thớt cùng một lúc:

arr1[i]?.prop = arr2[i]?.method? args... for i in[0..99]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.