A diferença entre substring() e substr()
Há uma diferença sutil entre os métodos substring() e substr(), então você deve ter cuidado para não confundi-los.
Os argumentos de substring() representam os índices inicial e final, enquanto os argumentos de substr() representam o índice inicial e o número de caracteres a serem incluídos na string retornada.
Além disso, substr() é considerado um recurso legacy no ECMAScript e pode ser removido em versões futuras, portanto, é melhor evitar usá-lo, se possível.
Verifique mais informações no: MDN