Calling with Commas in Javascript
If you want to call something multiple times, it’s easy
const f = () => console.log("f() called");
f();
// f() called
f();
// f() called
f();
// f() called
But that’s so basic. You can also do it this way.
[1, 2, 3].forEach(f);
// f() called
// f() called
// f() called
// => undefined
But those constant literals there are clouding up the whole business. Gross, but we can remove them!
[, ,].forEach(f);
// => undefined
But wait! f()
isn’t called for every element, then! What gives? There’s a hint here if we use Array.map
instead…
[, ,].map(f);
// => [ <2 empty items> ]
It’s because of copy elision here. But if we use Ramda#map, it does work.
const R = require("ramda");
R.map(f, [, ,]);
// f() called
// f() called
// => [ undefined, undefined ]
But it’s only called twice! What gives? This is because of trailing commas in arrays. It’s a feature, not a bug.
const R = require("ramda");
const ff = R.map(f);
ff([, , ,]);
// f() called
// f() called
// f() called
// => [ undefined, undefined, undefined ]
Enjoy your job security!