모든 HTML 태그는 객체이다. 태그내의 문자 역시 객체이다.
<!DOCTYPE HTML> <html> <head> <title>사슴에 관하여</title> </head> <body> 사슴에 관한 진실. </body> </html>
위의 HTML을 DOM은 아래와같이 표현.

태그는 요소 노드이고 트리구조를 구성한다.
html은 루트 노드 head, body는 그 자식 노드
요소 내의 문자는 텍스트 노드
텍스트노드는 자식노드를 가질수 없다.
위 그림에서 알 수 있듯이 줄바꿈 ↵와 공백␣ 도 텍스트 노드이다.
주석도 노드이다.
총 12개중 주로 사용하는 노드는 네가지다.
document 노드 : DOM의 진입점이 되는 노드element 노드 : 태그 같은 문서를 구성하는 요소인 노드text 노드 : 텍스트 노드comment 노드 : 주석 노드DOM의 모든 연산은 document 부터 시작한다.

DOM 탐색의 관계 이미지.
html = document.documentElement
body = document.body
head = document.head
document.body 는 null 일수도 있다.
<html> <head> <script> alert('head' : +document.body) // null 출력. body가 만들어지기 전에 출력하기 때문 </script> </head> <body> </body> </html>
childNode : 모든 자식 요소들을 담는다.
firstChild : 첫번째 자식 노드 (childNode[0])
lastChild : 마지막 자식 노드 (childNode[childNode.length - 1])
hasChildNode : 자식 요소 존재여부 검사
배열이 아닌 유사 배열인 collection(컬렉션) 이다.
map,filter,reduce...)childNode[0] = ... 이런식으로 자식 노드 교체 불가능.Array.from을 사용해 진짜 배열로 만들 수 있다.
형제노드 : 같은 부모를 가진 노드. (ex. <head>,<body> )
nextSibling : 다음 형제 노드(<head>,<body>에서 <head>의 nextSibling은 <body>)previousSibling : 이전 형제 노드(<head>,<body>에서<body>의 previousSibling 은 <head>.)부모노드 : parentNode 통해 참조 가능(document.body.parentNode 는 <html>)
위의 프로퍼티들은 모든 종류 노드 탐색. (주석이나 텍스트도)
children : 자식 노드중 요소 노드만 탐색firstElementChild, lastElementChild : 자식 노드중 첫번째, 마지막 요소 노드previousElementSibling, nextElementSibling : 형제 노드중 이전, 다음 요소 노드parentElement : 부모 요소 노드parentElement vs parentNode : 부모노드가 요소가 아닐시 전자는 null 반환
<div> DOM 노드
<ul> DOM 노드
두 번째 <li> (Pete)
<html> <body> <div>사용자:</div> <ul> <li>John</li> <li>Pete</li> </ul> <script> /*아래 DOM 노드에 접근할 방법을 최소 한 가지 이상씩 생각해보세요. <div> DOM 노드 <ul> DOM 노드 두 번째 <li> (Pete) */ console.log(document.body.firstElementChild) // body의 첫번째 자식 요소노드는 div console.log(document.body.lastElementChild) // body의 마짐가 자식 요소 노드는 ul console.log(document.body.lastElementChild.lastElementChild) // body의 마지막 자식 요소노드의 마지막 자식 요소노드는 li pete </script> </body> </html>
임의의 DOM 요소 노드 elem이 있다고 가정해봅시다.
elem.lastChild.nextSibling은 항상 null일까요? YESlastChild는 마지막 노드이므로 nextSibling을 사용할수 있는 다음 노드가 없다(null).elem.children[0].previousSibling은 항상 null일까요? NOchildren[0]은 자식요소노드중 첫번째 이므로 요소노드가 아닌 다른 노드가 앞에 있으면 previousSibling을 통해 불러올 수 있다. previousElementSibling일시는 null