sellarafaeli.com

Let vs Const vs Var - Misleading && Harmful

‘New’ versions of JS support let and const (vs var) which leads to endless discussions about when to use which. Sadly in the real world, it doesn’t really matter.

const only enforces constantness on a superficial level, at the base variable assignment.

const x = {};
x = 'foo' //boom

It famously does not prevent modifying internal fields of an object or array.

const x = {msg: 'hi'}
x.msg = 'bye' //works. uh-oh

const simply doesn’t guarantee complete const-ness. To clarify: a variable declared as const can still change its value. This is clearly misleading; the whole point of a const statement is to signify the value will not change. The net result is even worse than not using const to begin with - you have now indicated a misleading aspect about the data, which the interpreter/transpiler will not enforce.

So const is not “really” const. This leads to separate styles of choosing when to use let vs const - should const values only be used for ‘deep’ constant-ness (non-mutating state, including properties, as logically expected) or ‘shallow’ constant-ness (as defined by the interpreter)? I strongly prefer the first one – don’t use const for values that change – but the very fact that there are two separate valid interpretations means that when you’re reading code, you can’t fully make any assumptions about whether the value changes or not, and thus the whole declaration is almost meaningless. (A caveat is that const ensures the variable won’t be assigned a completely new value, so const is still useful for primitives.)

Basically at this point, a const for a non-primitive means a value will either change… or it won’t. Since the syntax itself cannot reliably indicate whether the value is really constant, you as a writer cannot signal to a future reader whether the value is truly constant or not – and a reader cannot assume anything from a variable being declared as const.

To make things even worse, the mere fact that there are separate conflicting ways in which you can ‘use’ const (as described above) means that you will have to guess which way the original author ‘meant’. All of this takes significant cognitive overhead when just reading a variable, and creates an ensuing muddy bikeshedding discussion about what to use when, which costs more cognitive effort than it saves.

As a concrete alternative, real consts could be in UPPERCASE, which is well-known convention for constness. These just don’t get protection by the interpreter, but the meaning to the reader is clear and obvious.

FOO    = 'bar'
SERVER = {url: 'google.com'}

Everything else can be let or var. let is the new ‘cool’ way to declare local variables, but is only functionally better if you have recurring variable names within different blocks in the same function, which is… better rectified by not reusing the same variable name in the function.)

Use whatever you want for const/let/var, it matters little. Focus on architecture and semantics more than syntax.