Let’s talk about trailing commas (aka: “final commas”, “dangling commas”). Trailing commas refers to a comma at the end of a series of values in an array or array like object, leaving an essentially empty slot. e.g., [1, 2, 3, ]

I kind of like them when I work on Ruby and Python projects. A number of advantages of trailing commas have been pointed out, the most common of which is diffs:

diff --git a/hello.json b/hello.json
index e36ffac..d387a2f 100644
--- a/hello.json
+++ b/hello.json
@@ -1,4 +1,5 @@
 [
   "foo": 5,
   "bar": 6,
+  "apple": 7,
 ]
diff --git a/world.json b/world.json
index 14a2818..41f8a01 100644
--- a/world.json
+++ b/world.json
@@ -1,4 +1,5 @@
 [
   "foo": 5,
-  "bar": 6
+  "bar": 6,
+  "apple": 7
 ]

Example blog posts on the topic: https://dontkry.com/posts/code/trailing-commas.html, https://medium.com/@nikgraf/why-you-should-enforce-dangling-commas-for-multiline-statements-d034c98e36f8

Many languages support trailing commas, and some even consider it best practice to use trailing commas.

Ruby

[ "hello", "world" ]
# => ["hello", "world"]
[ "hello", "world", ]
# => ["hello", "world"]

Works the same for hashes.

Python

[ "hello", "world" ]
# Out[1]: ['hello', 'world']
[ "hello", "world", ]
# Out[2]: ['hello', 'world']

Works the same for sets and dictionaries.

Javascript

Mozilla gives a thorough overview of trailing commas in Javascript.

[ "hello", "world" ]
// [ 'hello', 'world' ]
[ "hello", "world", ]
// [ 'hello', 'world' ]

Probably works for other data types…?

Rust

https://users.rust-lang.org/t/trailing-commas/13993

[ "hello", "world" ]
// vs
[ "hello", "world", ]

Probably works for other data types…?

Julia

https://users.rust-lang.org/t/trailing-commas/13993

( 1, 2 )
# (1, 2)
( 1, 2, )
# (1, 2)

works the same with arrays in Julia.

others

Apparently others do as well: Perl, C#, Swift, etc …

Disagree

Some do not like trailing commas:


R

However, the main dev work I do is in R, which does not support trailing commas.

c("hello", "world")
#> [1] "hello" "world
c("hello", "world", )
#> Error in c("hello", "world", ) : argument 3 is empty

The one caveat is that you will see trailing commas in subsetting procedures of lists, vectors, data.frames, matrices, e.g.,

mtcars[1:3, ]

One blogger provides an override to allow trailing commas though I’d imagine it’s not a good idea to use as you probably don’t want such fundamentally different behavior in your own R console compared to others.

I’ve not seen any discussion of trailing commas in R as a language feature, whether good, bad or otherwise. Doesn’t mean it doesn’t exist though :)

Haskell

Like R, doesn’t allow trailing commas!

And in fact, allegedly (I don’t use Haskell):

Because it is much more common to append to lists rather than to prepend, Haskellers have developed the idiom of leading comma:

  ( foo
  , bar
  , baz
  , quux
  )

JSON

Unfortunately for many people JSON does not allow trailing commas

see also: leading with commas