serialize
값을 문자열로 직렬화해요.
const serialized = serialize(value);사용법
serialize(value)
값을 문자열로 변환하고 싶을 때 serialize를 사용하세요. 내장 JSON.stringify()와 다르게, Map이나 Set, Date, RegExp와 같은 내장 객체나 BigInt 같은 값도 직렬화할 수 있어요.
{ a: 1, b: 2 }나 { b: 2, a: 1 }처럼 구조가 같은 값은 항상 같은 값으로 안정적으로 직렬화돼요.
import { serialize } from 'es-toolkit/util';
serialize({ b: 2, a: 1 });
// "{'a':1,'b':2}"를 반환해요
serialize({ a: 1, b: 2 }) === serialize({ b: 2, a: 1 });
// true를 반환해요
serialize([1, 2n, 'a', { k: 1 }]);
// "[1,2n,'a',{'k':1}]"를 반환해요
serialize(new Set([3, 1, 2]));
// 'Set[1,2,3]'을 반환해요
serialize(
new Map([
['b', 2],
['a', 1],
])
);
// "Map{'a':1,'b':2}"를 반환해요
serialize(new Date(0));
// "Date('1970-01-01T00:00:00.000Z')"를 반환해요
serialize(new Uint8Array([1, 2, 3]));
// 'Uint8Array[1,2,3]'을 반환해요각 타입은 다음과 같이 직렬화돼요.
| 타입 | 입력 | 결과 |
|---|---|---|
| 문자열 | 'abc' | "'abc'" |
| 숫자 | 123 | "123" |
-0 | "0" | |
NaN | "NaN" | |
Infinity | "Infinity" | |
| 불리언 | true | "true" |
undefined | undefined | "undefined" |
null | null | "null" |
BigInt | 123n | "123n" |
| 심볼 | Symbol('a') | "Symbol('a')" |
| 객체 | { a: 1 } | "{'a':1}" |
| 배열 | [1, 'a'] | "[1,'a']" |
| 함수 | function sum(a, b) {} | "sum:function sum(a, b) {}" |
| 네이티브 함수 | Math.max | "max:[native]" |
Date | new Date(0) | "Date('1970-01-01T00:00:00.000Z')" |
RegExp | /ab+c/gi | "RegExp(/ab+c/gi)" |
Set | new Set([3, 1, 2]) | "Set[1,2,3]" |
Map | new Map([['a', 1]]) | "Map{'a':1}" |
| TypedArray | new Uint8Array([1, 2, 3]) | "Uint8Array[1,2,3]" |
new BigInt64Array([1n, 2n]) | "BigInt64Array[1n,2n]" | |
ArrayBuffer | new Uint8Array([1, 2]).buffer | "ArrayBuffer[1,2]" |
Error | new TypeError('boom') | "Error(TypeError: 'boom')" |
entries()가 있는 객체 | new URLSearchParams('a=1') | "URLSearchParams{'a':'1'}" |
클래스 인스턴스는 클래스 이름과 함께 직렬화돼요. 인스턴스에 toJSON 메서드가 있으면 toJSON의 결과를 직렬화해요.
class User {
name = 'Alice';
}
serialize(new User());
// "User{'name':'Alice'}"를 반환해요함수는 이름:소스 형태로 직렬화돼요. 코드 포매팅에 따라 결과가 달라지지 않도록 소스의 줄바꿈과 주변 공백은 제거돼요. 소스를 확인할 수 없는 네이티브 함수는 이름:[native]로 직렬화돼요.
function sum(a, b) {
return a + b;
}
serialize(sum);
// 'sum:function sum(a, b) {return a + b;}'를 반환해요
serialize(Math.max);
// 'max:[native]'를 반환해요순환 참조는 #ref{n} 형태의 백레퍼런스로 직렬화돼요. n은 객체를 처음 방문한 순서예요.
const obj = {};
obj.self = obj;
serialize(obj);
// "{'self':#ref0}"을 반환해요Promise, WeakMap, Blob처럼 의미 있게 직렬화할 수 없는 객체는 TypeError를 던져요.
serialize(new WeakMap());
// TypeError: Cannot serialize WeakMap보안에 민감한 용도로는 사용하지 마세요
serialize는 성능을 위해 문자열이나 키를 이스케이프하지 않아요. 그래서 의도적으로 서로 다른 값이 같은 문자열로 직렬화되도록 악의적인 입력을 만들 수 있어요. 일반적인 용도의 캐시 키나 변경 감지에 사용하고, 보안이 중요한 곳에는 사용하지 마세요.
파라미터
value(unknown): 직렬화할 값.
반환 값
(string): 직렬화된 문자열.
에러
(TypeError): Promise, WeakMap, WeakSet, Blob, DataView처럼 직렬화할 수 없는 객체가 포함되어 있으면 에러가 발생해요.

