Связаны, но не одно и то же
Attribute — то, что в HTML-разметке (id="x"). Property — поле DOM-объекта (el.id).
<input id="email" value="hello">
const input = document.querySelector('#email');
input.getAttribute('value');
input.value;
input.value = 'new';
input.getAttribute('value');
Важные отличия
- не у всех атрибутов есть 1:1 property (
class ↔ className, for ↔ htmlFor);
- boolean-атрибуты (
disabled) vs свойства true/false;
data-* → dataset;
- изменение property не всегда синхронизирует attribute.
Практика
Для актуального состояния контролов читайте properties; attributes — начальная разметка и кастомные данные.