Qual é a diferença entre setTimeout e setInterval em JavaScript?

A diferença é muito ligeira.
O código associado ao setInterval é executado a cada X milisegundos (por “X” entende-se um número de milisegundos personalizável), enquanto que o setTimeout espera X milisegundos, corre a função associada, o que leva alguns milisegundos e depois corre outro timeout. Portanto, neste caso, o período de espera é maior que os X milisegundos.

Nota: Esta publicação é uma tradução e adaptação de uma resposta a uma pergunta no StackOverFlow: setTimeout or setInterval?.