- 일반적으로 HTML에서 속성과 프로퍼티는 다른 개념으로 다르게 설정할 수 있습니다.
// 속성 적용
<div foo="bar">…</div>
<script>
const div = document.querySelector('div[foo=bar]');
console.log(div.getAttribute('foo'));
console.log(div.foo);
div.foo = 'hello world';
console.log(div.getAttribute('foo'));
console.log(div.foo);
</script>
차이점
- 속성을 부여한 엘리먼트는 직렬화가 가능하지만 프로퍼티는 볼 수 없습니다.
const div = document.createElement('div');
div.setAttribute('foo', 'bar');
div.hello = 'world';
console.log(div.outerHTML);
- 속성은 항상 문자열 형태만 가능하지만 프로퍼티는 모든 타입으로 설정할 수 있습니다.
const div = document.createElement('div');
const obj = { foo: 'bar' };
div.setAttribute('foo', obj);
console.log(typeof div.getAttribute('foo'));
console.log(div.getAttribute('foo'));
div.hello = obj;
console.log(typeof div.hello);
console.log(div.hello);
- 속성의 key값은 대소문자를 구분하지 않지만 프로퍼티의 key 값은 대소문자를 구분합니다.
<div id="test" HeLlO="world"></div>
<script>
const div = document.querySelector('#test');
console.log(div.getAttributeNames());
div.setAttribute('FOO', 'bar');
console.log(div.getAttributeNames());
div.TeSt = 'value';
console.log(div.TeSt);
console.log(div.test);
</script>
이상한 현상
- HTML 스펙에 정의된 모든 속성은 속성을 정의하면 동시에 프로퍼티를 생성하며 동기화가 이루어집니다. 이유는 getter와 setter가 존재하기 때문입니다.
<div id="foo"></div>
<script>
const div = document.querySelector('#foo');
console.log(div.getAttribute('id'));
console.log(div.id);
div.id = 'bar';
console.log(div.getAttribute('id'));
console.log(div.id);
</script>
value
프로퍼티는 value
속성을 반영하지 않고 defaultValue
프로퍼티가 value
속성을 반영합니다.
- 즉
value
프로퍼티는 어떠한 속성도 반영하지 않는다는 것을 의미합니다. ( 이러한 대표적인 속성은 offsetWidth
, parentNode
등 존재 )
<input type="text" value="default" />
<script>
const input = document.querySelector('input');
console.log(input.getAttribute('value'));
console.log(input.value);
console.log(input.defaultValue);
input.defaultValue = 'new default';
console.log(input.getAttribute('value'));
console.log(input.value);
console.log(input.defaultValue);
input.value = 'hello!';
console.log(input.getAttribute('value'));
console.log(input.value);
console.log(input.defaultValue);
input.setAttribute('value', 'another new default');
console.log(input.getAttribute('value'));
console.log(input.value);
console.log(input.defaultValue);
</script>
참고