Smallest Common Multiple - help understanding solution

I struggled with this smallest common multiple challenge for a while. I found a solution on stack overflow that looks super sexy and fairly simple but I’m having trouble understanding exactly what’s happening.
It would be really helpful if someone could break it down for me a little bit.
This is my first time posting, please let me know if I should do anything to improve my etiquette.
Thanks in advance!

function smallestCommons(arr) {
  arr.sort((a,b) => a-b)
  while(arr[0] < arr[1]) {
  arr.splice(1,0, arr[1] - 1)
  arr.shift()  //how could I avoid this shift?

//everything below this line is what I need help understanding. 
const gcd = (a, b) => a ? gcd(b % a, a) : b;
const lcm = (a, b) => a * b / gcd(a, b);
return arr.reduce(lcm)
//like, if I had this array [1,2,3,4,5], is lcm first comparing 1 and 2? what's happening here -> gcd(b % a, a)? 
Sorry if these are obvious questions, I'm very new to coding.

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/ Safari/537.36

Challenge: Intermediate Algorithm Scripting - Smallest Common Multiple

Link to the challenge:

Its is usually easier to explain if you have your own solution to compare with.

For this, I’d ignore this code for a minute. Step back and look up LCM and GCD.

Here you want to read the section called Using the greatest common divisor and Other

Then read here

specifically the Euclidean algorithm