[1, 2, 3].map( a => a * a ); // [1, 4, 9]
to [1, 2, 3].map(function(a) { return a * a; });
I prefer the former. It's more concise, and strips off a lot of visual noise, and I think it's more readable (the intent isn't wrapped in lots of boilerplate).
Where you can run into issues is architecture support. I'm running Node natively, but this means that some packages that don't support ARM will fail to build properly. I've been able to work around/do without for now, but depending on your use case, it could be an issue, if you want to run Node natively. (I do not have a feel for Node via Rosetta 2 performance.)