단방향 암호화 기법으로 해시함수를 이요해서 고정된 길이의 암호화된 문자열로 바꿔버리는 것
매핑 후 데이터의 값
서로 다른 키가 같은 해시가 되는 경우를 해시 충돌(hash collision)이라고 한다.
특징
장점
구분 | Object | Map |
---|---|---|
키의 타입 | string,symbol | 모든 값 |
크기 | 수동 추적 | 내부 프로퍼티 |
사용 경우 | 적용해야하는 로직이 있는 경우 | 실행히 키를 모르고 모든키와 값들이 동일한 경우 |
구분 | Set | Array |
---|---|---|
중복허용 | O | X |
인덱스 참조 | 불가능 | 가능 |
length 프로퍼티에 대해 수정할 수 있으며, Array.prototype.length는 Setter를 가지고 있고, 이를 수정해서 요소의 개수와 배열의 길이가 다른 희소배열이 생긴다.
Set 생성자를 가지고 생성한 이터러블 객체는 getter 만을 가지고 있어서 읽기 전용이다.
일정시간 간격으로 함수를 실행
window.addEventListener('scroll', throttle(event => {
console.log(event)
}, 400))
일정 시간동한 함수가 실행되지 않으면 함수를 실행합니다.
window.addEventListener('scroll', debounce(event => {
console.log(event)
}, 400))
계속 스크롤을 오르락 내리락 하다가 0.4초간 안하고 있으면 그때 event를 콘솔 로그로 출력한다.
노드(Node): HTML 요소, 텍스트 주석 등 모든 것을 의미
요소(Element): HTML 요소를 뜻한다.
<div class="parent">
<!-- 주석 -->
<div class="child">1</div>
텍스트1
<div class="child">2</div>
텍스트2
</div>
const parentEl = document.querySelector('.parent')
// 부모 요소의 모든 자식 노드 확인!
console.log(parentEl.childNodes)
// NodeList(7) [text, comment, text, div.child, text, div.child, text]
// 부모 요소의 모든 자식 요소 확인!
console.log(parentEl.children)
// HTMLCollection(2) [div.child, div.child]
노드의 부모 요소를 반환한다.
const el = document.querySelector('.child')
console.log(el.parentElement) // <div class="parent">...</div>
자신을 포함한 요소중 'CSS 선택자'와 일치하는 가장 가까운 요소를 반환한다. 요소를 찾지 못하면, null을 반환한다.
const el = document.querySelector('.child')
console.log(el.closest('div')) // <div class="child">1</div>
console.log(el.closest('body')) // <body>...</body>
console.log(el.closest('.hello')) // null
요소의 이전 형제 혹은 다음 형제 요소를 반환한다.
const el = document.querySelector('.child')
console.log(el.previousSibling) // '\n '
console.log(el.nextSibling) // '텍스트1'
요소의 모든 자식 요소를 반환한다.
const el = document.querySelector('.parent')
console.log(el.children) // HTMLCollection(2) [div.child, div.child]
요소의 첫번째 자식 혹은 마지막 자식요소를 반환한다.
const el = document.querySelector('.parent')
console.log(el.firstElementChild) // <div class="child">1</div>
console.log(el.lastElementChild) // <div id="child2" class="child">2</div>
<div class="parent">
<!-- 주석 -->
<div class="child">햄버거1</div>
치즈버거
<div id="child2" class="child">감자튀김2</div>
양념감자
</div>
메모리에만 존재하는 새로운 html요소를 생성해 반환한다
const divEl = document.createElement('div')
console.log(divEl) // <div></div>
const inputEl = document.createElement('input')
console.log(inputEl) // <input>
지정된 여러 노드를 대상 요소의 첫번째 혹은 마지막 자식으로 삽입한다.
요소.prepend(노드1, 노드2)
요소.append(노드1, 노드2)
const parentEl = document.querySelector('.parent')
const el = document.createElement('div')
el.textContent = '싸이버거3'
parentEl.prepend(new Comment(' 주석 '))
parentEl.append(el, '맛있어요!')
//햄버거1
//치즈버거
//감자튀김2
//양념감자
//싸이버거3
//맛있어요!
요소를 제거합니다.
const el = document.querySelector('.child')
el.remove()
//치즈버거
//감자튀김2
//양념감자
'대상 요소'의 지정한 위치에 '새로운 요소'를 삽입한다.
대상_요소.insertAdjacentElement(위치, 새로운_요소)
각 위치는 다음과 같다
<!-- 'beforebegin' -->
<div class="target">
<!-- 'afterbegin' -->
Content!
<!-- 'beforeend' -->
</div>
<!-- 'afterend' -->
const childEl = document.querySelector('.child')
const newEl = document.createElement('span')
newEl.textContent = '주문할게요~'
childEl.insertAdjacentElement('beforebegin', newEl)
/*
주문할게요~
햄버거1
치즈버거
감자튀김2
양념감자
*/
.child는 햄버거1이고 해당 요소의 beforebegin 에 생성하기 때문에 위쪽에 '주문할게요~'가 생기는 것이다!
'주어진 노드' 가 '노드'의 자신을 포함한 후손인지 확인한다.
노드.contains(주어진_노드)
const parentEl = document.querySelector('.parent')
const childEl = document.querySelector('.child')
console.log(parentEl.contains(childEl)) // parentEl 에 childEl이 있니? true
console.log(document.body.contains(parentEl)) // body 내부에 parentEL이 있니? true
console.log(document.body.contains(childEl)) // body 내부에 childEl이 있니? true
console.log(document.body.contains(document.body)) // body 에 body가 있니? true
console.log(parentEl.contains(parentEl)) // parentEl 에 parentEl이 있니? true
console.log(parentEl.contains(document.body)) // parentEl에 body가 있니? false
console.log(childEl.contains(document.body)) // childEl에 body가 있니? false
노드의 모든 텍스트를 얻거나 변경한다
const el = document.querySelector('.child')
console.log(el.textContent) // '햄버거1'
el.textContent = '싸이버거'
console.log(el.textContent) // '싸이버거'
요소의 모든 HTML 구조를 하나의 문자로 얻거나, 새로운 HTML구조를 삽입한다
const el = document.querySelector('.parent')
console.log(el.innerHTML)
el.innerHTML = '<span style="color: red;">햄버거~</span>'
내용이 전부 지워지고 '햄버거~'만 남는다
요소의 각 data-
속성 값을 얻거나 지정한다.
const el = document.querySelector('.child')
const str = '엄청 맛있는 햄버거'
const obj = {a: 1, b: 2 }
el.dataset.helloWorld = str
el.dataset.object = JSON.stringify(obj)
console.log(el.dataset.helloWorld) // '엄청 맛있는 햄버거'
console.log(el.dataset.object) // '{"a":1,"b":2}'
console.log(JSON.parse(el.dataset.object)) // { a: 1, b: 2 }
요소의 태그 이름을 반환한다
const parentEl = document.querySelector('.parent')
const childEl = document.querySelector('.child')
const el = document.createElement('span')
console.log(parentEl.tagName) // 'DIV'
console.log(childEl.tagName) // 'DIV'
console.log(el.tagName) // 'SPAN'
console.log(document.body.tagName) // 'BODY'
요소의 di
속성 값을 얻거나 지정한다
const el = document.querySelector('.child')
console.log(el.id) // ''
el.id = 'child1'
console.log(el.id) // 'child1'
console.log(el) // <div class="child" id="child1">1</div>
요소의 class
속성 값을 얻거나 지정한다.
const el = document.querySelector('.child')
console.log(el.className) // 'child'
el.className += ' child1 active'
console.log(el.className) // 'child child1 active'
console.log(el) // <div class="child child1 active">1</div>
요소의 class
속성 값을 제어한다
.add(): 새로운 값을 추가
.remove(): 기존 값을 제거
.toggle(): 값을 토글
.contains(): 값을 확인
const el = document.querySelector('.child')
el.classList.add('hamburger')
console.log(el.classList.contains('hamburger')) // true
el.classList.remove('hamburger')
console.log(el.classList.contains('hamburger')) // false
el.addEventListener('click', () => {
el.classList.toggle('hamburger')
console.log(el.classList.contains('hamburger'))
})