Changes to CoffeeScript: - '&' and '&&' operators swapped - '|' and '||' operators swapped - '<-' instead of 'return' - @@foo can be used to refer to a property of the local function (arguments.callee) - multiline objects can be returned: <- foo: bar - 'next' instead of 'continue' - No implicit returns, functions without a <- return undefined - Destructured object arguments with defaults can be omitted when calling the function: foo = (value, { option1, option2 = 'default' }) -> ... foo('theValue') # no JS runtime error! - Regex delimiter is '~' instead of '/' (looks like "somewhat like", and easier to parse :-)) - Single-quoted (" ') strings cannot contain newlines - Arrays can be indexed from the end by using - as the first char in the index (internally works as [-1..][0] :-( ) foo[-1] returns element at the end foo[-bar()] returns bar()est element from the end (bar() is positive) foo[-1..5] is still working as slice - each loops: each arrayVar as element each arrayVar as element[++] (same as above) each arrayVar as element[--] (traverses array in reverse) each arrayVar as element[index] each arrayVar as element[index++] (same as above) each arrayVar as element[index--] each arrayVar as { key1, key2 } # when array elements are objects, extract each of these keys and put them in key1 key2 each objectVar as key:value each objectVar as key: each objectVar as :value - with blocks: with anything .foo = 1 translates to: anything.foo = 1 - Macro support macro foobar (arg1, arg2) if arg1 == arg2 doBlah() Macros are always scoped to the current file.