Javascript

2022년 4월 30일 수정

Javascript

자바스크립트(Javascript)는 웹 브라우저에서 동작하는 스크립트 언어다. 뭔가 부족한 듯한 소개지만 사실상 모든 것을 대변하는 말이다. 물론 현재는 웹 브라우저 뿐만 아니라 엔진만 떼어내면 뭐든 할 수 있는 플랫폼으로 인식될 정도로 많이 쓰이는 언어이기도 해서 이 정의는 틀렸지만 말이다.

이 글에서는 Javascript 뿐만 아니라 ECMAScript를 함께 다룬다. 개념 상 이 둘은 다르게 취급하는 것이 맞겠지만, 현재로써 이 둘을 별도로 생각하는 것도 좀 이상한 것 같기도 하다. 버전은 ES6(ES2015)를 기준으로 한다.

모듈(Module)

일반적으로 모듈은 아래와 같은 형식으로 쓰인다.

// someModule.js
export const name = 'some value';

// someCode.js
import { name } from 'someModule.js';

이름 자체를 주지 않고 default로 export 한 경우라면 이름을 마음껏 지을 수 있다.

// someModule.js
export default 'default value';

// someCode.js
import anyName from 'someModule.js';

이 두 가지 방식을 섞어서 쓸 수도 있다.

// someModule.js
export const name = 'some value';
export default 'default value';

// someCode.js
import anyName, { name } from 'someModule.js';

위에서 알 수도 있겠지만, 당연하게도 모듈은 여러 심볼을 가질 수 있다.

// someModule.js
export const value1 = 'some value 1';
export const value2 = 'some value 2';

// someCode.js
import * as someValues from 'someModule.js';
console.log(someValues.value1);
console.log(someValues.value2);

튜플 비슷한 문법

Python의 튜플(Tuple)과 비슷한 문법을 발견해서 메모한다.

let [foo, bar] = [1, 2]
[foo, bar] = [bar, foo]

무슨 문법인지 아직 이름은 모르겠다. 하여간 덕분에 중간 매개체 없이 교환(swap) 구현이 가능해졌다.

웹 브라우저 DOM 관련

요소 얻기

document.getElementById('some-id')
document.getElementsByClassName('some-class')[0]
document.getElementsByTagName('tag-name')[0]

메서드 이름에서 elements와 element의 차이, 즉 복수와 단수의 차이를 잘 구분하자.

특정 블록에 HTML 넣기

아래는 some-id라는 아이디의 div 블록 내부 내용을 HTML 태그로 지정하는 예제다.

document.getElementById('some-id').innerHTML = '<some-html>...</some-html>'

보다시피 그냥 plain text로 HTML을 써넣으면 된다.

콘텐츠 높이 구하기

웹 브라우저에 표시되는 내용의 높이(height)를 구하는 방법이다.

document.getElementsByTagName('body')[0].clientHeight

물론 특정 element를 선택해서 할 수도 있다.

document.getElementById('some-block').clientHeight

clientHeight 말고 offsetHeight 도 비슷한 용도로 사용 가능한 듯 하다.

특정 태그 앞에 요소 넣기

수동으로 노드를 만들어서 특정 태그 노드 앞에 붙이는 예제다.

let targetElement = document.getElementById('target')
let newElement = document.createElement('div')
newElement.innerHTML = 'HTML CONTENT'
newElement.className = 'some-class'

targetElement.parentNode.insertBefore(newElement, targetElement)

좀 더 쉬운 방법도 있다.

document.getElementById('target').insertAdjacentHTML('beforebegin', 'HTML CONTENT')

beforebegin 이 위치를 가리키는 의미인데 별도의 상수 정의는 없는 것 같다. 참고로 afterbegin, beforeend, afterend 등 다양한 위치를 지정할 수 있다.

기타 팁

오브젝트 값 복제

오브젝트를 레퍼런스 복제가 아닌 값 복제를 하려면 structuredClone 을 사용할 수 있다.

let dupObj = structuredClone(origObj);

네이티브 API이기 때문에 특정 브라우저에서는 동작이 안 될 가능성도 있음에 주의하자. 하지만 별도의 외부 의존성 없이 완벽한 값 복제가 가능하다는 장점은 무시할 수 없다.