Зачем при верстке добавлять классы «js»? Я понимаю — разделение представление и логики. Но зачем это нужно? Зачем нужно это разделение?
Плохого в том, что у вас есть 5 разных кнопок, но все запускают одно и то же событие. Вы будете вешать один и тот же обработчик на 5 разных айдишников? или все-таки создадите один класс, пропишите только для него обработчик и будете писать этот класс для всех кнопок, на которые вы хотите повесить какое-то действие? Я думаю ответ очевиден. А классы вида .js-add-to-cart делаются для того, чтобы было проще отыскать ваш функционал в коде, ведь сразу понятно что сюда повешен обработчик какой-то, чем пытаться потенциальный ID выискивать в вашем js коде.
Часто бывает, что визуальную часть фронта делает один человек, а "оживляж" другой. А то и несколько других. Вот чтобы они как можно меньше пересекались.