for..in перебирает все свойства объекта, которые тот имеет. Унаследованные от прототипа или присвоенные уже данному экземпляру-неважно. Соответственно на каждый элемент необходимо вызывать проверку hasOwnProperty, чтоб отсеять свойства прототипа и проверку содержимого, ибо к примеру для массива свойство length тоже попадет в цикл, и не отсеется предыдущей проверкой.
for..of является неявным итератом, который перебирает именно присвоенные свойства объекта, не захватывая наследованные и другие поля, что делает значительно более удобным