150

In what ways can you comment in CoffeeScript?

The documentation say you can use three hash symbols to start and close a comment block:

###
  Comments
  go
  here
###

I've found that I can sometimes use the following two formats

`// backticks allow for straight-JavaScript,
 // but the closing backtick can't be on a comment line (I think?)
`

Are there a simpler way to insert short comments in CoffeeScript?

Do NOT use this style**

Since this is getting a lot of views, I want to emphasize that

/* Comment goes here */

produces a MATH error when the /* is on its own line.

As Trevor pointed out in a comment on the question, this is a regular expression, NOT a comment!

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Eric Hu
  • 18,048
  • 9
  • 51
  • 67

5 Answers5

280

Use a single # sign

# like this

One character seems pretty minimal ;)

Also:

###
This block comment (useful for ©-Copyright info) also gets 
passed on to the browsers HTML /* like this! */
###
Michael Durrant
  • 93,410
  • 97
  • 333
  • 497
  • 4
    This is usually how you will want to comment; the triple hash is most often used when you want the comment to fall through to the javascript (copyright messages, usually). – Aaron Dufour Oct 16 '11 at 18:44
  • 5
    Ah *sigh*. The official docs use the single # form all through their examples, but never actually mention it in the text explanations, it only talks about the block comments. – Gerry Jun 13 '12 at 19:09
  • 1
    Unfortunately no way to have block comments that don't show up in output. – nilskp Dec 29 '14 at 12:51
24

The main way to comment is sh/Perl/Ruby/... style # comments:

# This comment goes to the end of the line
# and it won't appear in the "compiled"
# JavaScript version.

You use the block style ### comments when you want a comment to appear in the JavaScript version:

Sometimes you'd like to pass a block comment through to the generated JavaScript. For example, when you need to embed a licensing header at the top of a file. Block comments, which mirror the syntax for heredocs, are preserved in the generated code.

So if you start with

###
PancakeParser is Public Domain
###

then you'd get this JavaScript comment in the generated JavaScript:

/*
PancakeParser is Public Domain
*/
mu is too short
  • 426,620
  • 70
  • 833
  • 800
4

Beware of ###! If you use ### to separate sections of code (as I do) it's awfully surprising when that code stops working as a result.

Mark Wilden
  • 2,080
  • 1
  • 15
  • 15
  • Do you know why? We have the code working locally but not on the build server with ###. – Azat Oct 28 '13 at 23:12
  • Unfortunately, I noticed this months ago, and I'm not "in that space" right now to have a look at it. – Mark Wilden Nov 06 '13 at 16:48
  • 10
    Because a pair makes a block comment? –  Nov 08 '13 at 15:12
  • 3
    Would not be so surprising if you used a syntax-highlighting editor, with comments appearing in a different color – Nick Perkins Jun 29 '15 at 15:03
  • 4
    Why downvote? It's a valid warning. Really, it's saying don't use a solid line of # as a section separator, or you may occasionally get unbalanced block comment pairs. – Jim Mack Dec 08 '16 at 03:52
1

For comments in the middle of a line, try:

if somecond `/* hi */` && some other cond, etc.

The backticks cause CoffeeScript to put the enclosed text into the generated JavaScript as is.

John Deighan
  • 4,329
  • 4
  • 18
  • 19
0

Unfortunately, CoffeeScript is inconsistent with whether comments introduced with a single # character make it to the output JavaScript. For example:

# testme.coffee

fName = 'John'
lName = 'Smith'
fullName = "#{fName} #{lName}" # |||| $:
if true #comment
    console.log `/* hi */` 'Hello, World!'

compiles to

// Generated by CoffeeScript 2.7.0
(function() {
  // testme.coffee
  var fName, fullName, lName;

  fName = 'John';

  lName = 'Smith';

  fullName = `${fName} ${lName}`;

  if (true) { //comment
    console.log(/* hi */`Hello, World!`);
  }

}).call(this);

Note the missing comment on the line that assigns to fullName.

John Deighan
  • 4,329
  • 4
  • 18
  • 19