자바스크립트 완벽가이드 11장에 해당하는 부분이고, 읽으면서 자바스크립트에 대해 새롭게 알게된 부분만 정리한 내용입니다.
WeakMap은 Map 클래스의 변형이고, 이 클래스는 키 값이 가비지 컬렉션에 포함되지 않게 막아주지 않는다.
→ 키 값이 WeakMap에 존재하더라도 메모리를 회수할 수 있다.
일반적인 Map은 키 값을 '강하게' 참조하며 키 값에 대한 다른 참조가 더 이상 남아 있지 않더라도 참조 관계를 유지한다.
WeakMap의 특징
이 WeakMap의 설계의도는 메무리 누수를 방지하면서 객체와 값을 연결할 수 있게 하는것!
WeakSet의 특징
WeakSet은 객체가 가비지 컬렉션에 포함되도록 허용하는 객체 세트이며 Set() 생성자와 비슷하게 동작하지만 다른 부분이 있다.
ES6에 도입한 형식화 배열(typed array)은 C나 자바의 저수준 배열과 꽤 비슷하다.
이 배열은 웹 브라우저가 WebGL 그래픽을 지원하기 시작하면서 클라이언트 사이드 자바스크립트에 처음 도입되었다.
형식화 배열의 특징
생성자 | 숫자 타입 |
---|---|
Int8Array() | 부호 붙은 바이트 |
Uint8Array() | 부호 없는 바이트 |
Uint8ClampedArray() | 롤오버 없는 부호 없는 바이트 |
Int16Array() | 부호 붙은 16비트 정수 |
Uint16Array() | 부호 없는 16비트 정수 |
Int32Array() | 부호 붙은 32비트 정수 |
Uint32Array() | 부호 붙은 32비트 정수 |
BigInt64Array() | 부호 붙은 64비트 BigInt 값 (ES2020) |
BigUint64Array() | 부호 없는 64비트 BigInt 값 (ES2020) |
Float32Array() | 32비트 부동 소수점 값 |
Float64Array() | 64비트 부동 소수점 값 (일반적인 자바스크립트 숫자) |
여기서 Uint8ClampedArray는 타입 체크를 따로 수행하여 255보다 크거나 0보다 작은 값을 넘치지 않도록 해당 범위로 잘라낸다(clamp). 이렇게 잘라내는 동작은 HTML
<canvas>
요소가 픽셀 색깔을 조작하는 저수준 API에 꼭 필요하다.
또한 형식화 배열 생성자에는 모두BYTES_PER_ELEMENT
프로퍼티가 있다.(타입에 따라 1, 2, 4, 8중 하나)
const bytes = new Uint8Array(1024);
const pattern = new Uint8Array([0, 1, 2, 3]);
bytes.set(pattern);
bytes.set(pattern, 4);
bytes.set([0, 1, 2, 3], 8);
console.log(bytes.slice(0, 12)); // Uint8Array(12) [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]
const ints = new Int16Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
const last3 = ints.subarray(ints.length - 3, ints.length);
console.log(last3[0]); // 7
형식화 배열을 사용하면 동일한 바이트 시퀀스를 8, 16, 32, 64비트 덩어리로 볼 수 있다. 이런 경우 바이트 순서인 엔디안이 드러나는데 최근 CPU 아키텍처는 리틀 엔디안을 사용하지만 외부 데이터를 사용할 때 일부는 빅 엔디안을 사용하기도 한다.
따라서 이러한 경우 바이트 순서를 명시적으로 지정하는 DataView 클래스를 사용하자.
const bytes = new Uint8Array(1024);
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
let int = view.getInt32(0); // 바이트 0에서 빅 엔디안 부호 붙은 정수를 읽는다.
int = view.getInt32(4, false); // 다음 정수 역시 빅 엔디안
int = view.getUint32(8, true); // 다음 정수는 리틀 엔디안이고 부호는 없다.
view.setUint32(8, int, false); // 빅 엔디안 형식으로 바꾼다.
JSON.stringify()와 JSON.parse()의 목적은 데이터를 보낼때 반드시 문자열로 변환(직렬화)하고 역직렬화를 하기 위함인데, 비효율적이지만 두 함수를 사용해 다음과 같이 객체를 깊게 복사할 수 있다.
function deepCopy(o) {
return JSON.parse(JSON.stringify(o));
}
자바스크립트 국제화 API는 Intl.NumberFormat, Intl.DateTimeFormat, Intl.Collator 세가지 클래스로 구성된다.
Intl.NumberFormat은 숫자 형식을 적용할 지역의 인자와 숫자 형식을 더 자세히 지정하는 객체 이 2가지 인수를 받아 사용한다.
지역마다 다른 숫자 표기법을 위한 API이다.
const euros = Intl.NumberFormat('es', { style: 'currency', currency: 'EUR' });
console.log(euros.format(10)); // 10,00 €
const data = [0.05, 0.75, 1];
const formatData = Intl.NumberFormat(undefined, {
style: 'percent',
minimumFractionDigits: 1,
maximumFractionDigits: 1
}).format;
console.log(data.map(formatData)); // [ '5.0%', '75.0%', '100.0%' ]
Intl.DateTimeFormat, Intl.Collator
각각 날짜 형식과 문자열 비교부분에서 위와 유사하게 사용된다.