
요소 노드 객체에는 HTML 어트리뷰트에 대응하는 프로퍼티(이하 DOM 프로퍼티)가 존재합니다. 이 DOM 프로퍼티들은 HTML 어트리뷰트 값을 초기값으로 가지고 있습니다. DOM 프로퍼티는 setter와 getter 모두 존재하는 접근자 프로퍼티입니다. 따라서 DOM 프로퍼티는 참조와 변경이 가능합니다.
<!DOCTYPE html>
<html>
<body>
<input id="user" type="text" value="ungmo2" />
</body>
<script>
const $input = document.getElementById("user");
console.log($input.id); // user
console.log($input.type); // text
console.log($input.value); // ungmo2
$input.value = "foo";
console.log($input.value); // foo
</script>
</html>
결론부터 말하자면 HTML 어트리뷰트는 DOM에서 중복 관리되고 있지 않습니다. 요소 노드는 2개의 상태, 즉 초기 상태와 최신 상태를 관리해야 합니다.
getAttribute.setAttribute 메서드를 사용합니다.단, 모든 DOM 프로퍼티가 사용자의 입력에 의해 변경되는 최신 상태를 관리하는 것은 아닙니다. 예를 들어, input 요소의 사용자 입력에 의한 상태 변화는 value 프로퍼티가 관리하고 checkbox 요소의 사용자 입력에 의한 상태 변화는 checked 프로퍼티가 관리합니다. 하지만 id 어트리뷰트에 대응하는 id 프로퍼티는 사용자의 입력과 아무런 관계가 없습니다. 따라서 사용자 입력에 의한 상태 변화와 관계없는 id 어트리뷰트와 id 프로퍼티는 사용자 입력과 관계없이 항상 동일한 값을 유지합니다. 즉, id 어트리뷰트 값이 변하면 id 프로퍼티 값도 변하고 그 반대도 마찬가지입니다.
대부분의 HTML 어트리뷰트는 HTML 어트리뷰트 이름과 동일한 DOM 프러퍼티와 1:1로 대응합니다. 단, 다음과 같이 HTML 어트리뷰트와 DOM 프로퍼티가 언제나 1:1로 대응하는 것은 아니며 HTML 어트리뷰트 이름과 DOM 프로퍼티 키가 반드시 일치하는 것도 아닙니다.
id 어트리뷰트와 id 프러피티는 1:1 대응하며, 동일한 값으로 연동합니다.input 요소의 value 어트리뷰트는 value 프러피티와 1:1 대응합니다. 하지만 value 어트리뷰트는 초기 상태를 value 프로퍼티는 최신 상태를 갖습니다.class 어티르뷰트는 className, classList 프로퍼티와 대응합니다.for 어트리뷰트는 htmlFor 프로퍼티와 1:1 대응합니다.td 요쇼의 colspan 어트리뷰트는 대응하는 프로퍼티가 존재하지 않습니다.textContent 프로퍼티는 대응하는 어트리뷰트가 존재하지 않습니다.getAttribute 메서드로 취득한 어티르뷰트 값은 언제나 문자열입니다. 하지만 DOM 프로퍼티로 취득한 최신 상태 값은 문자열이 아닐 수도 있습니다.
<!DOCTYPE html>
<html>
<body>
<input type="checkbox" checked />
</body>
<script>
const $checkbox = document.querySelector("input[type=checkbox]");
console.log($checkbox.getAttribute("checked")); // ""
console.log($checkbox.checked); // true
</script>
</html>